« .jgz と .js.gz と Apache の設定 | Main | Stage6.DivX と HD と あけおめ »

透過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 を外しました。
こちらにまとめました。

TrackBack

TrackBack URL for this entry:
http://blog.l-xs.com/cgi-bin/mt/mt-tb.cgi/234

Listed below are links to weblogs that reference 透過PNG と IE と IE7:

» 透過PNGをCSSで背景に指定してIE6や5.5のバージョンでも綺麗に表示してみる from デザインウォーカー | DesignWalker - ロサンゼルスで働くウェブデザイナーの日記
この方法を使えば透過PNGをIE6以下のバージョンで綺麗に表示することができるので、デザインの幅もグッと広がることだと思うのですが。。。問題は。。。この方法では、imgタグに入れら... [Read More]

Comments

こんにちはコメント失礼致します。DesignWalkerさんのサイトを参考させていただき、pngfix.jsファイルを使って透過PNGをIE6以下のバージョンで綺麗に表示する方法を試してみたのですが、読み込み途中にPNG画像が一瞬色化けを起こしてしまいます。
それからこのスクリプトを使用した場合、画像のレイアウトが少しだけずれてしまうのです。
ご参照下さい・・・http://www.kamuirecordings.com/main.htm

何か原因/対策をご指示いただければ幸いです。宜しくお願い致します。

コメントどうもです。
見せて頂きましたが、pngfix.js は、私の iepngfix.js とは違いますね。
せっかくなので、私の解る範囲でお答えします。
一瞬色化けするのは、スクリプトが適応される前の生のPNGファイルなので、IE6ではしょうがないです。
レイアウトが崩れるのは、pngfix.js に問題があるのと、ブラウザによってデフォルトのCSSが異なる為です。
ちなみに、スクリプトが無い場合と、iepngfix.js でもやって見ましたが、pngfix.js 程ではないですが、若干ずれます。
対策ですが、iepngfix.htc または iepngfix.js を使いつつ、CSSでマージンやパディングをきちんと設定してみてください。

Post a comment

(If you haven't left a comment here before, you may need to be approved by the site owner before your comment will appear. Until then, it won't appear on the entry. Thanks for waiting.)