親子関係にある要素にopacityを適用した場合のブラウザ間による動作の違いについて。
この違いはbackground-colorではなく、border-colorのopacityの差異についてまとめたものです。
以下のような階層構造の要素があるとします。
<div class="test outer"> <div class="test inner"> <div class="test core"></div> </div> </div>
これに以下のCSSを適用します。
*{margin:0;padding:0;}
body{background-color:#fff}
.test{
background-color:blue;
border: 10px solid red;
filter: alpha(opacity=50);
-moz-opacity:0.5;
opacity:0.5;
}
.test.outer{
margin:10px;
width:60px;
height:60px;
}
.test.inner{
width:40px;
height:40px;
}
.test.core{
width:20px;
height:20px;
}
上記の表示結果:

要素の background-color を transparent にしてみる
例).test{background-color:transparent}
上記CSSで設定した要素のbackground-colorを透明にするか、あるいは削除すると以下のような表示になります。
要素のbackground-colorを指定しない場合の表示結果:

IEでは個々に設定されたopacityで表示される。
つまり、親子関係はopacityに反映されない。
bodyのbackground-colorを変えてみる
body{background-color:#000}
bodyのbackground-colorを黒色に設定すると以下のような表示になります。
bodyのbackground-colorに黒色を指定した場合の表示結果:

図を見て分るとおり、Chromeでは明らかに色がおかしくなる。
このような違いがあることを知っておかないとJavascriptやCSSでborderとopacityが関係したトリックを行う際にハマるので注意。
IEも他のブラウザと同じように見せる方法はないか試してみた
CSSで行うのは面倒なのでjQueryを使用して以下のように処理してみた。var $w = $(document.body),
opacity = 0.8,
bw = 10,
hw = 100;
for(var i = 0; i < 5;i++){
var $x = $('<div>').css({
opacity:opacity,
border:'10px solid #ff0000',
height:hw,
width:hw
}).appendTo($w);
hw -= bw*2;
$w = $x;
if($.browser.msie) opacity *= opacity;
}
表示結果:

IEの場合だけ以下のように処理する。
if($.browser.msie) opacity *= opacity;
上記でopacityを「0.8」としたのはサンプルを多くしたかったため。
「恐らくこれでいけるだろう」と安易に考えたが...
どうもIEでは端数を切り捨てているっぽい。
同じように表示させるのは無理かもしれない。
私はここで挫折。





0 Comments:
コメントを投稿