レイヤーとSelectタグ

javascriptで生成したレイヤーがドロップダウン(Selectタグ)に重なると、
いくらzindexを指定してもドロップダウンが上に表示されてレイヤーが隠れてしまう。
(IEのみ)

はまったので書いておく。

http://jp.bea.com/dev2dev/pub/a/2005/4/portal_menus..html

原因その1


IEを開発する際、HTMLのSELECT要素の実装として、コンボボックス(ウィンドウコントロール)の
Windowsにおける既存の実装を使用するようにしました。さらに、ActiveX、Flash、Adobe PDF
ビューアなどの他の埋め込みオブジェクトは、ウィンドウコントロールとして実装されています。

原因その2

問題が発生するのは、HTML要素のzIndexとウィンドウコントロールのzIndexは扱いが異なり、
IEでは常にウィンドウコントロールがすべてのHTML要素の上に配置されるためです。

#マイクロソフトふざけるなと。

対策


IE 5.5以上では、IFRAME要素のzIndexは、ウィンドウコントロールとHTML要素の両方で処理されます。
つまり、SELECTの上にIFRAMEを配置することができ、IFRAMEはSELECTウィンドウコントロールを
覆います。さらに、DIVをIFRAMEの上に配置することができ、DIVの下にあるIFRAMEまたはSELECTが
透過して表示されることはありません。

ということで、iframeの上にレイヤーを生成しろと。
(レイヤーに重なるselectを非表示にする手もあるかも)

=======================================================
以下参考例

<html>
<head>
<style type=”text/css”>
<!–
#area1{
width:300px;
position:absolute;
display:none;
z-index:20;
}
#area_dummy {
width:300px;
position:absolute;
display:none;
z-index:10;
}
–>
</style>
<script type=”text/javascript”>
<!–
function showArea() {
var isMSIE = /*@cc_on!@*/false;

var objArea1 = document.getElementById(‘area1’);
var objAreaDummy = document.getElementById(‘area_dummy’);
objArea1.style.display = ‘block’;

// IEの場合、selectとの重なりを考慮してダミーのiframeを表示
if(isMSIE == true) {
objAreaDummy.style.display = ‘block’;
// 高さを合わせる
objAreaDummy.style.height = objArea1.offsetHeight;
}

//実際にはポジション決めをここに
}
// –>
</head>
<body>

<input type=”button” value=”レイヤー表示” onclick=”showArea()”>

<div id=”area1″></div>
<iframe frameborder=”0″ framespacing=”0″ id=”area_dummy”></iframe>

</body>
</html>

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA