透過PNG と IE と IE7
DesignWalker の管理人さんにお願いして、
AoD ! に新たに透過PNGを使ったデザインのテンプレートを追加してもらいました。
透過PNGは、透過GIFと違って透過部分がAlpha処理されて影とかが綺麗なんですね。
でも、IE7以前のIEではCSSでIE独自拡張のfilterを使ったりしないとならなくて、結構面倒かったりします。
そう思っていたら、簡単な解決方法を発見したので、早速試してみました。
使い方は、iepngfix.htc というスクリプトを用意して、
下記のようなスタイルを、使いたいページのスタイルシートに追加するだけ!
<style type="text/css">
* html .iepngfix {
behavior: url(iepngfix.htc);
}
</style>
* html が付いているのは、IE5.5 とか IE6 にだけ適応させる CSS Hack ですね。
そして、ここでは iepngfix というクラス名がついている 透過PNG が使われている画像に対して htc というスクリプトを適応させています。
しかも、背景画像に透過PNGが使われていても透過にしてくれます!
セレクタに img や div とかを指定してもいいのですが、全ての要素でスクリプトが動くので重くなってしまいます。
ので、なるべく 透過PNGが使われている要素にクラス名を指定すると良いでしょう。
ただし!
※この htc は、ページと同じドメイン/サーバーに無いとエラーになってしまいますので注意が必要です。
※この htc のソースの中にある blankImg の指定行は自分のサーバー内のファイルに書き換えないとなりません。
換えなくても、myselfArchiverさんのところで上手く動いているみたいですね。
でも、出来れば換えて下さい。(2007/01/11 追記)
※指定する要素には、必ず、width と height を指定しないと、変な大きさに変換されることがあります。
さて、でもこれでは上記問題により、AoD !のようないろんなサイトで使用されるスクリプトでは使えません。
各サイトで iepngfix.htc をセットしなければならなくなってしまいます。
そこで、新たな方法を思いついたので、試してみました。
それは、iepngfix.htc を iepngfix.js に改造(+改良)して、
behavior: url(iepngfix.htc);
の代わりに、
behavior: expression(IEPNGFIX.fix(this));
というように、expression() を使う方法です。
expression() は CSS内でJavaScriptを使用して動的にスタイル指定出来るIEの拡張機能です
。
普通は expression()の中にJavaScriptを書くのですが、外部ファイルの関数も呼べます!
<script src="iepngfix.js" charset="utf-8" type="text/javascript"></script>
<style type="text/css">
* html .iepngfix {
behavior: expression(IEPNGFIX.fix(this));
}
</style>
これを AoD ! に内蔵しました。
めでたし。めでたし。
と思ったら、通常の使用ではOKだけど、AoD ! のように、
1.透過PNGを動的に差し替えたりした場合、IEPNGFIX.fix() を再度呼んであげる必要があります。
2.透過PNGを背景にしたエリアを動的にロードするような場合は、
ロード後に IEPNGFIX.fixchild() を適宜呼んでやらないと、リンクやイベントがうまく動かないケースがあるようです。
IE7で逆に問題が発生!
透過PNGの使われている要素に対してフェードイン/フェードアウトのエフェクタをかけると、
エフェクトしている間透過にならない!
IE6だといいのにぃ~。
IE7は余計なことをしてくれよりましたっ。
参考
IE PNG Fix v1.0 RC4
IE7 Transparent PNG Implementation
あと、上記サイトに面白いのがあったので、ご紹介。
PNG Alpha Mask Demo
鳥をドラッグして太陽の周りを飛ばすと、影が。。。
【追記:2007/02/13】
IE7の時も強制的に
behavior: expression(IEPNGFIX.fix(this));
すると、フェードイン/フェードアウトしても透過することが解りました!!
ということで、iepngfix.js をバージョンアップ(v1.2→v1.3)し、スタイルシートから * html を外しました。
こちらにまとめました。
Comments
こんにちはコメント失礼致します。DesignWalkerさんのサイトを参考させていただき、pngfix.jsファイルを使って透過PNGをIE6以下のバージョンで綺麗に表示する方法を試してみたのですが、読み込み途中にPNG画像が一瞬色化けを起こしてしまいます。
それからこのスクリプトを使用した場合、画像のレイアウトが少しだけずれてしまうのです。
ご参照下さい・・・http://www.kamuirecordings.com/main.htm
何か原因/対策をご指示いただければ幸いです。宜しくお願い致します。
Posted by: kaz | May 10, 2007 08:58 AM
コメントどうもです。
見せて頂きましたが、pngfix.js は、私の iepngfix.js とは違いますね。
せっかくなので、私の解る範囲でお答えします。
一瞬色化けするのは、スクリプトが適応される前の生のPNGファイルなので、IE6ではしょうがないです。
レイアウトが崩れるのは、pngfix.js に問題があるのと、ブラウザによってデフォルトのCSSが異なる為です。
ちなみに、スクリプトが無い場合と、iepngfix.js でもやって見ましたが、pngfix.js 程ではないですが、若干ずれます。
対策ですが、iepngfix.htc または iepngfix.js を使いつつ、CSSでマージンやパディングをきちんと設定してみてください。
Posted by: ユンサン | May 10, 2007 11:46 PM