밤하늘의 실제별, 나도 가질 수 있다?!


Expression.
인터넷 익스플로러(IE6,7)에서만 사용할 수 있는 CSS 표현입니다.
말도 많고 탈도 많은 녀석이죠.

자바스크립트가 최소단위인 천분의 일초로 작동을 한다면
이녀석은 수천분의 일초 아니 거의 만분의 일초까지도 되는 것 처럼 작동을 합니다.
(직접 세어보지는 않았습니다. 그냥 느낌이에요 느낌상-_-;)
예를 들어,
IE6에서는 표현이 불가능한 postion: fixed 속성을 expression으로 표현하면
스크롤을 겁나 빨리 내리고 올려도 울렁거림 없이 거의 완벽한 동작을 보여줍니다.

어떠한 동작(이벤트)이든 일어나는대로
이 수천분의 일초 간격으로 계속 대기하고 읽어들이고 값을 던져주고 있다는 겁니다.
그래서 브라우저에 부담을 주고 심지어는 브라우저를 멈추거나 셧다운-_- 시켜버린다는
무시무시한 소문을 안고 다니는 녀석이죠.

그래도 IE6에서는 지원되지 않는 수많은 CSS 속성을
expression을 사용하여 자바스크립트 언어로 표현이 가능한
엄청난 강점을 갖고 있어서 외면하려고 해도 가끔은 생각이납니다.-_-;

대략 2년 전인가요.
야후에서 근무하는 어떤 멋진(wow) 분이- (지금은 구글 olleh!)
expression의 살인적인 아니 살브라우저적인 호출을  상당히 줄여줄 수 있는 방법을 제시했습니다.


저 페이지를 처음 보았을 당시 전 이제 막 웹표준의 웹을 시작하고 있었던 터라
"음. 이런게 있군- expression 무서운 녀석." 이라고 그냥 넘기고 말았는데요.

오늘 max-height 때문에 expression을 써야하나 고민을 잠깐 하다가
max-height 같은 경우는 position: fixed 처럼 계속해서 읽어드릴 필요가 없이
페이지 열릴때 한번만 잡아주면 되거든요.
정말로 작동을 하는지, 진짜 차이가 있는건지 궁금해서 테스트 페이지를 한번 만들어 보았습니다.


예제 파일 : http://mkyoon.tomeii.com/expression.html (IE6, 7에서 보셔야 합니다.)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>One-Time Expressions</title>
<style type="text/css">
.onetime {
width: 200px;
padding: 10px;
border: 2px solid #666;
overflow: hidden;
/* 생각없이 쓴 expression */
height: expression( setCntr(), this.scrollHeight > 99 ? "100px" : "auto" );
/* 멋진 아저씨가 추천한 방법 */
/*height: expression(
setCntr(),
new Function('el', 'el.style.height = el.scrollHeight > 99 ? "100px" : "auto";')(this)
);*/
}
</style>
<script type="text/javascript">
//<![CDATA[
var gnExpr = 0;
var gCntrDisplay;
var gbOn = true;

function setCntr() {
gnExpr++;

if ( gbOn ) {
displayCntr();
}

return true;
}

function displayCntr() {
if ( ! gCntrDisplay ) {
gCntrDisplay = document.getElementById("cntrdisp");
}

if ( gCntrDisplay ) {
gCntrDisplay.value = gnExpr;
}
}

function setDisplay(bOn) {
gbOn = bOn;
}

//]]>
</script>
</head>
<body>
<input type="text" size="10" id="cntrdisp" disabled="disabled"/>
<div class="onetime">
(마우스를 움직여보세요.)
우리는 달려간다 이상한 나라로 니나가 잡혀있는 마왕의 소굴로
어른들은 모르는 사차원세계 날쌔고 용감한 폴이 여깄다
마술차 마술봉 딱부리 삐삐 찌찌 힘을 모으자 대마왕 손아귀에 니나를 구해내자
띠이빠빠 띠이빠빠 달려간다 삐삐
</div>
<p>출처 : http://stevesouders.com/hpws/onetime-expressions.php</p>
</body>
</html>

'생각없이 쓴 expression' 부분과
주석처리된 '멋진 아저씨가 추천한 방법'
주석부분을 바꿔서 열어보시면 차이를 바로 알 수 있습니다.
(정말로 딱 1개만 찍히네요. 오우 신기.)


결론 : expression 한번만 실행시키기.
CSSproperty: expression(
new Function('el', 'el.style.CSSproperty = 어쩌구 저쩌구 계산식')(this)
);



하지만 이방법도 완전한 해결책은 아니라고 하네요~
expression 자체가 위험하긴 하나봅니다. IE8에서도 내다버린 녀석이니까요.

Posted by mkyoon

2009/09/04 00:06 2009/09/04 00:06
, , , , , ,
Response
No Trackback , No Comment
RSS :
http://mkyoon.com/rss/response/130

Trackback URL : http://mkyoon.com/trackback/130

Leave a comment

브라우저 별 CSS Hack 모음집


IE6, IE7 에서만 먹는 CSS Hack 과 같이
Firefox에서만 먹는 CSS Hack 을 찾다가 발견한 브라우저 별 Hack 모음집 입니다.
(CSS 3 Validate 통과한다고 합니다. 정말?)

http://tanreisoftware.com/blog/?p=39

/* Target Gecko */
html:not([lang*=""]) #selector {
attribute: value;
}

/* Filter out Gecko */
html[lang*=""] #selector {
attribute: value;
}


그래도 이런 꼼수는 최대한 자제해야죠.
브라우저들이 업그레이드가 될 수록 이런 방법의 핵들은 쓰지 못하게 되어버리니까요.

Posted by mkyoon

2007/12/20 17:12 2007/12/20 17:12
, ,
Response
No Trackback , No Comment
RSS :
http://mkyoon.com/rss/response/81

Trackback URL : http://mkyoon.com/trackback/81

Leave a comment

투명처리된 PNG 파일은 IE 6 에서 회색 바탕으로 나옵니다.
이를 해결하기 위해 PNG를 배경그림으로 넣고
AlphaImageLoader 필터를 씌우는데요.

특수한 경우
필터 먹은 DIV 안에 있는 링크를 아무리 눌러도
클릭이 되지 않는 현상이 생깁니다. (언제나 이상한 IE.)

필터먹인 DIV에
position: relative, absolute 설정을 주면
안에 있는 링크는 무용지물이 되고 맙니다.

해결방법

1. 필터 먹인 DIV에는 position 설정이 없거나 position: static;

2. 그 안에 들어있는 링크(a)에 relative 혹은 absolute 를 주세요.

끗.

Posted by mkyoon

2007/12/03 14:34 2007/12/03 14:34
, , , , ,
Response
No Trackback , No Comment
RSS :
http://mkyoon.com/rss/response/79

Trackback URL : http://mkyoon.com/trackback/79

Leave a comment

보통 브라우저에서 부모 element 의 높이를 지정하면
자식의 높이는 부모의 높이에 그대로 따라가게 마련이다.
 
그러나 IE 6은
부모에 높이를 지정하더라도
자식의 높이를 직접 지정해주지 않으면
자식 element의 영역이 부모 height를 늘여 있는 그대로를 전부 표시한다.

자바스크립트를 이용하여
getElementById 로 부모의 height를 설정하여 지정해야 하는건가
IE 6 하나 때문에 모든 브라우저에서 자바스크립트로 처리를 해줘야 하는건가-_-

IE 의 전용 속성 중에 expression 을 이용하면 해결된다.

#자식selector {
height: expression(document.getElementById('부모id').style.height );
}


하지만 expression사용에 항상 주의해야한다!!

Posted by mkyoon

2007/11/13 13:36 2007/11/13 13:36
, , , ,
Response
No Trackback , No Comment
RSS :
http://mkyoon.com/rss/response/74

Trackback URL : http://mkyoon.com/trackback/74

Leave a comment

Min-Height CSS Hack

오늘도 어김없이 나의 발목을 잡는 IE 6.
min-height 속성을 줄 방법을 찾다가
구글에서 CSS 핵을 발견했다.+_+오예~

selector {
min-height:500px;
height:auto !important;
height:500px;
}


min-height는 해당 속성이 가능한 브라우저에서 동작하고
height: auto; 는 IE에서 important 핵을 써서 IE6 이외 브라우저에서 내용에 따라 늘어나게 되며
height: 500px 은 IE6 에서 500이하로 떨어지지 않게 됨.

한 셀렉터 안에서 같은 속성을 여러번 작성했을 경우
IE6은 가장 마지막에 선언한 녀석을 가져가기 때문에 맨 마지막에 적는다.

만쉐이.

출처 : http://www.dustindiaz.com/min-height-fast-hack/

Posted by mkyoon

2007/10/25 00:25 2007/10/25 00:25
, , , ,
Response
A trackback , 7 Comments
RSS :
http://mkyoon.com/rss/response/71

Trackback URL : http://mkyoon.com/trackback/71

Trackbacks List

  1. html: 박스 세로길이 최소값 고정하기

    Tracked from PC Geek's 2010/01/03 20:41 Delete

    mkyoon님의 블로그에서 알게 된 팁입니다. 해보니 잘 되네요. :) 거기서는 또 여기(www.dustindiaz.com)를 출처로 꼽고 있습니다. 저 링크에서 아래 답글부분도 읽어보면 도움이 됩니다. skin.html 에서 이렇게 하고 <div id="mybox1"> 이런저런 </div> 그리고, style.css 에서는 #mybox1 { min-height:600px; height:auto !important; height:600px; } 이렇..

Comments List

  1. 아마티 2007/10/26 14:58 # M/D Reply Permalink

    IE는 원래 min-height 속성을 지원하지 않는다고 하죠.
    그런데 min-height와 똑같은 속성을 지원하는게 height입니다. 다만 이 속성은 다른 브라우저에서는 높이가 고정되기 때문에 height에 IE핵을 주면 되지 않을까 싶어요. 제가 그렇게 쓰거든요 ^^;;;;

    min-height:500px; _height:500px; 이렇게 쓰면 대부분 작동하더라구요 ^^

    1. mkyoon 2007/10/26 17:04 # M/D Permalink

      굳이 IE핵을 쓰지 않더라도 다른 브라우저에서는 height: auto 로 인식하게 됩니다. important를 선언했기 때문이죠. 그래도 핵을 써서 완전히 배제해버리는 방법도 있었네요^^ 좋은의견 감사합니다.

    2. mkyoon 2008/03/28 13:30 # M/D Permalink

      헉; 지금 보니 윗 글에 약간 잘못된 내용이 있었네요~
      height: auto는 IE에서 읽는다고 써놓았었네요 ㅠㅠ
      아마티님은 그부분을 지적하신 것 같은데, 제가 잘못 이해하고 답변을 달았던 것 같습니다.
      너무 늦었지만 감사드려요~

  2. jsjung 2008/03/27 17:54 # M/D Reply Permalink

    dtd 가 4.01 Transitional 일때는 안되는것 같습니다.
    밑에처럼 하니까 되네요~

    selector {
        min-height:500px;
    height:500px;
        height:auto !important;
    }

    1. mkyoon 2008/03/28 10:36 # M/D Permalink

      IE6에서도 정말 되던가요+_+
      IE6은 하나의 selector 안에 같은 속성이 여러번 정의되어 있을 경우, 마지막에 써있는 것만을 읽어들이기 때문에, jsjung님 말씀대로 하셨다면 분명 높이는 auto로 될 것이고요. 그렇담 height가 300px로 작아질 경우 500px이 아닌 300px로 될것 같은데요~

      여담이지만, DTD설정을 하셨다면 DTD종류와 관계 없이 브라우저는 표준모드로 렌더링을 하기 때문에 거의 같은 모습을 보여주게 됩니다. (strict에서는 속성에 대한 제한이 많아지긴 하지만요~)

      위의 소스는 xhtml 1.0 transitional에서 직접 테스트 해보았고 문제가 없었습니다. 같은 transitional DTD를 쓰시는데 안된다면 뭔가 다른 문제가 있지 않았나~ 조심스럽게 예상해 봅니다.

  3. jsjung 2008/03/31 10:40 # M/D Reply Permalink

    에고..mkyoon님께서 조심스럽게 예상했던 문제가 맞는것 같습니다..ㅎㅎ
    다시 테스트해보니 제대로 랜더링 되네요~..^^
    넘 성급하게 리플을 달았네요~ㅎㅎ

    1. mkyoon 2008/03/31 14:25 # M/D Permalink

      저도 잘못된 내용을 넣은 줄도 모르고 있다가
      jsjung님 덕분에 다시 한번 읽고 발견할 수 있었습니다ㅠㅠ
      jsjung님 정말정말 감사드려요^ㅁ^*

Leave a comment