본문 바로가기

업무이야기

IE11 CSS 선택자 :readonly 작동되지 않는 오류 해결법 (크로스브라우징)

 

 

갑작스럽게 배정된 업무 관리자 페이지에서 처음으로 해결해야 할 오류는 IE11 CSS에서 선택자 :readonly 가 작동되지 않아 적용되어야 할 스타일이 disabled 스타일과 똑같이 나와서 해결해야 했습니다. 말도 많고 탈도 많은 IE11에서는 안되는 것들이 참 많습니다. 지금 생각해봐도 이상한 점은 :disabled를 적용이 되었는데 왜 :readonly 만 적용이 안되었을까 하는 점입니다. 가장 최신 IE11에서 CSS 기본적인 선택자가 작동하지 않는다는 사실이 잘 받아 들 여지 않았지만 검색을 해보니 다른 이들도 겪고 있는 오류였고 그렇게 알아보고 도움을 받은 결과 어찌어찌하여 해결이 된 오류입니다. 

 

제가 시도해 보았던 방법은 두가지가 있습니다. 

 

 

첫 번째는 class를 직접 만들어서 선택자로 스타일을 입히는 대신에 직접 태그에 class를 넣어주는 것입니다. 

 

css

1
2
3
4
5
.read-only {
    background-color: rgba(0, 0, 0, .1);
    color: rgba(0, 0, 0, .4);
    border-color: rgba(0, 0, 0, .2);
}
cs

 

html 

1
2
<input type="text" class="read-only" readonly />
<textarea cols="30" rows="5" readonly> 읽기전용입니다. </textarea>
cs
 

이렇게만 해도 input에 만들어 놓은. read-only class의 스타일이 들어가게 되지만 적용해야 할 input의 개수가 수없이 많은 상황일 경우 일일이 class를 다 넣기 어려울 수 있습니다. 저는 이미 만들어진 페이지들에 적용이 되어야 했으므로 일일이 태그에 class를 넣어줘야 하는 것은 좋은 방법이 아니었습니다.  때문에 아래와 같은 jQuery를 사용하면 readonly 속성을 가지고 있는 모든 input에 readonly class가 붙게 됩니다.  'addClass'를 사용해서 read-only class가 자동으로 붙게 됩니다.  급할 때 가끔 사용할 수도 있을 것 같습니다.

 

jQuery

1
2
3
4
5
$('input[readonly], textarea[readonly]').each(
    function(){
        $(this).addClass('read-only');
    }
);
cs

 

두번째 방법은 CSS 선택자만으로 해결하는 방법입니다. 구글링 하다가 찾게 된 방법입니다. 

 

css 

 

1
2
3
4
5
6
7
8
9
10
11
input[readonly='readonly'] {
    background-color: rgba(0, 0, 0, .1);
    color: rgba(0, 0, 0, .4);
    border-color: rgba(0, 0, 0, .2);
}
 
textarea[readonly='readonly'] {
    background-color: rgba(0, 0, 0, .1);
    color: rgba(0, 0, 0, .4);
    border-color: rgba(0, 0, 0, .2);
}
cs

 

 

html ▼

 

1
<input type="text" readonly="readonly" />
cs

 

이렇게 처리하면 일일이 class를 input이나 textarea에 넣을 필요 없이도 IE11에서도 잘 나오게 됩니다. html은 꼭 위와 같이 readonly="readonly"가 아닌 readonly만 있어도 잘 적용이 되는 것 같습니다. 하지만 위와 같이 사용할 때 주의하셔야 할 사항이 있습니다. 흔히 코드의 중복을 막기 위해서 아래와 같은 방식으로 코드를 사용하게 되는데 저도 초반에 아래 코드처럼 한 번에 적어 주었더니 스타일이 적용되지 않아 안 되는 방법인 줄 알았습니다. 하지만 위와 같이 따로따로 써주니 IE11에서 적용이 되었습니다. 중복된 코드가 보기 좋지 않지만 이미 개발이 그려진 상태에서 스크립트 적용이 어려워 후자를 최선의 선택으로 해결이 되었습니다.

 

스타일 적용이 되지 않았던  CSS

 

1
2
3
4
5
6
input[readonly='readonly'],
textarea[readonly='readonly'] {
    background-color: rgba(0, 0, 0, .1);
    color: rgba(0, 0, 0, .4);
    border-color: rgba(0, 0, 0, .2);
}
cs

 

중복코드만 아니라면 두 번째 코드가 좋은 코드인 것 같습니다. 

조금이나마 도움이 되는 포스팅이 되셨길 바랍니다. 

반응형