IE6でウィンドウ全体を覆うブロック要素を作る

Lightbox、Thickboxなどの背景の半透明の膜みたいなやつを自作する。


IE6以外はposition: fixedを使うことでできる。


まず、HTMLは以下のような感じ。

<body>
<div id="container">
    ...
    <div class="skin"></div>
</div>
</body>


CSSは、とりあえずIE6以外用に、以下のような感じ。

#container {
    position: relative;
    height: 100%; /* ウィンドウ全体を覆うように。 */
}

.skin {
    position: fixed;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    background-color: #000000;
    opacity: 0.5;
    filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50); /* for IE */
}


<div id="container">を包含ブロックにして、
その上に<div class="skin">をかぶせるような感じ。
包含ブロックはbody要素でもいいかもしれないが、未確認。


ページがロードされたときから膜を張っておく状況は想定し難いので、
Lightbox等を使う場合と同様、ボタンクリック等のアクションの後に表示、というように使うとすると、
JavaScriptで<div class="skin">を追加する。
関数の中身だけ書くと、

var container = document.getElementById("container");
var skin = document.createElement("div");
skin.className = "skin";
container.appendChild(skin);

とかいう感じ。


で、IE6はposition: fixedに対応していないので、
代わりにposition: absoluteを使う。


とりあえず、セレクタハックを使って、

 *html .skin {
    position: absolute;
}

を追加する。


これで一応、膜は張れるが、position: absoluteを使っているので、
ウィンドウサイズを変更というか、というか広げると、
膜の幅、高さが固定のままでウィンドウサイズについていかない。
あるいはスクロールバーが出ている状態だと、
ページをスクロールして隠れていた部分が表示されると、
その部分は膜に覆われない。


ウィンドウサイズについていくようにするために、
また、スクロールバーが出ているときに隠れている部分が、
ページのスクロールによって表示されたときに、その部分を覆うように、
JavaScriptを使ってウィンドウの幅と高さを取得し、
それをwidthとheightに適用する、
というのが考えられるが、
expressionという、CSSの中でJavaScriptを使えるようにする、
IE7までの独自拡張があるので、それを使うとてっとりばやい。
ただし、expressionはセキュリティ上問題があるようなので、
使う場合は注意する。


で、CSSは以下のような感じ。

 *html .skin {
    position: absolute;
    width: experssion(document.documentElement.scrollWidth);
    height: experssion(document.documentElement.scrollHeight);
}


膜に覆われる部分にドロップダウンがあったりすると、
膜の上に出てくるので注意。
IE6では、select要素にz-indexが効かないとか、
そんな話。