CSSテクニック

半透明pngを表示する

pngならgifと違って半透明の画像を作ることも可能です。しかし、IE6ではそのままでは半透明のpng画像を表示することは出来ません。今回のテクニックは、その壁を打ち破るものです。

テクニック使用前(半透明pngをただ指定しただけ)

半透明png

テクニック使用後

半透明png

firefoxと表示の比較をしてみるとわかりやすいです。

やり方

1:HTMLを書く

HTMLはこんな感じになります。

<div class="sample">
<img src="../img/a-png.png" alt="半透明png" width="250" height="200">
</div>

HTML解説

imgタグ一つですませたいところですが、残念ながらそれは無理です。どうしてもdivで囲んであげる必要があります。

2:スタイルシートを書く

スタイルシートはこんな感じになります。

* html div.sample{
    background-image:url(../../img/head-menu-back.gif);
    width:250px;
    height:200px;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader
(src=../img/a-png.png);
}
* html div.sample img{
    display:none;
}

CSS解説

今回のポイントは2つ。一つはスターハックと呼ばれる技法です。スターハックとは「IE6以下」にのみ適用させたいCSSを書くときに利用する物で、「* html 」を適用させたいID/classの前に付け加えることで利用できます。
今回の場合はpngが普通に使えるIE7やfirefoxにはフィルターを適用させないために使っています。

もう1つは赤字のフィルター部分です。このフィルターを使えば、IE6でも半透明のpngを使うことが出来ます。 しかし、このフィルターで読み込んだpng画像は、背景画像のような振る舞いをするので、一工夫必要になります。

まず.sampleの高さと幅を、用意したpng画像と同じサイズに固定します。つづいてフィルターを使ってpng画像を読み込みます。

このままだとimgタグが邪魔してIE6では透明でないpng画像しか見えないので、* html div.sample imgにdisplay:none;を指定してimgタグを非表示にしてしまいます。 こうすることでIE6でのみimgタグが非表示となりフィルターで読み込んだpng画像を表示することが出来ます。

最終的にfirefoxとIE7では普通のpng画像、IE6ではフィルターで読み込んだpng画像が表示され、IE,firefoxともに半透明png画像を表示することが出来ます。

2007/07/10追記
IE7に対応するためにスターハック関連の記述を追加。それに伴い解説も変更


使いこなすための+α

上手く使えば、より高度な表現が可能になると思います。いろいろチャレンジしてみてください。

IE7では半透明png画像をちゃんと読み込めるようになるそうなので、IE7が普及してきたら、CSSからフィルター部分やimgの非表示を取り除いても良いかもしれません。

CSSはファイル一つでいくらでも修正が可能なので、いずれ不具合が修正されて、必要ない部分が出てきてもすぐに削除することが出来ます。


一覧へ戻る


Last Modified 2007-07-10 © きくちゃん 2004 - All Rights Reserved