몇년전까지만 하더라도 무척 괴롭게 IE 6 까지 대응하여 크로스브라우징을 했었는데, windows10 업데이트가 나오면서 IE7, 8을 대응하여 크로스브라우징 할 수 있도록 분위기가 됐다는 것은 개인적으로 축복해야할 일이라고 생각한다. 그래도 포탈사이트나 국가기관 사이트처럼 몇몇 공공기관, 규모가 큰 사이트들은 아직도 고통받고 있는 것 같지만 말이다. (XP를 쓰고 있는 사람이 아직도 있다는 믿기지 않는 사실..)
html5와 웹표준화 정책이 나온지도 꽤 됐다. 지저분한 DOCTYPE 4.* 들과 table, div들은 버리고 html5에 기준한 DOCTYPE을 사용하자. 여기 html5 기준 IE를 대응하기 위해 자주 쓰는 것들을 몇가지 모아봤다.
참고 : https://github.com/afarkas/html5shiv
ie9,8의 경우 header, footer, section 과 같은 html5 태그에 대한 별도 지원이 되지 않아 위 경로의 JS파일이 필요하다.
dist 폴더의 html5shiv.js를 다운로드 한 후 <head></head>부분에 아래 스크립트 소스를 삽입해주면 된다.
<!–-[if lt IE 9]>
<script src=”경로/html5shiv.js”></script>
<![endif]–->
참고 : http://jamesallardice.github.io/Placeholders.js/
input 에서 자주 쓰이는 placeholders를 지원해주기 위해서는 위 경로의 placeholders.min.js를 다운로드 해서 마찬가지로 <head></head>부분에 스트립트를 삽입해주면 된다.
하지만 ie8 이하로는 적용이 되지 않기 때문에 그 이하의 브라우저를 지원해주기 위해선 placeholders를 사용하기보단 <span>같은 요소를 input 요소에 absolute 로 붙여 설명글을 달아주는 것이 안전하다.
<!–-[if lt IE 9]>
<script src="경로/placeholders.min.js"></script>
<![endif]–->
추가 : 브라우저별로 placeholder에 스타일을 부여하려면 아래처럼 webkit 옵션을 추가해주면 된다.
input[type="text"]::-webkit-input-placeholder { /* Chrome/Opera/Safari */color: #adb5bd; }
input[type="text"]::-moz-placeholder { /* Firefox 19+ */ color: #adb5bd;}
input[type="text"]:-ms-input-placeholder { /* IE 10+ */color: #adb5bd;}
input[type="text"]:-moz-placeholder { /* Firefox 18- */color: #adb5bd;}
background-image / background-repeat / background-position 같이 모든 css를 별도로 지정해줘야 한다. 아쉽게도 background-size 는 지원이 되지 않는다..
예) i {background-image:url('이미지'); background-repeat:no-repeat; background-position:0 0;}
요소에 직접 background-image 와 filter를 통한 background-size를 기입하여 제어해줄 수 있다.
하지만 이 방법도 html에 직접 inline css를 기입하는 방법이라 온전한 방법이라곤 할 수 없으므로 사용을 자제해야한다. 뭐 모바일 view의 경우 ie8 이하로 접근하게 되는 경우는 없기 때문에 모바일에선 별 문제가 없으니 pc에서만 사용을 지양하면 된다 생각한다.
참고 : http://css-tricks.com/perfect-full-page-background-image/
<div style="background-image('이미지'); filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='이미지@2X.png', sizingMethod='scale');"></div>
보통 * {box-sizing:border-box} 같이 초기css파일에 삽입하면
padding과 border요소가 영역을 추가로 잡아주는 것을 방지해주기 때문에 유용하게 쓰게 되는데 이 css가 애석하게도 ie7에서는 지원이 되지 않는다.
아래 JS코드를 <head></head>에 넣어주면 된다.
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
<![endif]-->
IE 하위 버전에서는 CSS2문법인 싱글콜론만 지원하기 때문에, 더블콜론이 아닌 싱글콜론을 사용해주면 된다.
참고 : https://code.google.com/p/ie7-js/
/* CSS3 */
::after { }
::before { }
/* CSS 2.1 */
:after{ }
:before { }
<ul>
<li></li>
<li></li>
</ul>
의 경우
css
ul li + li + li {}
와 같이 기입해주면 마지막 요소를 찾아서 css를 넣어주지만 요소갯수가 헷갈릴 우려가 있으므로 나는 주로 .last class 를 마지막요소에 추가한다.
input 요소와 달리 select box에서 css를 부여하기가 까다롭기 때문에 이를 사용하지않고 div와 ul/li를 이용하여 모양을 잡아주고 스타일을 주는 경우도 있지만, 일부분의 경우 select box를 사용해야만 하는 경우도 있다. 이럴 땐 기존 select의 border / background 등 모든 요소를 없애준 후 새로운 스타일을 부여해준단 느낌으로 작업하면 된다.
일단 구조는 아래와 같이 잡아준다.
<div>
<select><option></option></select>
</div>
그다음 기본적인 css에서는..
일단 select를 감싸는 div에 width / height / border / background-color 등 기본적인 css를 부여해준 후
div > select 에는 / 동일한 width / 2px 적은 height / text-indent를 대신하며 화살표 아이콘을 넣어주기 위한 좌우 padding / padding을 위한 box-sizing:border-box 요소 / 기본적인 text-align과 size를 넣고 / border은 none으로 / 그리고 background-image에 arrow.png 아이콘을 삽입 / background-position을 95% 50% 정도로 삽입 / 타 브라우저를 대응하기 위해 -webkit-appearance: none;-moz-appearance: none; 를 추가로 삽입해주면 된다.
여기까지 내가 사용한css를 살펴보면 이렇다.
div {display: inline-block;height: 40px;border: 1px solid #dee2e6;border-radius: 2px;box-sizing: border-box;vertical-align: middle;background-color: #fff;}
div select {padding: 0 24px 0 12px;width: 100%;height: 38px;border: none;box-sizing: border-box;font-size: 14px;text-align: left;background-position:95% 50%;letter-spacing: -1px;-webkit-appearance: none;-moz-appearance: none;}
그리고 ie11 이하부터의 hack을 쓰면서 소소하게 수정을 해주면 되는데
ie8
- div select 에 height:auto 와 padding으로 조정하며 화살표 요소가 가운데로 이쁘게 위치할 수 있도록 조정하면 된다.
ie9
- div select에 margin-top:0 으로 지정하여 자동적으로 먹는 margin-top을 제거하고 padding 을 조정하여 위치를 잡는다.
ie8 /9 동시에
- css 각 요소 뒤에 \0/ hack을 붙여 padding / height:auto / background:none을 붙여준다.
ie10
- div select::-ms-expand 와 같이 select 뒤에 문구를 붙여 arrow 요소를 없애준다.
- select에 margin:0 하여 없애주고 height 값을 div보다 2px 적게 지정해준다.
ie11
- select에 margin:0하여 없애주고 padding을 조정하여 위치를 맞춰준 후 height 마찬가지로 div값보다 2px 적게 지정해준다.
위 값들을 종합하여 hack으로 추가한 css 을 보면 이렇다.
@media \0screen { /* ie 8 hack */
div select {height:auto\0/ !important; padding-top:10px !important}
}
@media screen\0 { /* ie9 hack */
div select {padding-top:4px; margin-top:0 }
}
div select {/*margin-top:4px\0/;*/padding:7px\0/;height:auto\0/;background:none\0/ } /* ie 8/9 hack */
_:-ms-lang(x), div select {margin:0;height:38px} /* ie10 hack */
div select::-ms-expand {opacity:0} /* ie10 hack */
_:-ms-fullscreen, :root div select {margin:0;padding:0 6px 0 12px;height:38px} /* ie11 hack */
... 이렇게 하면 반듯하고 예쁜 select box가 완성된다.
hack에 대한 부연설명은 구글링을 추천.
이 외에도 display:table-cell 이나 border-radius 같은 것들도 ie7 에서는 지원이 안된다. 하루빨리 ie7/8 이하 브라우저가 퇴출..되는 것이 좋지만 그래도 ie7까지의 지원을 해야한다면 각 css의 요소의 지원여부를 잘 살펴보고 페이지의 접근범위를 고려하여 스타일을 지정해주는 것이 좋다.
오늘도 ie와 열심히 싸우며 웹표준에 다가가본다.