ラベル CSS の投稿を表示しています。 すべての投稿を表示

ブラウザ間によるborderのopacityの違い

親子関係にある要素に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では端数を切り捨てているっぽい。
同じように表示させるのは無理かもしれない。

私はここで挫折。

border-width を取得/設定するときに気をつけること

以下のような a要素に囲まれたimg要素はスタイル(CSS)を指定しないとブラウザによっては 2px の border が付けられることがある。

例)

<a href="#"><img src="image.jpg"/></a>

この img 要素の border-width を jQuery で取得し、違いを見てみる。

スタイル(CSS)での border 指定がない場合(defaultの状態)

img 要素の border-width を取得する
alert($('a > img').css('border-width'));
取得結果
IE82px
Firefox3空文字
Chrome空文字


img 要素の border-top-width を取得する
alert($('a > img').css('border-top-width'));
取得結果
IE82px
Firefox32px
Chrome0px

Chrome では default のままでは border は付かない。


CSSで「border:none」指定した場合

img{
  border:none;
}
img要素のborder-widthを取得する
取得結果
IE8medium
Firefox3空文字
Chrome空文字


img要素のborder-top-widthを取得する
取得結果
IE8medium
Firefox30px
Chrome0px


default との違い
  • IE8 で「medium」が返ってくる。
IE Testerというソフトで調べた限りでは medium を返すのは IE8 のみだった。



CSSで「border-width:0」指定した場合

img{
  border-width:0;
}

img要素のborder-widthを取得する
取得結果
IE80px
Firefox3空文字
Chrome空文字


img要素のborder-top-widthを取得する
取得結果
IE80px
Firefox30px
Chrome0px



結論

以上のことから、
  • CSS で border をなくす場合、jQuery で border-width を取得する際のことを考慮するなら、「border:none」ではなく「border-width:0」とするべき。
  • jQuery で border-width を取得する場合、
    「border-(top|right|bottom|left)-width」から値を得ること。

IE8 CSS 2.1 対応ガイドがあるよ

microsoft がInternet Explorer 8 CSS 2.1 対応ガイドを配布していたので、配布先を示しておく。

サイトデザインをしてる人は見ておいた方がイイかも。

新しいブラウザが出るたびにCSS Hackネタが増えるけど、これもそのネタのタネになりそうな匂いがする…

サイト:


配布されている資料:

例えば、以下のようなことが書かれている。
以下 Internet Explorer 8 CSS 2.1 対応ガイド より抜粋

誤った CSS 構文に対しての動作について
<style type="text/css">
body{color: green;} /* 通常のセレクター指定 */
body,,p{color: red;} /* カンマが二つある誤った複数セレクター指定 */
body&p,p,body{color: red;} /* アンド記号を利用した誤った複数セレクター指定 */
</style>

Internet Explorer 8 と Internet Explorer 7 は誤った CSS 構文に対して以下のように動作します。

Internet Explorer 8 の処理 Internet Explorer 7 の処理
body {color: green;} body {color: green;} として処理 body {color: green;} として処理
body,,p {color: red;} 無効なセレクター指定として無視 body {color: red;} として処理
body&p,p,body {color: red;} 無効なセレクター指定として無視 body,p {color: red;} として処理
最終的に適用されるプロパティ body {color: green;} body {color: red;}




英語だけどテストページもあった。
「動作確認して下さい」ってことか。

YUI Compressorを使う

久しぶりに使おうとしたら使い方忘れた...
ググるのも面倒なので、ここに書いておく。

ダウンロードはここから
Download YUI Compressor

Javascriptとcss用に二つbatファイルを作成。

Javascript用

@echo off
java -jar yuicompressor[Version].jar --charset UTF-8 %1 -o min.js

CSS用
@echo off
java -jar yuicompressor[Version].jar --charset UTF-8 %1 -o min.css

D&Dするだけで『min.(js|css)』というファイルが出来上がる。

文字コードの指定は日本語でコメントなんて書いてたりするとエラーが出るので必要。

jsファイルの縮小にオプションの"-v"を加えると「こうした方が良い」みたいな情報がプロンプトに表示されるので利用した方が良いかも。

こんな感じで
@echo off
java -jar yuicompressor-2.4.2.jar --line-break 100 -v --charset UTF-8 %1 -o min.js
pause

変数名や関数名などを短く書き換えてファイルサイズを小さくしてくれるものあるが使わない方が無難。それだけで完結しているものでない限り、大概動かなくなる。

理解できないmarginの表示

「これが仕様」とは理解し難いおかしなmarginの適用例を紹介します。
CSSに触れる機会のある方は知っておいた方が良いかと。これで飯食ってる人にとっては既知かも知れませんが。

htmlでは以下のように、要素(タグ)がネストしていることは珍しいことではないのですが、子要素に指定したmarginが親要素に適用されるのはどうにも理解出来ない。

<div id="Wrap1">
  <div id="Wrap2">
    <div id="Wrap3">
    </div>
  </div>
</div>

上記の構造の要素に対してスタイルを指定してみます。
右の例ではWebページの表示上では一番上となる要素であるWrap3のTopにmarginを10px指定した例です。

IEとその他のブラウザで表示に違いがあります。IEでは子要素に指定したmarginがその親要素のみ影響されますが、その他のブラウザでは子要素が属する親要素全てが影響されます。


Wrap3の親要素であるWrap2,その親要素であるWrap1にまでmarginが適用されています。もちろんWrap2,Wrap1にはmarginは指定していません。これだけでも理解できないのですが、更にWrap2にborderを指定するとWrap2とWrap1にmarginが適用されなくなるということです。

IEではmarginを指定してるWrap3までmarginが無効になっています。

IEでは例の如く、他のブラウザとは異なる表示をします。それを含めてこのborderを指定するとmarginが無効になることがあるということをどれだけ知られているのでしょうか。

Sony Style(ソニースタイル)
デル株式会社

Recent Posts