IE Conditional Comments 필터링

W3C의 규격에 의거하여 CSS 코드를 작성하더라도, 각각의 웹 브라우저마다 웹 페이지가 다르게 출력되는 문제가 있습니다. 이러한 문제는 브라우저들이 CSS 규격을 조금씩 서로 다르게 해석하고 출력할 뿐더러, 몇몇 규격은 전혀 출력하지 못하기 때문에 발생합니다.

이처럼 브라우저가 CSSW3C 규격과 다르게 출력하거나, 전혀 출력하지 못하는 문제를 CSS 출력 버그(CSS Rendering Bug)라고 합니다. CSS 출력 버그는 표준을 준수하여 웹 페이지를 제작할 때 가장 큰 걸림돌이 됩니다. W3C 규격 외에도 각각의 웹 브라우저들의 CSS 출력 현황에 대해서도 이해해야 하며, 이러한 버그들을 잡는 방법까지 파악해야 하기 때문입니다.

IE7, FF1~2, Opera9, Safari처럼 최근에 출시된(morden) 웹 브라우저들은 W3C 규격에 맞춰서 CSS를 출력합니다. 문제는 IE6, NN7 이하의 오래된 브라우저들이죠. 특히 높은 브라우저 시장 점유율을 기록중인 IE6 브라우저의 CSS 출력 버그들이 큰 문제입니다.

이러한 CSS 출력 버그들을 CSS Hack과 Filtering으로 대처할 수 있습니다. 예전에는 CSS Hack을 많이 사용했으나, IE7이 출시된 이후로는 CSS Filtering을 주로 사용합니다. 특히 사용이 간단하고 MS에서 추천하는 방법인 IE Conditional Comments Filtering(IE CC-필터링)을 가장 많이 사용합니다.

IE CC-필터링 소개

IE Conditional Comments은 MS에서 제시한 방법으로 MS IE5 이상의 브라우저에서 사용할 수 있습니다. 이 방법을 이용하면 IE 버전에 따라 HTML 코드를 숨기거나 보일 수 있습니다. 사용자의 IE 버전 별 조건(Condition)을 HTML의 주석(comments)의 구조로 필터링하는 방법기에 IE-CC 필터링이라고 하며, 간단하게 IE-CCF라고 합니다.

아래의 코드를 이용하면 ie7only.css를 IE7에서만 사용할 수 있습니다.

<!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="ie7only.css">
<![endif]-->

IE CC-필터링을 사용하는 이유

IE6 이하의 브라우저는 CSS 선택자(selector)에 접근하지 못하는 문제가 있습니다. 이 점을 이용해서 IE6 이하의 브라우저에 특정한 CSS를 추가하거나 숨기는 방법이 바로 CSS Hack입니다. 하지만 CSS2 규격에 정의된 대부분의 선택자를 이용할 수 있는 IE7이 출시되면서, 기존에 사용해왔던 대부분의 CSS Hack들 사용할 수 없게 됐습니다. 이 때문에 최근엔 대부분 웹 개발자와 디자이너들이 브라우저의 CSS 출력 버그를 대처하기 위해서 CSS Filer를 사용합니다.

물론, IE CC-필터링은 HTML에 문법에 맞지 않고 불필요한 코드를 추가하는 문제점이 있습니다. 이에 어떤 개발자는 JS를 이용해서 브라우저의 종류와 버전을 판별하는 방법을 이용하기도 합니다. 하지만 JS를 이용한 방법은 IE CC-필터링보다 코드가 길고 복잡할 뿐더러, DOM으로 접근하기엔 브라우저 파싱 순서가 늦어서 출력되는데 문제가 발생합니다. 즉, CSS 출력 버그를 처리하는데 IE CC-필터링이 최선은 아니지만, 현재로써 가장 확실한 차선책입니다.

IE CC-필터링 사용법

IE Conditional Comments은 HTML 주석 구조에, IE의 조건문을 포함합니다. IE 조건문은 IE의 버전과 상하관계, 부정조건 등을 사용할 수 있습니다.

<!--[if 조건]>HTML 코드<![endif]-->

조건문에 사용할 수 있는 요소

Item Example Comment
IE [if IE] The only currently supported feature is the string "IE", corresponding to Internet Explorer.
value [if IE 7] An integer or floating point numeral corresponding to the version of the browser. Returns a Boolean value of true if the version number matches the browser version. For more information, see Version Vectors.
! [if !IE] The NOT operator. This is placed immediately in front of the feature, operator, or expression to reverse the Boolean meaning of the expression.
lt [if lt IE 5.5] The less-than operator. Returns true if the first argument is less than the second argument.
lte [if lte IE 6] The less-than or equal operator. Returns true if the first argument is less than or equal to the second argument.
gt [if gt IE 5] The greater-than operator. Returns true if the first argument is greater than the second argument.
gte [if gte IE 7] The greater-than or equal operator. Returns true if the first argument is greater than or equal to the second argument.
( ) [if (IE 7)] Subexpression operators. Used in conjunction with boolean operators to create more complex expressions.
& [if (gt IE 5)&(lt IE 7)] The AND operator. Returns true if all subexpressions evaluate to true
| [if (IE 6)|(IE 7)] The OR operator. Returns true if any of the subexpressions evaluates to true.
true [if true] Always evaluates to true.
false [if false] Always evaluates to false.

IE CC-필터링 예제

IE7일 경우 ie7only.css를 사용

<!--[if IE 7]>
  <link rel="stylesheet" type="text/css"  href="ie7only.css">
<![endif]-->

IE이 아닐 경우 non-IE.css를 사용

<![if !IE]>
  <link rel="stylesheet" type="text/css"  href="non-ie.css">
<![endif]>

IE7 이하일 경우 ieOld.css를 사용

<!--[if lt IE7]>
  <link rel="stylesheet" type="text/css" href="ieOld.css">
<![endif]-->

IE일 경우 IE.js를 사용하고, IE7 이하일 경우 IE-old.css를 사용

<![if IE]>
	<script type="text/JavaScript" src="http://hooney.net/js/ie.js"></script>
	<!--[if lt IE7]>
		<link rel="stylesheet" type="text/css" href="ie-old.css">
	<![endif]-->
<![endif]-->

위에서 소개한 IE CC-필터링 외에도, 다양한 방법의 필터링 방법이 있습니다. Communis에서 CSS만을 이용하거나, HTML을 함께 이용하거나, 또는 JS를 이용하여 필터링하는 방법을 확인할 수 있습니다.

참고 URI

이런 황당한 시츄에이션이..

CSS 2.1는 Pseudo-Class Selectors(사이비 클래스 선택자)를 지원하고 있다. 대표적으로 링크에 자주 사용하는 :link, :hover, :visited 가 있으며, 인풋에 사용하는 :focus와 :active 가 있다.

이 녀석들을 잘 활용하면 다이내믹한 사이트를 쉽게 만들 수 있지만, 현재 IE(버전 6 이하)에서는 a(링크에 사용하는 놈)에서만 이녀석들을 지원하고 있기에 현실적으로 사용하기 어렵다.

이중에서 가장 많이 사용하는 사이비 클래스 선택자가 hover인데, 현재로써는 이에 대한 제대로된 Hack을 찾기 어렵다. (ie7 스크립트가 해결해준다는 소문은 있지만, ie7을 이용해서 제작된 사이트를 방문한 경험이 없음)

오늘 웹서핑 중에 :hover를 이용한 배경색을 조절하는 사이트를 발견했다. 지금까지 확인했던 모든 사이트들이 IE에서는 이런 :hover 기능이 무력화되곤 했는데, 이번 사이트는 달랐다.

이 미묘한 컬러의 변화를 보라.

스타일부스터라는 사이트인데, IE의 마진과 관련된 핵을 사용하는 것 외에 특별히 다른 스크립트를 사용하지 않았음에도 불구하고 IE에서 .클래스이름:hover를 랜더링하고 있다.

이 것은 충분히 놀라운 사실이다. 특별히 hack을 사용하지 않고도 IE의 :hover 문제를 해결할 수 있다는 것은, 에릭 마이어의 CSS Drop Down Menus (well with javacript for IE)을 구현할때 JS를 사용할 필요도 없어지기 때문이다. (이와 관련된 내용은 A List Apart에도 소개되고 있음)

혹시라도 이 사이트에서 :hover 관련 해법을 발견한 분이라면, 꼭 답글로 제게 방법을 가르쳐 주시면 감사~하겠습니다. :)

Flickr 이미지를 블로그에서 쉽게 사용하기

플릭커는 매력중에 하나는 이미지들을 쉽게 RSS로 긁어 올 수 있는 점이다. Flickr 홈페이지에서 클릭 몇번으로 간단하게 이미지들을 긁어올 수 있는 방법을 제공하고 있다. 테터툴이나 워드프레스와 같은 설치형 블로그툴 뿐만 아니라 홈페이지도 사용 가능하다. 국내에도 이와 유사한 서비스가 있으면 얼마나 좋을까? ㅜ.ㅜ

플릭커에서 제공해주는 방법은 복잡한 테이블 레이아웃으로 이미지를 긁어오기 때문에, 그동안 나는 WP Flickr-RSS 플러그인을 사용했었다. 하지만 이 또한 역시 불러오는 방법이 1개로 제약되는 문제가 있었다. 다른 플러그인을 찾다가 결국은 Flickr에서 제공해주는 코드를 직접 수정해 보았다.

http://Hooney.net 첫화면의 우측에서 Flickr 이미지를 긁어올 때 사용한 HTML :

Flickr images

나는 이미지를 보여주는 우측부분의 특성 때문에 h2와 div를 사용했다. 이들은 굳이 사용할 필요가 없다. Flickr 자바스크립트의 간단한 규칙을 이용하면, 이미지들을 다양한 방법으로 긁어올 수 있다.

* id=11338328@N00 – 사용자 ID 지정
* count=6 – 긁을 이미지 개수 지정
* display=random – 긁을 방법 지정
* size=square – 긁을 이미지 크기(thumbnail,medium,square) 지정
* raw=1 – 플릭커 링크 안보이기(보이려면 raw=0) 지정

자바스크립트로 긁어온 이미지들을 좀 더 예쁘게 다듬기 위해서 적절히 CSS를 사용했다.

http://Hooney.net 첫화면의 우측에서 Flickr 이미지를 긁어올 때 사용한 CSS :

span.flickr {
	color:#FF0084;
	} /* Flickr의 분홍색(r) */
div.flickr {
	margin:0 10px 15px 10px
	} /* 박스 여백때문에 사용 */
.flickr img{
	width:55px;
	height:55px;
	margin:3px;
	} /* 이미지 크기지정(원래:75px) */
.flickr a img{
	border:1px solid #aaa;
	padding:2px;
	} /* 이미지 외곽선 색 + 여백 */
.flickr a:hover img{
	border-color:#FF0084;
	} /* 마우스를 올렸을떄, 이미지 외곽선의 분홍색 */

Jsvascript와 CSS를 응용하면, 블로그 글에 여러 이미지들을 앨범식으로 나타낼 수 있을 것이다. 플릭커 이미지를 불러오는 다양한 예제는 다음 글에 설명해보련다. ^^;;

앗. 이 방법의 최대 문제는 자바스크립트에 &, = 의 사용으로 인해서 HTML-valiiation을 통과하지 못한다는 것이다. 이 녀석을 사용하기 전까지만 해도 XHTML-stric valiation을 통과했었는데, 이제는 바로 불합격이다. 다른 방법을 생각해봐야 하는가.. ㅠ.ㅠ

워드프레스 Speedup Hack

Blogging Pro에 의하면, 전혀 느끼지도 못했던 사실이지만, 영어에 비해서 다른(한국어 포함) 언어를 사용하는 워드프레스의 속도가 느리다고 한다.

As anyone who uses foreign language support in WordPress 1.5 may have noticed, switching to language to something other than english slows down WordPress. On my server, no request was finished in under 2 seconds.

이에 대한 Hack이 나왔는데, 제작자(독일인으로 추정)의 블로그에 가서 확인해보니 중국인으로 추정되는 다른 블러거들은 이미 사용하고 있는 것 같다.

이에 나도 질 수 없어 트랙백을 날리긴 했는데, 블로그 관리자의 승인이 필요한지 아직 확인이 되진 않는다.

05-04-06제작자 홈페이지에 방문해 보니 트랙백이 걸려 있다. 내가 3번째다. ㅎㅎ


Be Friend~! Be Friend~!