<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DD_belatedPNG &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/dd_belatedpng/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Mon, 30 Sep 2013 01:45:11 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>雑記: PNGと透過とレガシーブラウザ &#8211; 2013年秋</title>
		<link>https://blog.mach3.jp/2013/09/30/alpha-png-and-legacy-browsers.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 30 Sep 2013 01:45:11 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[belatedPNG]]></category>
		<category><![CDATA[DD_belatedPNG]]></category>
		<category><![CDATA[InternetExplorer]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3256</guid>

					<description><![CDATA[最近になってIE6のサポートは減ってきましたが、IE8の息もまた長そうですね。 透過PNGについては以前も記事をしたためた事がありますが、 当時からまた事情も変わってきてると思いますので、ここに昨今の対応に関する雑記など [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>最近になってIE6のサポートは減ってきましたが、IE8の息もまた長そうですね。 透過PNGについては以前も記事をしたためた事がありますが、 当時からまた事情も変わってきてると思いますので、ここに昨今の対応に関する雑記などを記しておきます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-M_u13yQ_nV0/UkhVMLhz3MI/AAAAAAAACNA/BGLeski5_rI/s400/20130930-0.png" alt="雑記: PNGと透過とレガシーブラウザ - 2013年秋"/></figure>



<p></p>



<span id="more-3256"></span>



<dl>
<dt>前提</dt>
<dd>ここで言う「belatedPNG」は<a href="http://www.dillerdesign.com/experiment/DD_belatedPNG/">本家</a>ではなく、<br />
本家をフォークしている「<a href="https://github.com/wakuworks/jquery.belatedPNG/">jquery-belatedpng.js</a>」を指しています</dd>
</dl>



<h2 class="wp-block-heading">「おおきくくずれなければいい」IE6対応</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>「<em>IE6ではおおきくくずれなければいい</em>」</p>
</blockquote>



<p>最近よく聞くようになってきたフレーズですが、つまり「完全にあわせなくてもいいけど一応見えるようにしてね」という事で、 見た目をある程度損なっても許容されるわけです。（と好意的に解釈しましょう。）</p>



<p>ところで、今IE6を使うような人達は、おそらく諸事情があって「致し方なく」使っていて、 きっとそういった方々はWebページで多少の劣化が見られても「致し方なく」思うのではないでしょうか。</p>



<p>そんな前提の元、レガシー環境への対応としては欠かせない透過PNGの話を少々。</p>



<h2 class="wp-block-heading">IE6対応に8bit PNGを採用する</h2>



<p>IE6での透過PNG対応には、<em>8bit PNG</em>という強い味方がいます。 多少見た目を損なってしまうものの、きちんと透過出来るようになります。 実際にどのように見た目が変わるかというと…</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-zvyqwxigXy8/UkhVLw63tlI/AAAAAAAACNA/0lBuy0bNI78/s500/20130930-1-1.png" alt="モダンブラウザ"/></figure>



<p></p>



<p>上が普通のブラウザで表示した8bitの透過PNGです。 わかりやすく背景にタイル状の画像を敷いています。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-lExGnwt59Gc/UkhVLxPm61I/AAAAAAAACNA/TgH7dhKW7j0/s500/20130930-1-2.png" alt="IE6"/></figure>



<p></p>



<p>上が同じ画像をIE6で表示させたものです。 半透過の部分を完全に透過させて表示してしまう為、薄く敷いたドロップシャドウが消えたり、 エッジがギザギザになったりしています。細めの文字などで使用するのは結構厳しそうですが、 画像を選べばきちんと内容は伝わりそうです。</p>



<h2 class="wp-block-heading">8bit PNG制作に便利なpngquant</h2>



<h3 class="wp-block-heading">pngquant — lossy PNG compressor</h3>



<ul class="wp-block-list">
<li><a href="http://pngquant.org/">pngquant — lossy PNG compressor</a></li>
</ul>



<p>pngquantはコマンドラインでPNGを8bitに変換し、最適化する為のツールです。 IE6対策としても有用ですが、PNGを省サイズ化する上でも非常に便利なアプリケーションです。 GUIツールも配布されているので、「黒い画面」が苦手な方は試してみても良いかもしれません。</p>



<p>GUIツールでは、最近は <a href="http://pngmini.com">ImageAlpha</a> がよく知られているようです。 最適化時にpngquant以外のツールも選択できる優れ物です。</p>



<h3 class="wp-block-heading">コマンドラインで pngquant を使ってみる</h3>



<p>ここではコマンドラインでの使い方に軽く触れましょう。</p>


<pre class="wp-block-code"><span><code class="hljs">$ pngquant img/foo.png --iebug
</code></span></pre>


<p>上の処理は、最適化された <em>&#8220;img/foo-ie-fs8.png&#8221;</em> という画像を新たに出力します。 <em>&#8220;&#8211;iebug&#8221;</em> というオプションは、PNGの「ほとんど非透過」の部分を非透過にするので、エッジの劣化を少し抑える事が出来そうです。</p>



<p>接尾辞を付けずに同名で上書きを行いたい場合は、<em>&#8220;&#8211;ext&#8221;</em> オプションと <em>&#8220;&#8211;force&#8221;</em> オプションを使います。 大事な事なのでもう一度いいます。同名ファイルとして上書きします。用法を守って正しくお使いください。</p>


<pre class="wp-block-code"><span><code class="hljs">$ pngquant img/foo.png --iebug --ext .png --force
</code></span></pre>


<p>&#8220;img/&#8221; ディレクトリ内のpng画像をすべて処理したい場合は、ワイルドカードや find コマンドを併用したりします。</p>



<pre class="wp-block-preformatted">$ # img内のPNG画像を全て処理
$ pngquant img/*.png --iebug --ext .png --force
$ # img内のサブディレクトリも再帰的に全て処理
$ find img/ -name "*.png" | xargs pngquant --iebug --ext .png --force
</pre>



<p>GUIではなくCLIを推したのは、クロスプラットフォームである点と、 みんなだいすきな Grunt と連携が取りやすいからです。</p>



<h3 class="wp-block-heading">フィルタを通した8bit PNG</h3>



<p>ちなみに、IE6で8bit PNGをAlphaImageLoaderを通して表示させても見た目は変わりませんが、 VMLのフィルタを通して表示させるとモダンブラウザと同様に綺麗に表示されます。 ある箇所だけ綺麗に見せたかったりする場合は部分的にbelatedPNG等を使用しても良いかもしれません。</p>



<h2 class="wp-block-heading">opacityを変更した際の黒フチの問題</h2>



<p>IE7-8で起こるこの現象については<a href="/2011/02/png-and-opacity-on-explorer.html">以前にも触れましたが</a>、 結局のところAlphaImageLoaderやVMLに頼らざるを得ません。 両者にはそれぞれ特徴があるので、状況によって上手く使い分けましょう。</p>



<p>特に、肝となる透明度の調整で、二者はまったく違う挙動をするので注意が必要です。</p>



<h3 class="wp-block-heading">AlphaImageLoaderへの透明度設定は親要素で</h3>



<p>AlphaImageLoaderをあてた要素に直接 opacity を設定しても動きはするのですが、 ズームを変更すると表示に不具合が生じます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-zPK5PX3LJAs/UkhVMnxcwiI/AAAAAAAACNA/Fxj-EfOV_7Q/s500/20130930-1-3.png" alt="ズームによるAlphaImageLoaderの不具合"/></figure>



<p></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">.demo {
    ...
    filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
        sizingMethod=scale, src=<span class="hljs-string">'sample.png'</span>) alpha(opacity=<span class="hljs-number">50</span>);
    background-color: transparent;
}
</code></span></pre>


<p>上のようなスタイルをあててIE8以下でブラウザのズームを弄ると再現できると思います。 条件は恐らくこんな感じでしょうか。</p>



<ul class="wp-block-list">
<li>AlphaImageLoaderとalphaのフィルターを同じ要素にかけている</li>



<li>その要素のbackground-colorが指定されていないか、transparentだ</li>



<li>ブラウザのズームが100%ではない</li>
</ul>



<p>ズームをいじった状態でフェードイン・アウトなどをかけるとやられてしまいますので、 透明度を弄る場合は親要素に対して行った方が良いでしょう。</p>



<h3 class="wp-block-heading">belatedPNG（VML）への透明度設定はその要素で</h3>



<p>AlphaImageLoaderと違って、どうやらVMLは親要素の透明度を継承しないため、 fixPng() をあてた要素そのものに透明度を設定してあげなければいけません。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"holder"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"foo.png"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
$(<span class="hljs-string">".holder img"</span>).fixPNG();

$(<span class="hljs-string">".holder"</span>).css(<span class="hljs-string">"opacity"</span>, <span class="hljs-number">0.5</span>); <span class="hljs-comment">// 画像の透明度は反映されない</span>
$(<span class="hljs-string">".holder img"</span>).css(<span class="hljs-string">"opacity"</span>, <span class="hljs-number">0.5</span>); <span class="hljs-comment">// 反映される</span>
</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>ブロックまるごとフェードインなどしたい場合は一工夫必要ですね。 楽に一工夫する方法は、<a href="/2013/09/happy-life-with-belatedpng.html">また別のお話</a>。</p>



<h2 class="wp-block-heading">一旦まとめ</h2>



<p>belatedPNGについてもう少し掘り下げる予定でしたが、 長くなりましたのでエントリーを分けることに致しました。</p>



<p>つづきはこちらで。 » <a href="/2013/09/happy-life-with-belatedpng.html">belatedPNGと幸せにくらす為の小さなコツと小技</a></p>



<h2 class="wp-block-heading">追記</h2>



<dl>
<dt>2013/09/30 22:57</dt>
<dd>「-ms-filterの指定は不要では」と助言を頂いたので、該当箇所を削除しています。<br />
cf) <a href="http://sayurin.blogspot.jp/2012/12/ms-filter.html">佐祐理ブログ: -ms-filterは無意味</a></dd>
</dl>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>IEの透過PNG+opacityの不具合を治すメモ</title>
		<link>https://blog.mach3.jp/2011/02/17/png-and-opacity-on-explorer.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 17 Feb 2011 03:01:54 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DD_belatedPNG]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PNG]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1595</guid>

					<description><![CDATA[透過PNGの処理が下手くそなのは、IE6だけではなく、IE7/8も同様です。 IEで透過PNGをあてた要素のopacityを弄ると、周りがグレーがかって汚くなります。 この現象はよく知られていると思いますが、今日はこの不 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>透過PNGの処理が下手くそなのは、IE6だけではなく、IE7/8も同様です。<br />
IEで透過PNGをあてた要素のopacityを弄ると、周りがグレーがかって汚くなります。<br />
この現象はよく知られていると思いますが、今日はこの不具合の治し方のメモを記しておきます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/_JJkNs5Ixl70/TVu-3xR1lSI/AAAAAAAABMM/DOQpFbompG8/201102162110.png" alt="IEの透過PNG+opacityの不具合を治すメモ"/></figure>



<p></p>



<span id="more-1595"></span>



<h2 class="wp-block-heading">サンプルコード</h2>



<p>例えば、こんなコード。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="css">
<span class="hljs-selector-class">.test</span> {
    <span class="hljs-attribute">display</span>:block;
    <span class="hljs-attribute">width</span>:<span class="hljs-number">128px</span>;
    <span class="hljs-attribute">height</span>:<span class="hljs-number">128px</span>;
    <span class="hljs-attribute">background</span>:<span class="hljs-built_in">url</span>(./test.png) <span class="hljs-number">0</span> <span class="hljs-number">0</span> no-repeat transparent;
}
<span class="hljs-selector-class">.test</span><span class="hljs-selector-pseudo">:hover</span> {
    <span class="hljs-attribute">background-image</span>:<span class="hljs-built_in">url</span>(./test-hover.png);
}
</span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"test"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</code></span></pre>


<p>test.pngとtest-hover.pngは透過PNGです。<br />
IE6では当然透過されずに背景がグレーになります。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/_JJkNs5Ixl70/TVu99U1FJqI/AAAAAAAABL8/IkDaUNtWpnI/20110216a.png" alt="IE6は背景がグレーに"/></figure>



<p></p>



<p>IE7,8では綺麗に表示されている様子ですが…</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">".test"</span>).css( <span class="hljs-string">"opacity"</span>, <span class="hljs-string">"0.5"</span> );
</code></span></pre>


<p>このようにfilterのopacityを弄ってやると、下記の画像のような状態になります。キタナイ。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/_JJkNs5Ixl70/TVu99fg5tCI/AAAAAAAABMA/21E-ATnMuv0/20110216b.png" alt="IE7,8ではフチが黒くなる"/></figure>



<p></p>



<h2 class="wp-block-heading">DD_belatedPNGはどうか</h2>



<p>上記の現象はalphaImageLoaderを使えば解決出来るのですが、<br />
alphaImageLoaderはhover時の処理が面倒だったり、遅かったりと問題もあります。<br />
そこで去年ぐらいからもてはやされているDD_belatedPNGを使ってみましょう。</p>



<p><a href="http://www.dillerdesign.com/experiment/DD_belatedPNG/">DD_belatedPNG: Medicine for your IE6/PNG headache!</a></p>



<p>DD_belatedPNGは他の透過PNG用ライブラリと異なり、<br />
alphaImageLoaderを使わずにVMLで透過を実現しているのが特徴。<br />
パフォーマンスも比較的上々のようです。</p>



<h3 class="wp-block-heading">IE8でエラーが出る</h3>



<p>が、困ったことにIE6向けのライブラリであるが為か、<br />
IE8で走らせようとするとエラーが出ます。<br />
今回のお題はIE6～8全てに関わる物なのですが、困りました。</p>



<h3 class="wp-block-heading">jQuery移植版を使用する</h3>



<p>探してみたところ、DD_belatedPNGをjQueryプラグインとして移植した記事を発見。<br />
そこらへんの問題も解決してくださったみたいです。素晴らしい！</p>



<dl>
<dt>該当記事</dt>
<dd><a href="http://wakuworks.jugem.jp/?eid=153">DD_belatedPNG を改造して、jQuery.belatedPNG を作ってみた | プログラマ気分</a></dd>
<dt>リポジトリ</dt>
<dd><a href="https://github.com/wakuworks/jquery.belatedPNG/">wakuworks/jquery.belatedPNG &#8211; GitHub</a></dd>
</dl>



<h2 class="wp-block-heading">jquery.belatedPNG.jsで試してみよう</h2>



<p>jquery.belatedPNG.jsは、<br />
jQueryオブジェクトにfixPng()メソッドを提供します。<br />
こんな感じにしてみる。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">".test"</span>).fixPng().css(<span class="hljs-string">"opacity"</span>,<span class="hljs-string">"0.5"</span>);
</code></span></pre>


<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/_JJkNs5Ixl70/TVu99irjazI/AAAAAAAABME/sqTbHGUerLQ/20110216c.png" alt="jquery.belatedPNG.jsで試してみよう"/></figure>



<p></p>



<p>opacityを設定しても汚くならない！素晴らしい！</p>



<h3 class="wp-block-heading">マウスイベントが効かなくなる問題</h3>



<p>ただ、このままだとa要素に対するマウスイベントが効かなくなってしまう模様。<br />
CSSで設定した:hoverのスタイルも適用されず、<br />
クリックしてもウンともスンともいいません。</p>



<p>なので、子要素に「透明な何か」を入れてあげる事で解決を試みます。 例えば透過Gif。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"test"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"trans.gif"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"128"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"128"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"Foobar"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</code></span></pre>


<p>これでマウスイベントがきちんと効くようになりました。<br />
hoverのスタイルも適用されます。</p>



<p>もしくは、同サイズの透明要素を中にappendしてやったり。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">var</span> $test = $(<span class="hljs-string">".test"</span>);

<span class="hljs-comment">// opacityに非対応なブラウザに適用</span>
<span class="hljs-keyword">if</span>( !$.support.opacity ){
    $test.fixPng()
    .append(
        $(<span class="hljs-string">"&lt;span&gt;"</span>).css({
            display : <span class="hljs-string">"block"</span>,
            width : $test.width(),
            height : $test.height(),
            backgroundColor : <span class="hljs-string">"#ffffff"</span>,
            opacity : <span class="hljs-number">0</span>,
            cursor : <span class="hljs-string">"pointer"</span>
        })
    );
}

$test.css( <span class="hljs-string">"opacity"</span>, <span class="hljs-string">"0.5"</span> );
</code></span></pre>


<h2 class="wp-block-heading">まとめ</h2>



<p>
  jQueryのプラグインでfadeIn/fadeOut等を使うとopacityが弄られますが、<br /> その影響でこの不具合に遭遇する事があるので注意したいですね。
</p>



<p>
  マウスイベントの件は、他に良い解決策あったら知りたいです！
</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
