- 浏览: 902909 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
qunhua1861:
我已做好准备,让您无可挑剔。白癜风常识http://www.4 ...
创业路上之谢谢王磊何公道丁凯李亚平黄小润张小兵 -
qunhua1861:
给我一份信任,还您一身健康。白癜风常识http://m.400 ...
创业路上之无尽感谢 -
qunhua1861:
以我真心、关心、耐心,换您放心、安心、舒心。<a hre ...
《博客园精华集》web标准分册第2论筛选结果文章列表 -
saieuler:
真的吗??
物理运动模拟引擎 -
saieuler:
每次都是学会了,过段时间又忘了
记录KMP算法,记录其经典之处。。。
如何在页面中使用透明图片和透明背景图片(附demo下载)
<p class="descriptionArea">
本文将讲解和讨论:<strong>如何在页面中使用透明图片效果</strong>的几种方法和实现,以及他们的优缺点。
</p>
<h2>从一个广告位讲起</h2>
<div class="floatRPic">
<img alt="图片透明" src="http://images.cnblogs.com/cnblogs_com/justinyoung/2008_3q/toumingLogo.gif"><h6>透明图片</h6>
</div>
<p>虽然有种很对不起大家的感觉,但是依然在博客的导航栏顶端放置了一个广告位。为了不使那些讨厌的广告破坏了整体的博客风格,我使用了一个巧妙的广告位外壳——一个小女孩在一块画布上画画的样子。这样无论广告位中的广告多么令人恶心和讨厌,也都在浏览者可承受的范围之内。因为一块画布上,那个小女孩应该想画什么都可以吧。</p>
<p>为了达到效果,我需要一个背景透明的小女孩站浮在广告之上,这样看上去广告外壳便能更好的与广告融合在一起。于是这里牵扯到了一个问题:如何在网页上使用透明图片?</p>
<h2>jpg——靠边站</h2>
<p>让我们先来说说在网页上经常使用的图片格式——gif、jpg(jpeg)、png,当然用flash也能达到展现图片的效果。至于什么其他的bmp等等,估计没有几个人会用在网页上,所以不在本文的讨论范围之内。</p>
<p>事实证明:gif、png和flash文件在网页上都可以表现出透明效果。而jpg却是无论如何都无法在网页中表现出透明效果(至少我不会,呵呵~)。所以,在本文中,我们只能对jpg图片文件说:“对不起,请您老人家靠边站!”</p>
<div class="floatMPic">
<img alt="jpg图片透明" src="http://justinyoung.cnblogs.com/images/cnblogs_com/justinyoung/2008_3q/touming02.gif"><h6>jpg无法在在网页中表现出透明效果</h6>
</div>
<p>注:其实背景透明的图片,在保持为jpg文件的时候就已经有了背景颜色,而不是在浏览器对jpg文件渲染的时候出现了什么问题。所以,在网页上使用背景透明的jpg基本上是不太可能了。</p>
<p>所以,要想使用背景透明的图片,只能寄希望在gif和png,以及flash上面了。</p>
<h2>gif——宝刀有刺</h2>
<p>在IE6一家独大、flash还没有大行其道的年代里,要想使用背景透明的图片效果,gif几乎是唯一的选择。即便是现在,使用gif达到透明效果,如果在要求不是很高的前提下,依然是个不错的选择。原因很简单——简单、方便。</p>
<p>但是,gif透明背景图片也有个致命的缺点——图片边框有<del>白色的</del>(谢谢10楼zjfeiye的补充)“毛刺”。所以如果你的图片所在的网页区域,网页背景颜色不是白色的话,那就会非常“惨不忍睹”。</p>
<div class="floatMPic">
<img alt="gif图片透明" src="http://justinyoung.cnblogs.com/images/cnblogs_com/justinyoung/2008_3q/touming03.gif"><h6>gif背景透明的图片虽然能达到透明效果,但是效果不理想</h6>
</div>
<h2>png——新生力量</h2>
<p> 作为新生力量的png图片格式,背景透明这样的小把戏,自然不再话下。所以在IE7以上的IE浏览器中,以及FireFox、Opera、Safari浏览器都能出色的完成任务,谷歌浏览器中,自然也是没有任何问题。可问题就在IE6浏览器中,在IE6这群遗老遗少中,完全不买png的帐,无论你是怎么的好,怎么的强,在我IE6里,就是不行。所以——png背景透明的图片,在IE6会失去透明背景,而已非常丑陋的一陀灰色代替。</p>
<div class="floatMPic">
<img alt="png图片透明" src="http://justinyoung.cnblogs.com/images/cnblogs_com/justinyoung/2008_3q/touming04.gif"><h6>对于PNG透明背景图片,IE6浏览器完全不买账</h6>
</div>
<h2>flash——难说爱你</h2>
<p> 对于用flash来实现图片背景透明效果,虽然浏览器的兼容性上没有什么问题。但是flash的缺点也是一大把——先不说需要装插件,就算是维护和修改成本也的让人衡量一下。当然,如果你们手头有flash的大量资源,这也自当别论。所以这里flash不做重点讨论。只给一段代码,作用是设置flash透明背景——</p>
<div class="csharpcode-wrapper">
<div class="csharpcode">
<pre class="alt"><span class="kwrd"><</span><span class="html">OBJECT</span> <span class="attr">classid</span><span class="kwrd">="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"</span></pre>
<pre class="alteven"><span class="attr">codebase</span><span class="kwrd">="http://download.macromedia.com/pub/shockwave/cabs/flash</span></pre>
<pre class="alt">/swflash.cab#version=5,0,0,0"</pre>
<pre class="alteven"><span class="attr">WIDTH</span>=<span class="attr">550</span> <span class="attr">HEIGHT</span>=<span class="attr">400</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"><</span><span class="html">PARAM</span> <span class="attr">NAME</span>=<span class="attr">movie</span> <span class="attr">value</span><span class="kwrd">="flashName.swf"</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"><</span><span class="html">PARAM</span> <span class="attr">NAME</span>=<span class="attr">quality</span> <span class="attr">value</span>=<span class="attr">high</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"><</span><span class="html">PARAM</span> <span class="attr">NAME</span>=<span class="attr">wmode</span> <span class="attr">value</span>=<span class="attr">transparent</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"><</span><span class="html">PARAM</span> <span class="attr">NAME</span>=<span class="attr">bgcolor</span> <span class="attr">value</span>=#<span class="attr">FFFFFF</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"><</span><span class="html">EMBED</span> <span class="attr">src</span><span class="kwrd">="flashName.swf"</span> <span class="attr">quality</span>=<span class="attr">high</span> <span class="attr">wmode</span>=<span class="attr">transparent</span> <span class="attr">bgcolor</span>=#<span class="attr">FFFFFF</span> <span class="attr">WIDTH</span>=<span class="attr">550</span> <span class="attr">HEIGHT</span>=<span class="attr">400</span> <span class="attr">TYPE</span><span class="kwrd">="application/x-shockwave-flash"</span> <span class="attr">PLUGINSPAGE</span><span class="kwrd">="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version</span></pre>
<pre class="alteven">=ShockwaveFlash"<span class="kwrd">></</span><span class="html">EMBED</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"></</span><span class="html">OBJECT</span><span class="kwrd">></span></pre>
</div>
</div>
<h2>先小结一下</h2>
<p>一种能达到图片背景透明的图片格式我们大致讲解了一下。现在我们来小结一下——</p>
<p>如果你要使用背景透明图片的地方,正巧是网页中的地方背景颜色是白色的,或者你不介意那些小小的“毛刺”的话,纳闷完全可以使用gif背景透明图片。</p>
<p>如果,你能保证你的用户,根本不会使用那些老掉牙的IE6一下版本的浏览器的话,那么你完全可以选用png背景透明图片。</p>
<p>如果,你能保证你的用户,浏览器都安装了flash显示插件,并且手头有大量的会flash的人力资源来制作和维护flash图片的话,那么你可以使用flash背景透明图片。</p>
<p>如果,恰巧上面的三种情况,都不适合你的话,那么恐怕你需要继续向下阅读了。</p>
<h2>中级解决方案</h2>
<p>想想一下:如果我们在IE6中使用gif,而在IE7或者其他浏览器中使用png。那么,就可以达到在任何浏览器下都是透明,而在IE6中“稍有毛刺”这样的较为理想的效果。</p>
<p>这时我们想到了css hack。在要显示图片的地方,我们不使用img标签,而使用div,然后对div设置背景图片,然后大小设置和图片一样大小。这样,我们就可以使用css hack了。方法也很简单——</p>
<div class="csharpcode-wrapper">
<div class="csharpcode">
<pre class="alt"><span class="kwrd"><!</span><span class="html">DOCTYPE</span> <span class="attr">html</span> <span class="attr">public</span> <span class="kwrd">"-//W3C//DTD XHTML 1.0 Transitional//EN"</span> <span class="kwrd">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"><</span><span class="html">html</span> <span class="attr">xmlns</span><span class="kwrd">="http://www.w3.org/1999/xhtml"</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"><</span><span class="html">head</span><span class="kwrd">></span></pre>
<pre class="alteven"> <span class="kwrd"><</span><span class="html">meta</span> <span class="attr">http-equiv</span><span class="kwrd">="Content-Type"</span> <span class="attr">content</span><span class="kwrd">="text/html; charset=utf-8"</span> <span class="kwrd">/></span></pre>
<pre class="alt"> <span class="kwrd"><</span><span class="html">meta</span> <span class="attr">name</span><span class="kwrd">="Keywords"</span> <span class="attr">content</span><span class="kwrd">="YES!B/S!,web标准,杨正祎,博客园,实例代码"</span> <span class="kwrd">/></span></pre>
<pre class="alteven"> <span class="kwrd"><</span><span class="html">meta</span> <span class="attr">name</span><span class="kwrd">="Description"</span> <span class="attr">content</span><span class="kwrd">="这是一个简单YES!B/S!文章示例页面,来自杨正祎的博客,http: //justinyoung.cnblogs.com/"</span> <span class="kwrd">/></span></pre>
<pre class="alt"> <span class="kwrd"><</span><span class="html">title</span><span class="kwrd">></span>YES!B/S!文章示例页面<span class="kwrd"></</span><span class="html">title</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"><</span><span class="html">style</span> <span class="attr">type</span><span class="kwrd">="text/css"</span><span class="kwrd">></span></pre>
<pre class="alt">#testDiv{</pre>
<pre class="alteven"> width:100px;</pre>
<pre class="alt"> height:100px;</pre>
<pre class="alteven"> background:transparent url('png.png') no-repeat;</pre>
<pre class="alt"> _background:transparent url('gif.gif') no-repeat; /*** IE6 css hack ***/</pre>
<pre class="alteven">}</pre>
<pre class="alt"><span class="kwrd"></</span><span class="html">style</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"></</span><span class="html">head</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"><</span><span class="html">body</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"><</span><span class="html">div</span> <span class="attr">id</span><span class="kwrd">="testDiv"</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"></</span><span class="html">div</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"></</span><span class="html">body</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"></</span><span class="html">html</span><span class="kwrd">></span></pre>
</div>
</div>
<p>当然,这个方法也有缺点——需要维护gif和png两个版本的图片。</p>
<p> 至于css hack的相关知识,有兴趣的朋友可以看这篇文章——<a target="_blank" href="http://www.cnblogs.com/justinyoung/articles/892414.html" title="CSS Hack">《实例讲解符合中国特色的和网络现状的实用CSS Hack(附源码)》</a>和<a target="_blank" href="http://www.cnblogs.com/JustinYoung/articles/891782.html" title="CSS hack浏览器兼容一览表">《CSS hack浏览器兼容一览表》</a></p>
<h2>终极解决方案</h2>
<p>如果你洁癖到连IE6中的那些“毛刺”也无法忍受的话。那我们只能拿出终极解决方案了——其实,我们可以通过一些技巧,让IE6也能支持背景透明的PNG图片。这样,png背景透明的唯一缺点——不支持IE6也便克服了。</p>
<p> 还记得我博客中的<a href="http://www.cnblogs.com/JustinYoung/archive/2008/07/21/expression-behavior-in-CSS.html" title="expression和behavior">《实例讲解css中的行为:expression和behavior(附DEMO下载)》</a>这篇文章吗?当时被某高人大骂骗子和忽悠的一篇文章。其实之所以写那篇文章,也是为现在的这里埋下伏笔而已。因为,这个是 IE6支持PNG背景透明的技巧正是使用了那篇文章介绍的一些技术——behavior。下面是一些核心代码,如果你发现看不懂,也完全没有关系。因为,我们只要会使用即可——</p>
<div class="csharpcode-wrapper">
<div class="csharpcode">
<pre class="alt"><<span class="kwrd">public</span>:component></pre>
<pre class="alteven"><<span class="kwrd">public</span>:attach <span class="kwrd">event</span>=<span class="str">"oncontentready"</span></pre>
<pre class="alt"> onevent=<span class="str">"IEPNGFix.process(element, 1)"</span> /></pre>
<pre class="alteven"><script type=<span class="str">"text/javascript"</span>></pre>
<pre class="alt"><span class="rem">// IE5.5+ PNG Alpha Fix v2.0 Alpha 2</span></pre>
<pre class="alteven"><span class="rem">// (c) 2004-2008 Angus Turnbull http://www.twinhelix.com</span></pre>
<pre class="alt"><span class="rem">// This is licensed under the GNU LGPL, version 2.1 or later.</span></pre>
<pre class="alteven"><span class="rem">// For details, see: http://creativecommons.org/licenses/LGPL/2.1/</span></pre>
<pre class="alt"><span class="kwrd">if</span> (!window.IEPNGFix) {</pre>
<pre class="alteven"> window.IEPNGFix = {};</pre>
<pre class="alt">}</pre>
<pre class="alteven"><span class="rem">// This must be a path to a blank image, relative to the HTML document(s).</span></pre>
<pre class="alt"><span class="rem">// In production use I suggest '/images/blank.gif' or similar. That's all!</span></pre>
<pre class="alteven">IEPNGFix.blankImg = <span class="str">'blank.gif'</span>;</pre>
<pre class="alt"><span class="kwrd">if</span> (!IEPNGFix.data) {</pre>
<pre class="alteven"> IEPNGFix.data = {};</pre>
<pre class="alt">}</pre>
<pre class="alteven">IEPNGFix.fix = <span class="kwrd">function</span>(elm, src, t) {</pre>
<pre class="alt"> <span class="rem">// Applies an image 'src' to an element 'elm' using the DirectX filter.</span></pre>
<pre class="alteven"> <span class="rem">// If 'src' is null, filter is disabled.</span></pre>
<pre class="alt"> <span class="rem">// Disables the 'hook' to prevent infinite recursion on setting BG/src.</span></pre>
<pre class="alteven"> <span class="rem">// 't' = type, where background tile = 0, background = 1, IMG SRC = 2.</span></pre>
<pre class="alt"> <span class="kwrd">var</span> h = <span class="kwrd">this</span>.hook.enabled;</pre>
<pre class="alteven"> <span class="kwrd">this</span>.hook.enabled = 0;</pre>
<pre class="alt"> <span class="kwrd">var</span> f = <span class="str">'DXImageTransform.Microsoft.AlphaImageLoader'</span>;</pre>
<pre class="alteven"> src = (src || <span class="str">''</span>).replace(/\(/g, <span class="str">'%28'</span>).replace(/\)/g, <span class="str">'%29'</span>);</pre>
<pre class="alt"> <span class="kwrd">if</span> (</pre>
<pre class="alteven"> src && !(/IMG|INPUT/.test(elm.nodeName) && (t != 2)) &&</pre>
<pre class="alt"> elm.currentStyle.width == <span class="str">'auto'</span> && elm.currentStyle.height == <span class="str">'auto'</span></pre>
<pre class="alteven"> ) {</pre>
<pre class="alt"> elm.style.width = elm.offsetWidth + <span class="str">'px'</span>;</pre>
<pre class="alteven"> elm.style.height = elm.clientHeight + <span class="str">'px'</span>;</pre>
<pre class="alt"> <span class="kwrd">if</span> (elm.currentStyle.display == <span class="str">'inline'</span>) {</pre>
<pre class="alteven"> elm.style.display = <span class="str">'inline-block'</span>;</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">if</span> (t == 1) {</pre>
<pre class="alteven"> elm.style.backgroundImage = <span class="str">'url("'</span> + <span class="kwrd">this</span>.blankImg + <span class="str">'")'</span>;</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> <span class="kwrd">if</span> (t == 2) {</pre>
<pre class="alt"> elm.src = <span class="kwrd">this</span>.blankImg;</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">if</span> (elm.filters[f]) {</pre>
<pre class="alteven"> elm.filters[f].enabled = src ? <span class="kwrd">true</span> : <span class="kwrd">false</span>;</pre>
<pre class="alt"> <span class="kwrd">if</span> (src) {</pre>
<pre class="alteven"> elm.filters[f].src = src;</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> } <span class="kwrd">else</span> <span class="kwrd">if</span> (src) {</pre>
<pre class="alt"> elm.style.filter = <span class="str">'progid:'</span> + f + <span class="str">'(src="'</span> + src +</pre>
<pre class="alteven"> <span class="str">'",sizingMethod="crop")'</span>;</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> <span class="kwrd">this</span>.hook.enabled = h;</pre>
<pre class="alt">};</pre>
<pre class="alteven">IEPNGFix.process = <span class="kwrd">function</span>(elm, init) {</pre>
<pre class="alt"> <span class="rem">// Checks the onpropertychange event (on first 'init' run, a fake event)</span></pre>
<pre class="alteven"> <span class="rem">// and calls the filter-applying-functions.</span></pre>
<pre class="alt"> <span class="kwrd">if</span> (</pre>
<pre class="alteven"> !/MSIE (5\.5|6)/.test(navigator.userAgent) ||</pre>
<pre class="alt"> <span class="kwrd">typeof</span> elm.filters == <span class="str">'unknown'</span></pre>
<pre class="alteven"> ) {</pre>
<pre class="alt"> <span class="kwrd">return</span>;</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">if</span> (!<span class="kwrd">this</span>.data[elm.uniqueID]) {</pre>
<pre class="alteven"> <span class="kwrd">this</span>.data[elm.uniqueID] = {</pre>
<pre class="alt"> className: <span class="str">''</span></pre>
<pre class="alteven"> };</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> <span class="kwrd">var</span> data = <span class="kwrd">this</span>.data[elm.uniqueID],</pre>
<pre class="alt"> evt = init ? { propertyName: <span class="str">'src,backgroundImage'</span> } : <span class="kwrd">event</span>,</pre>
<pre class="alteven"> isSrc = /src/.test(evt.propertyName),</pre>
<pre class="alt"> isBg = /backgroundImage/.test(evt.propertyName),</pre>
<pre class="alteven"> isPos = /background(Pos|Rep)/.test(evt.propertyName),</pre>
<pre class="alt"> isClass = !init && ((elm.className != data.className) &&</pre>
<pre class="alteven"> (elm.className || data.className));</pre>
<pre class="alt"> <span class="kwrd">if</span> (!(isSrc || isBg || isPos || isClass)) {</pre>
<pre class="alteven"> <span class="kwrd">return</span>;</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> data.className = elm.className;</pre>
<pre class="alt"> <span class="kwrd">var</span> blank = <span class="kwrd">this</span>.blankImg.match(/([^\/]+)$/)[1],</pre>
<pre class="alteven"> eS = elm.style,</pre>
<pre class="alt"> eCS = elm.currentStyle;</pre>
<pre class="alteven"> <span class="rem">// Required for Whatever:hover - erase set BG if className changes.</span></pre>
<pre class="alt"> <span class="kwrd">if</span> (</pre>
<pre class="alteven"> isClass && (eS.backgroundImage.indexOf(<span class="str">'url('</span>) == -1 ||</pre>
<pre class="alt"> eS.backgroundImage.indexOf(blank) > -1)</pre>
<pre class="alteven"> ) {</pre>
<pre class="alt"> <span class="kwrd">return</span> setTimeout(<span class="kwrd">function</span>() {</pre>
<pre class="alteven"> eS.backgroundImage = <span class="str">''</span>;</pre>
<pre class="alt"> }, 0);</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="rem">// Foregrounds.</span></pre>
<pre class="alteven"> <span class="kwrd">if</span> (isSrc && elm.src && { IMG: 1, INPUT: 1 }[elm.nodeName]) {</pre>
<pre class="alt"> <span class="kwrd">if</span> ((/\.png/i).test(elm.src)) {</pre>
<pre class="alteven"> <span class="kwrd">this</span>.fix(elm, elm.src, 2);</pre>
<pre class="alt"> } <span class="kwrd">else</span> <span class="kwrd">if</span> (elm.src.indexOf(blank) == -1) {</pre>
<pre class="alteven"> <span class="kwrd">this</span>.fix(elm, <span class="str">''</span>);</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="rem">// Backgrounds.</span></pre>
<pre class="alteven"> <span class="kwrd">var</span> bgSrc = eCS.backgroundImage || eS.backgroundImage;</pre>
<pre class="alt"> <span class="kwrd">if</span> ((bgSrc + elm.src).indexOf(blank) == -1) {</pre>
<pre class="alteven"> <span class="kwrd">var</span> bgPNG = bgSrc.match(/url[(<span class="str">"']+(.*\.png[^\)"</span><span class="str">']*)[\)"'</span>]/i);</pre>
<pre class="alt"> <span class="kwrd">if</span> (bgPNG) {</pre>
<pre class="alteven"> <span class="kwrd">if</span> (<span class="kwrd">this</span>.tileBG && !{ IMG: 1, INPUT: 1 }[elm.nodeName]) {</pre>
<pre class="alt"> <span class="kwrd">this</span>.tileBG(elm, bgPNG[1]);</pre>
<pre class="alteven"> <span class="kwrd">this</span>.fix(elm, <span class="str">''</span>, 1);</pre>
<pre class="alt"> } <span class="kwrd">else</span> {</pre>
<pre class="alteven"> <span class="kwrd">if</span> (data.tiles && data.tiles.src) {</pre>
<pre class="alt"> <span class="kwrd">this</span>.tileBG(elm, <span class="str">''</span>);</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">this</span>.fix(elm, bgPNG[1], 1);</pre>
<pre class="alteven"> <span class="kwrd">this</span>.childFix(elm);</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> } <span class="kwrd">else</span> {</pre>
<pre class="alt"> <span class="kwrd">if</span> (data.tiles && data.tiles.src) {</pre>
<pre class="alteven"> <span class="kwrd">this</span>.tileBG(elm, <span class="str">''</span>);</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> <span class="kwrd">this</span>.fix(elm, <span class="str">''</span>);</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> } <span class="kwrd">else</span> <span class="kwrd">if</span> ((isPos || isClass) && data.tiles && data.tiles.src) {</pre>
<pre class="alt"> <span class="kwrd">this</span>.tileBG(elm, data.tiles.src);</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">if</span> (init) {</pre>
<pre class="alteven"> <span class="kwrd">this</span>.hook.enabled = 1;</pre>
<pre class="alt"> elm.attachEvent(<span class="str">'onpropertychange'</span>, <span class="kwrd">this</span>.hook);</pre>
<pre class="alteven"> }</pre>
<pre class="alt">};</pre>
<pre class="alteven">IEPNGFix.childFix = <span class="kwrd">function</span>(elm) {</pre>
<pre class="alt"> <span class="rem">// "hasLayout" fix for unclickable children inside PNG backgrounds.</span></pre>
<pre class="alteven"> <span class="kwrd">var</span> tags = [</pre>
<pre class="alt"> <span class="str">'a'</span>,</pre>
<pre class="alteven"> <span class="str">'input'</span>,</pre>
<pre class="alt"> <span class="str">'select'</span>,</pre>
<pre class="alteven"> <span class="str">'textarea'</span>,</pre>
<pre class="alt"> <span class="str">'button'</span>,</pre>
<pre class="alteven"> <span class="str">'iframe'</span>,</pre>
<pre class="alt"> <span class="str">'object'</span></pre>
<pre class="alteven"> ],</pre>
<pre class="alt"> t = tags.length,</pre>
<pre class="alteven"> tFix = [];</pre>
<pre class="alt"> <span class="kwrd">while</span> (t--) {</pre>
<pre class="alteven"> <span class="kwrd">var</span> pFix = elm.all.tags(tags[t]),</pre>
<pre class="alt"> e = pFix.length;</pre>
<pre class="alteven"> <span class="kwrd">while</span> (e--) {</pre>
<pre class="alt"> tFix.push(pFix[e]);</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> t = tFix.length;</pre>
<pre class="alt"> <span class="kwrd">if</span> (t && (/relative|absolute/i).test(elm.currentStyle.position)) {</pre>
<pre class="alteven"> alert(<span class="str">'IEPNGFix: Unclickable children of element:'</span> +</pre>
<pre class="alt"> <span class="str">'\n\n<'</span> + elm.nodeName + (id && <span class="str">' id='</span> + id) + <span class="str">'>'</span>);</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">while</span> (t--) {</pre>
<pre class="alteven"> <span class="kwrd">if</span> (!(/relative|absolute/i).test(tFix[t].currentStyle.position)) {</pre>
<pre class="alt"> tFix[t].style.position = <span class="str">'relative'</span>;</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> }</pre>
<pre class="alteven">};</pre>
<pre class="alt">IEPNGFix.hook = <span class="kwrd">function</span>() {</pre>
<pre class="alteven"> <span class="kwrd">if</span> (IEPNGFix.hook.enabled) {</pre>
<pre class="alt"> IEPNGFix.process(element, 0);</pre>
<pre class="alteven"> }</pre>
<pre class="alt">};</pre>
<pre class="alteven"></script></pre>
<pre class="alt"></<span class="kwrd">public</span>:component></pre>
</div>
</div>
<h2>如何使用</h2>
<p>如果代码看不懂,没有关系,我们下面来告诉你如何使用(其实代码也不难看懂,只是判断一些情况,然后使用透明滤镜而已)。我们强烈建议你下载这个<a href="http://files.cnblogs.com/JustinYoung/PNGinIE6.rar" title="打包好的demo">打包好的demo</a>,这样只需要看看demo即可明白。使用办法可以简化为以下三步——</p>
<ul style="margin: 15px 2px 15px 25px;">
<li style="">第一步:拷贝“iepngfix.htc”和“blank.gif”文件到你的项目中</li>
<li style="">第二步:通过适当的选择器,让需要在IE6透明的图片或者需要背景图片透明的容器使用上“behavior: url("iepngfix.htc");”</li>
<li style="">第三步:如果你需要容器的背景图片有透明效果,你还需要在页面中引入iepngfix_tilebg.js脚本(当然,如果你不要使用容器的透明背景图片效果,也可以不引入此js文件) </li>
</ul>
<div class="floatMPic">
<img alt="ie6png" src="http://justinyoung.cnblogs.com/images/cnblogs_com/justinyoung/2008_3q/touming05.gif"><h6>在IE6中png图片和背景图片也能透明了</h6>
</div>
<p>当然,整个解决方案也有其缺点——需要多引用1-2个文件(iepngfix.htc和iepngfix_tilebg.js文件)。所以,最终使用何种方案还需要根据自己的要求而定。</p>
<div class="downloadList">
<h3>相关资源列表</h3>
<ul class="uldownloadList">
<li>
<a href="http://www.cnblogs.com/JustinYoung/archive/2008/07/21/expression-behavior-in-CSS.html" title="实例讲解css中的行为:expression和behavior" target="_blank">实例讲解css中的行为:expression和behavior(附DEMO下载)</a>
</li>
<li class="evenLi"><a target="_blank" href="http://www.twinhelix.com/css/iepngfix/" title="IE6PNG透明效果解决方案">IE6PNG透明效果解决方案</a></li>
<li><a target="_blank" href="http://downloads.cnblogs.com/justinyoung/share/pnginie6/pnginie6.html" title="IE6PNG透明效果解决方案Demo">IE6PNG透明效果解决方案Demo</a></li>
<li class="evenLi"><a target="_blank" href="http://www.cnblogs.com/justinyoung/articles/892414.html" title="CSS Hack">《实例讲解符合中国特色的和网络现状的实用CSS Hack(附源码)》</a></li>
<li><a target="_blank" href="http://www.cnblogs.com/JustinYoung/articles/891782.html" title="CSS hack浏览器兼容一览表">《CSS hack浏览器兼容一览表》</a></li>
<li class="evenLi"> <a href="http://files.cnblogs.com/JustinYoung/PNGinIE6.rar" title="打包好的demo">打包好的demo</a>
</li>
</ul>
</div>
<!--end: downloadList-->
<br><center>
alimama_pid="mm_10056409_242955_3624216";
alimama_titlecolor="0000FF";
alimama_descolor ="000000";
alimama_bgcolor="FFFFFF";
alimama_bordercolor="E6E6E6";
alimama_linkcolor="008000";
alimama_bottomcolor="FFFFFF";
alimama_anglesize="0";
alimama_bgpic="0";
alimama_icon="0";
alimama_sizecode="16";
alimama_width=658;
alimama_height=60;
alimama_type=2;
</center>
本文将讲解和讨论:<strong>如何在页面中使用透明图片效果</strong>的几种方法和实现,以及他们的优缺点。
</p>
<h2>从一个广告位讲起</h2>
<div class="floatRPic">
<img alt="图片透明" src="http://images.cnblogs.com/cnblogs_com/justinyoung/2008_3q/toumingLogo.gif"><h6>透明图片</h6>
</div>
<p>虽然有种很对不起大家的感觉,但是依然在博客的导航栏顶端放置了一个广告位。为了不使那些讨厌的广告破坏了整体的博客风格,我使用了一个巧妙的广告位外壳——一个小女孩在一块画布上画画的样子。这样无论广告位中的广告多么令人恶心和讨厌,也都在浏览者可承受的范围之内。因为一块画布上,那个小女孩应该想画什么都可以吧。</p>
<p>为了达到效果,我需要一个背景透明的小女孩站浮在广告之上,这样看上去广告外壳便能更好的与广告融合在一起。于是这里牵扯到了一个问题:如何在网页上使用透明图片?</p>
<h2>jpg——靠边站</h2>
<p>让我们先来说说在网页上经常使用的图片格式——gif、jpg(jpeg)、png,当然用flash也能达到展现图片的效果。至于什么其他的bmp等等,估计没有几个人会用在网页上,所以不在本文的讨论范围之内。</p>
<p>事实证明:gif、png和flash文件在网页上都可以表现出透明效果。而jpg却是无论如何都无法在网页中表现出透明效果(至少我不会,呵呵~)。所以,在本文中,我们只能对jpg图片文件说:“对不起,请您老人家靠边站!”</p>
<div class="floatMPic">
<img alt="jpg图片透明" src="http://justinyoung.cnblogs.com/images/cnblogs_com/justinyoung/2008_3q/touming02.gif"><h6>jpg无法在在网页中表现出透明效果</h6>
</div>
<p>注:其实背景透明的图片,在保持为jpg文件的时候就已经有了背景颜色,而不是在浏览器对jpg文件渲染的时候出现了什么问题。所以,在网页上使用背景透明的jpg基本上是不太可能了。</p>
<p>所以,要想使用背景透明的图片,只能寄希望在gif和png,以及flash上面了。</p>
<h2>gif——宝刀有刺</h2>
<p>在IE6一家独大、flash还没有大行其道的年代里,要想使用背景透明的图片效果,gif几乎是唯一的选择。即便是现在,使用gif达到透明效果,如果在要求不是很高的前提下,依然是个不错的选择。原因很简单——简单、方便。</p>
<p>但是,gif透明背景图片也有个致命的缺点——图片边框有<del>白色的</del>(谢谢10楼zjfeiye的补充)“毛刺”。所以如果你的图片所在的网页区域,网页背景颜色不是白色的话,那就会非常“惨不忍睹”。</p>
<div class="floatMPic">
<img alt="gif图片透明" src="http://justinyoung.cnblogs.com/images/cnblogs_com/justinyoung/2008_3q/touming03.gif"><h6>gif背景透明的图片虽然能达到透明效果,但是效果不理想</h6>
</div>
<h2>png——新生力量</h2>
<p> 作为新生力量的png图片格式,背景透明这样的小把戏,自然不再话下。所以在IE7以上的IE浏览器中,以及FireFox、Opera、Safari浏览器都能出色的完成任务,谷歌浏览器中,自然也是没有任何问题。可问题就在IE6浏览器中,在IE6这群遗老遗少中,完全不买png的帐,无论你是怎么的好,怎么的强,在我IE6里,就是不行。所以——png背景透明的图片,在IE6会失去透明背景,而已非常丑陋的一陀灰色代替。</p>
<div class="floatMPic">
<img alt="png图片透明" src="http://justinyoung.cnblogs.com/images/cnblogs_com/justinyoung/2008_3q/touming04.gif"><h6>对于PNG透明背景图片,IE6浏览器完全不买账</h6>
</div>
<h2>flash——难说爱你</h2>
<p> 对于用flash来实现图片背景透明效果,虽然浏览器的兼容性上没有什么问题。但是flash的缺点也是一大把——先不说需要装插件,就算是维护和修改成本也的让人衡量一下。当然,如果你们手头有flash的大量资源,这也自当别论。所以这里flash不做重点讨论。只给一段代码,作用是设置flash透明背景——</p>
<div class="csharpcode-wrapper">
<div class="csharpcode">
<pre class="alt"><span class="kwrd"><</span><span class="html">OBJECT</span> <span class="attr">classid</span><span class="kwrd">="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"</span></pre>
<pre class="alteven"><span class="attr">codebase</span><span class="kwrd">="http://download.macromedia.com/pub/shockwave/cabs/flash</span></pre>
<pre class="alt">/swflash.cab#version=5,0,0,0"</pre>
<pre class="alteven"><span class="attr">WIDTH</span>=<span class="attr">550</span> <span class="attr">HEIGHT</span>=<span class="attr">400</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"><</span><span class="html">PARAM</span> <span class="attr">NAME</span>=<span class="attr">movie</span> <span class="attr">value</span><span class="kwrd">="flashName.swf"</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"><</span><span class="html">PARAM</span> <span class="attr">NAME</span>=<span class="attr">quality</span> <span class="attr">value</span>=<span class="attr">high</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"><</span><span class="html">PARAM</span> <span class="attr">NAME</span>=<span class="attr">wmode</span> <span class="attr">value</span>=<span class="attr">transparent</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"><</span><span class="html">PARAM</span> <span class="attr">NAME</span>=<span class="attr">bgcolor</span> <span class="attr">value</span>=#<span class="attr">FFFFFF</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"><</span><span class="html">EMBED</span> <span class="attr">src</span><span class="kwrd">="flashName.swf"</span> <span class="attr">quality</span>=<span class="attr">high</span> <span class="attr">wmode</span>=<span class="attr">transparent</span> <span class="attr">bgcolor</span>=#<span class="attr">FFFFFF</span> <span class="attr">WIDTH</span>=<span class="attr">550</span> <span class="attr">HEIGHT</span>=<span class="attr">400</span> <span class="attr">TYPE</span><span class="kwrd">="application/x-shockwave-flash"</span> <span class="attr">PLUGINSPAGE</span><span class="kwrd">="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version</span></pre>
<pre class="alteven">=ShockwaveFlash"<span class="kwrd">></</span><span class="html">EMBED</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"></</span><span class="html">OBJECT</span><span class="kwrd">></span></pre>
</div>
</div>
<h2>先小结一下</h2>
<p>一种能达到图片背景透明的图片格式我们大致讲解了一下。现在我们来小结一下——</p>
<p>如果你要使用背景透明图片的地方,正巧是网页中的地方背景颜色是白色的,或者你不介意那些小小的“毛刺”的话,纳闷完全可以使用gif背景透明图片。</p>
<p>如果,你能保证你的用户,根本不会使用那些老掉牙的IE6一下版本的浏览器的话,那么你完全可以选用png背景透明图片。</p>
<p>如果,你能保证你的用户,浏览器都安装了flash显示插件,并且手头有大量的会flash的人力资源来制作和维护flash图片的话,那么你可以使用flash背景透明图片。</p>
<p>如果,恰巧上面的三种情况,都不适合你的话,那么恐怕你需要继续向下阅读了。</p>
<h2>中级解决方案</h2>
<p>想想一下:如果我们在IE6中使用gif,而在IE7或者其他浏览器中使用png。那么,就可以达到在任何浏览器下都是透明,而在IE6中“稍有毛刺”这样的较为理想的效果。</p>
<p>这时我们想到了css hack。在要显示图片的地方,我们不使用img标签,而使用div,然后对div设置背景图片,然后大小设置和图片一样大小。这样,我们就可以使用css hack了。方法也很简单——</p>
<div class="csharpcode-wrapper">
<div class="csharpcode">
<pre class="alt"><span class="kwrd"><!</span><span class="html">DOCTYPE</span> <span class="attr">html</span> <span class="attr">public</span> <span class="kwrd">"-//W3C//DTD XHTML 1.0 Transitional//EN"</span> <span class="kwrd">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"><</span><span class="html">html</span> <span class="attr">xmlns</span><span class="kwrd">="http://www.w3.org/1999/xhtml"</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"><</span><span class="html">head</span><span class="kwrd">></span></pre>
<pre class="alteven"> <span class="kwrd"><</span><span class="html">meta</span> <span class="attr">http-equiv</span><span class="kwrd">="Content-Type"</span> <span class="attr">content</span><span class="kwrd">="text/html; charset=utf-8"</span> <span class="kwrd">/></span></pre>
<pre class="alt"> <span class="kwrd"><</span><span class="html">meta</span> <span class="attr">name</span><span class="kwrd">="Keywords"</span> <span class="attr">content</span><span class="kwrd">="YES!B/S!,web标准,杨正祎,博客园,实例代码"</span> <span class="kwrd">/></span></pre>
<pre class="alteven"> <span class="kwrd"><</span><span class="html">meta</span> <span class="attr">name</span><span class="kwrd">="Description"</span> <span class="attr">content</span><span class="kwrd">="这是一个简单YES!B/S!文章示例页面,来自杨正祎的博客,http: //justinyoung.cnblogs.com/"</span> <span class="kwrd">/></span></pre>
<pre class="alt"> <span class="kwrd"><</span><span class="html">title</span><span class="kwrd">></span>YES!B/S!文章示例页面<span class="kwrd"></</span><span class="html">title</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"><</span><span class="html">style</span> <span class="attr">type</span><span class="kwrd">="text/css"</span><span class="kwrd">></span></pre>
<pre class="alt">#testDiv{</pre>
<pre class="alteven"> width:100px;</pre>
<pre class="alt"> height:100px;</pre>
<pre class="alteven"> background:transparent url('png.png') no-repeat;</pre>
<pre class="alt"> _background:transparent url('gif.gif') no-repeat; /*** IE6 css hack ***/</pre>
<pre class="alteven">}</pre>
<pre class="alt"><span class="kwrd"></</span><span class="html">style</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"></</span><span class="html">head</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"><</span><span class="html">body</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"><</span><span class="html">div</span> <span class="attr">id</span><span class="kwrd">="testDiv"</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"></</span><span class="html">div</span><span class="kwrd">></span></pre>
<pre class="alteven"><span class="kwrd"></</span><span class="html">body</span><span class="kwrd">></span></pre>
<pre class="alt"><span class="kwrd"></</span><span class="html">html</span><span class="kwrd">></span></pre>
</div>
</div>
<p>当然,这个方法也有缺点——需要维护gif和png两个版本的图片。</p>
<p> 至于css hack的相关知识,有兴趣的朋友可以看这篇文章——<a target="_blank" href="http://www.cnblogs.com/justinyoung/articles/892414.html" title="CSS Hack">《实例讲解符合中国特色的和网络现状的实用CSS Hack(附源码)》</a>和<a target="_blank" href="http://www.cnblogs.com/JustinYoung/articles/891782.html" title="CSS hack浏览器兼容一览表">《CSS hack浏览器兼容一览表》</a></p>
<h2>终极解决方案</h2>
<p>如果你洁癖到连IE6中的那些“毛刺”也无法忍受的话。那我们只能拿出终极解决方案了——其实,我们可以通过一些技巧,让IE6也能支持背景透明的PNG图片。这样,png背景透明的唯一缺点——不支持IE6也便克服了。</p>
<p> 还记得我博客中的<a href="http://www.cnblogs.com/JustinYoung/archive/2008/07/21/expression-behavior-in-CSS.html" title="expression和behavior">《实例讲解css中的行为:expression和behavior(附DEMO下载)》</a>这篇文章吗?当时被某高人大骂骗子和忽悠的一篇文章。其实之所以写那篇文章,也是为现在的这里埋下伏笔而已。因为,这个是 IE6支持PNG背景透明的技巧正是使用了那篇文章介绍的一些技术——behavior。下面是一些核心代码,如果你发现看不懂,也完全没有关系。因为,我们只要会使用即可——</p>
<div class="csharpcode-wrapper">
<div class="csharpcode">
<pre class="alt"><<span class="kwrd">public</span>:component></pre>
<pre class="alteven"><<span class="kwrd">public</span>:attach <span class="kwrd">event</span>=<span class="str">"oncontentready"</span></pre>
<pre class="alt"> onevent=<span class="str">"IEPNGFix.process(element, 1)"</span> /></pre>
<pre class="alteven"><script type=<span class="str">"text/javascript"</span>></pre>
<pre class="alt"><span class="rem">// IE5.5+ PNG Alpha Fix v2.0 Alpha 2</span></pre>
<pre class="alteven"><span class="rem">// (c) 2004-2008 Angus Turnbull http://www.twinhelix.com</span></pre>
<pre class="alt"><span class="rem">// This is licensed under the GNU LGPL, version 2.1 or later.</span></pre>
<pre class="alteven"><span class="rem">// For details, see: http://creativecommons.org/licenses/LGPL/2.1/</span></pre>
<pre class="alt"><span class="kwrd">if</span> (!window.IEPNGFix) {</pre>
<pre class="alteven"> window.IEPNGFix = {};</pre>
<pre class="alt">}</pre>
<pre class="alteven"><span class="rem">// This must be a path to a blank image, relative to the HTML document(s).</span></pre>
<pre class="alt"><span class="rem">// In production use I suggest '/images/blank.gif' or similar. That's all!</span></pre>
<pre class="alteven">IEPNGFix.blankImg = <span class="str">'blank.gif'</span>;</pre>
<pre class="alt"><span class="kwrd">if</span> (!IEPNGFix.data) {</pre>
<pre class="alteven"> IEPNGFix.data = {};</pre>
<pre class="alt">}</pre>
<pre class="alteven">IEPNGFix.fix = <span class="kwrd">function</span>(elm, src, t) {</pre>
<pre class="alt"> <span class="rem">// Applies an image 'src' to an element 'elm' using the DirectX filter.</span></pre>
<pre class="alteven"> <span class="rem">// If 'src' is null, filter is disabled.</span></pre>
<pre class="alt"> <span class="rem">// Disables the 'hook' to prevent infinite recursion on setting BG/src.</span></pre>
<pre class="alteven"> <span class="rem">// 't' = type, where background tile = 0, background = 1, IMG SRC = 2.</span></pre>
<pre class="alt"> <span class="kwrd">var</span> h = <span class="kwrd">this</span>.hook.enabled;</pre>
<pre class="alteven"> <span class="kwrd">this</span>.hook.enabled = 0;</pre>
<pre class="alt"> <span class="kwrd">var</span> f = <span class="str">'DXImageTransform.Microsoft.AlphaImageLoader'</span>;</pre>
<pre class="alteven"> src = (src || <span class="str">''</span>).replace(/\(/g, <span class="str">'%28'</span>).replace(/\)/g, <span class="str">'%29'</span>);</pre>
<pre class="alt"> <span class="kwrd">if</span> (</pre>
<pre class="alteven"> src && !(/IMG|INPUT/.test(elm.nodeName) && (t != 2)) &&</pre>
<pre class="alt"> elm.currentStyle.width == <span class="str">'auto'</span> && elm.currentStyle.height == <span class="str">'auto'</span></pre>
<pre class="alteven"> ) {</pre>
<pre class="alt"> elm.style.width = elm.offsetWidth + <span class="str">'px'</span>;</pre>
<pre class="alteven"> elm.style.height = elm.clientHeight + <span class="str">'px'</span>;</pre>
<pre class="alt"> <span class="kwrd">if</span> (elm.currentStyle.display == <span class="str">'inline'</span>) {</pre>
<pre class="alteven"> elm.style.display = <span class="str">'inline-block'</span>;</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">if</span> (t == 1) {</pre>
<pre class="alteven"> elm.style.backgroundImage = <span class="str">'url("'</span> + <span class="kwrd">this</span>.blankImg + <span class="str">'")'</span>;</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> <span class="kwrd">if</span> (t == 2) {</pre>
<pre class="alt"> elm.src = <span class="kwrd">this</span>.blankImg;</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">if</span> (elm.filters[f]) {</pre>
<pre class="alteven"> elm.filters[f].enabled = src ? <span class="kwrd">true</span> : <span class="kwrd">false</span>;</pre>
<pre class="alt"> <span class="kwrd">if</span> (src) {</pre>
<pre class="alteven"> elm.filters[f].src = src;</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> } <span class="kwrd">else</span> <span class="kwrd">if</span> (src) {</pre>
<pre class="alt"> elm.style.filter = <span class="str">'progid:'</span> + f + <span class="str">'(src="'</span> + src +</pre>
<pre class="alteven"> <span class="str">'",sizingMethod="crop")'</span>;</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> <span class="kwrd">this</span>.hook.enabled = h;</pre>
<pre class="alt">};</pre>
<pre class="alteven">IEPNGFix.process = <span class="kwrd">function</span>(elm, init) {</pre>
<pre class="alt"> <span class="rem">// Checks the onpropertychange event (on first 'init' run, a fake event)</span></pre>
<pre class="alteven"> <span class="rem">// and calls the filter-applying-functions.</span></pre>
<pre class="alt"> <span class="kwrd">if</span> (</pre>
<pre class="alteven"> !/MSIE (5\.5|6)/.test(navigator.userAgent) ||</pre>
<pre class="alt"> <span class="kwrd">typeof</span> elm.filters == <span class="str">'unknown'</span></pre>
<pre class="alteven"> ) {</pre>
<pre class="alt"> <span class="kwrd">return</span>;</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">if</span> (!<span class="kwrd">this</span>.data[elm.uniqueID]) {</pre>
<pre class="alteven"> <span class="kwrd">this</span>.data[elm.uniqueID] = {</pre>
<pre class="alt"> className: <span class="str">''</span></pre>
<pre class="alteven"> };</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> <span class="kwrd">var</span> data = <span class="kwrd">this</span>.data[elm.uniqueID],</pre>
<pre class="alt"> evt = init ? { propertyName: <span class="str">'src,backgroundImage'</span> } : <span class="kwrd">event</span>,</pre>
<pre class="alteven"> isSrc = /src/.test(evt.propertyName),</pre>
<pre class="alt"> isBg = /backgroundImage/.test(evt.propertyName),</pre>
<pre class="alteven"> isPos = /background(Pos|Rep)/.test(evt.propertyName),</pre>
<pre class="alt"> isClass = !init && ((elm.className != data.className) &&</pre>
<pre class="alteven"> (elm.className || data.className));</pre>
<pre class="alt"> <span class="kwrd">if</span> (!(isSrc || isBg || isPos || isClass)) {</pre>
<pre class="alteven"> <span class="kwrd">return</span>;</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> data.className = elm.className;</pre>
<pre class="alt"> <span class="kwrd">var</span> blank = <span class="kwrd">this</span>.blankImg.match(/([^\/]+)$/)[1],</pre>
<pre class="alteven"> eS = elm.style,</pre>
<pre class="alt"> eCS = elm.currentStyle;</pre>
<pre class="alteven"> <span class="rem">// Required for Whatever:hover - erase set BG if className changes.</span></pre>
<pre class="alt"> <span class="kwrd">if</span> (</pre>
<pre class="alteven"> isClass && (eS.backgroundImage.indexOf(<span class="str">'url('</span>) == -1 ||</pre>
<pre class="alt"> eS.backgroundImage.indexOf(blank) > -1)</pre>
<pre class="alteven"> ) {</pre>
<pre class="alt"> <span class="kwrd">return</span> setTimeout(<span class="kwrd">function</span>() {</pre>
<pre class="alteven"> eS.backgroundImage = <span class="str">''</span>;</pre>
<pre class="alt"> }, 0);</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="rem">// Foregrounds.</span></pre>
<pre class="alteven"> <span class="kwrd">if</span> (isSrc && elm.src && { IMG: 1, INPUT: 1 }[elm.nodeName]) {</pre>
<pre class="alt"> <span class="kwrd">if</span> ((/\.png/i).test(elm.src)) {</pre>
<pre class="alteven"> <span class="kwrd">this</span>.fix(elm, elm.src, 2);</pre>
<pre class="alt"> } <span class="kwrd">else</span> <span class="kwrd">if</span> (elm.src.indexOf(blank) == -1) {</pre>
<pre class="alteven"> <span class="kwrd">this</span>.fix(elm, <span class="str">''</span>);</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="rem">// Backgrounds.</span></pre>
<pre class="alteven"> <span class="kwrd">var</span> bgSrc = eCS.backgroundImage || eS.backgroundImage;</pre>
<pre class="alt"> <span class="kwrd">if</span> ((bgSrc + elm.src).indexOf(blank) == -1) {</pre>
<pre class="alteven"> <span class="kwrd">var</span> bgPNG = bgSrc.match(/url[(<span class="str">"']+(.*\.png[^\)"</span><span class="str">']*)[\)"'</span>]/i);</pre>
<pre class="alt"> <span class="kwrd">if</span> (bgPNG) {</pre>
<pre class="alteven"> <span class="kwrd">if</span> (<span class="kwrd">this</span>.tileBG && !{ IMG: 1, INPUT: 1 }[elm.nodeName]) {</pre>
<pre class="alt"> <span class="kwrd">this</span>.tileBG(elm, bgPNG[1]);</pre>
<pre class="alteven"> <span class="kwrd">this</span>.fix(elm, <span class="str">''</span>, 1);</pre>
<pre class="alt"> } <span class="kwrd">else</span> {</pre>
<pre class="alteven"> <span class="kwrd">if</span> (data.tiles && data.tiles.src) {</pre>
<pre class="alt"> <span class="kwrd">this</span>.tileBG(elm, <span class="str">''</span>);</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">this</span>.fix(elm, bgPNG[1], 1);</pre>
<pre class="alteven"> <span class="kwrd">this</span>.childFix(elm);</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> } <span class="kwrd">else</span> {</pre>
<pre class="alt"> <span class="kwrd">if</span> (data.tiles && data.tiles.src) {</pre>
<pre class="alteven"> <span class="kwrd">this</span>.tileBG(elm, <span class="str">''</span>);</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> <span class="kwrd">this</span>.fix(elm, <span class="str">''</span>);</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> } <span class="kwrd">else</span> <span class="kwrd">if</span> ((isPos || isClass) && data.tiles && data.tiles.src) {</pre>
<pre class="alt"> <span class="kwrd">this</span>.tileBG(elm, data.tiles.src);</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">if</span> (init) {</pre>
<pre class="alteven"> <span class="kwrd">this</span>.hook.enabled = 1;</pre>
<pre class="alt"> elm.attachEvent(<span class="str">'onpropertychange'</span>, <span class="kwrd">this</span>.hook);</pre>
<pre class="alteven"> }</pre>
<pre class="alt">};</pre>
<pre class="alteven">IEPNGFix.childFix = <span class="kwrd">function</span>(elm) {</pre>
<pre class="alt"> <span class="rem">// "hasLayout" fix for unclickable children inside PNG backgrounds.</span></pre>
<pre class="alteven"> <span class="kwrd">var</span> tags = [</pre>
<pre class="alt"> <span class="str">'a'</span>,</pre>
<pre class="alteven"> <span class="str">'input'</span>,</pre>
<pre class="alt"> <span class="str">'select'</span>,</pre>
<pre class="alteven"> <span class="str">'textarea'</span>,</pre>
<pre class="alt"> <span class="str">'button'</span>,</pre>
<pre class="alteven"> <span class="str">'iframe'</span>,</pre>
<pre class="alt"> <span class="str">'object'</span></pre>
<pre class="alteven"> ],</pre>
<pre class="alt"> t = tags.length,</pre>
<pre class="alteven"> tFix = [];</pre>
<pre class="alt"> <span class="kwrd">while</span> (t--) {</pre>
<pre class="alteven"> <span class="kwrd">var</span> pFix = elm.all.tags(tags[t]),</pre>
<pre class="alt"> e = pFix.length;</pre>
<pre class="alteven"> <span class="kwrd">while</span> (e--) {</pre>
<pre class="alt"> tFix.push(pFix[e]);</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> }</pre>
<pre class="alteven"> t = tFix.length;</pre>
<pre class="alt"> <span class="kwrd">if</span> (t && (/relative|absolute/i).test(elm.currentStyle.position)) {</pre>
<pre class="alteven"> alert(<span class="str">'IEPNGFix: Unclickable children of element:'</span> +</pre>
<pre class="alt"> <span class="str">'\n\n<'</span> + elm.nodeName + (id && <span class="str">' id='</span> + id) + <span class="str">'>'</span>);</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> <span class="kwrd">while</span> (t--) {</pre>
<pre class="alteven"> <span class="kwrd">if</span> (!(/relative|absolute/i).test(tFix[t].currentStyle.position)) {</pre>
<pre class="alt"> tFix[t].style.position = <span class="str">'relative'</span>;</pre>
<pre class="alteven"> }</pre>
<pre class="alt"> }</pre>
<pre class="alteven">};</pre>
<pre class="alt">IEPNGFix.hook = <span class="kwrd">function</span>() {</pre>
<pre class="alteven"> <span class="kwrd">if</span> (IEPNGFix.hook.enabled) {</pre>
<pre class="alt"> IEPNGFix.process(element, 0);</pre>
<pre class="alteven"> }</pre>
<pre class="alt">};</pre>
<pre class="alteven"></script></pre>
<pre class="alt"></<span class="kwrd">public</span>:component></pre>
</div>
</div>
<h2>如何使用</h2>
<p>如果代码看不懂,没有关系,我们下面来告诉你如何使用(其实代码也不难看懂,只是判断一些情况,然后使用透明滤镜而已)。我们强烈建议你下载这个<a href="http://files.cnblogs.com/JustinYoung/PNGinIE6.rar" title="打包好的demo">打包好的demo</a>,这样只需要看看demo即可明白。使用办法可以简化为以下三步——</p>
<ul style="margin: 15px 2px 15px 25px;">
<li style="">第一步:拷贝“iepngfix.htc”和“blank.gif”文件到你的项目中</li>
<li style="">第二步:通过适当的选择器,让需要在IE6透明的图片或者需要背景图片透明的容器使用上“behavior: url("iepngfix.htc");”</li>
<li style="">第三步:如果你需要容器的背景图片有透明效果,你还需要在页面中引入iepngfix_tilebg.js脚本(当然,如果你不要使用容器的透明背景图片效果,也可以不引入此js文件) </li>
</ul>
<div class="floatMPic">
<img alt="ie6png" src="http://justinyoung.cnblogs.com/images/cnblogs_com/justinyoung/2008_3q/touming05.gif"><h6>在IE6中png图片和背景图片也能透明了</h6>
</div>
<p>当然,整个解决方案也有其缺点——需要多引用1-2个文件(iepngfix.htc和iepngfix_tilebg.js文件)。所以,最终使用何种方案还需要根据自己的要求而定。</p>
<div class="downloadList">
<h3>相关资源列表</h3>
<ul class="uldownloadList">
<li>
<a href="http://www.cnblogs.com/JustinYoung/archive/2008/07/21/expression-behavior-in-CSS.html" title="实例讲解css中的行为:expression和behavior" target="_blank">实例讲解css中的行为:expression和behavior(附DEMO下载)</a>
</li>
<li class="evenLi"><a target="_blank" href="http://www.twinhelix.com/css/iepngfix/" title="IE6PNG透明效果解决方案">IE6PNG透明效果解决方案</a></li>
<li><a target="_blank" href="http://downloads.cnblogs.com/justinyoung/share/pnginie6/pnginie6.html" title="IE6PNG透明效果解决方案Demo">IE6PNG透明效果解决方案Demo</a></li>
<li class="evenLi"><a target="_blank" href="http://www.cnblogs.com/justinyoung/articles/892414.html" title="CSS Hack">《实例讲解符合中国特色的和网络现状的实用CSS Hack(附源码)》</a></li>
<li><a target="_blank" href="http://www.cnblogs.com/JustinYoung/articles/891782.html" title="CSS hack浏览器兼容一览表">《CSS hack浏览器兼容一览表》</a></li>
<li class="evenLi"> <a href="http://files.cnblogs.com/JustinYoung/PNGinIE6.rar" title="打包好的demo">打包好的demo</a>
</li>
</ul>
</div>
<!--end: downloadList-->
<br><center>
alimama_pid="mm_10056409_242955_3624216";
alimama_titlecolor="0000FF";
alimama_descolor ="000000";
alimama_bgcolor="FFFFFF";
alimama_bordercolor="E6E6E6";
alimama_linkcolor="008000";
alimama_bottomcolor="FFFFFF";
alimama_anglesize="0";
alimama_bgpic="0";
alimama_icon="0";
alimama_sizecode="16";
alimama_width=658;
alimama_height=60;
alimama_type=2;
</center>
相关推荐
在这个特定的"实现了透明的页面引导,在滑动页面过程中背景图片会随之改变"的案例中,开发者通过巧妙地结合动画和图像变换,创造出更加动态和引人入胜的引导体验。 首先,我们要了解如何实现透明的页面引导。这通常...
在网页设计中,有时我们需要实现一个功能:当用户点击图片或某个链接时,页面上会出现一个半透明的遮罩层,同时图片会在其中放大展示,为用户提供更好的视觉体验。这个"js+css点击弹出遮罩层图片放大展示demo"正是...
这个Demo主要展示了如何利用Android SDK中的组件和自定义视图来创建一个类似QQ个人资料页面的效果,即随着用户在页面上滑动,ActionBar(在Android API 21之后被替换为ToolBar)的透明度会逐渐变化,同时可能伴有...
在JavaScript的世界里,将HTML页面转换为图片并允许用户下载保存是一种常见的需求,例如用于屏幕截图、页面预览或者数据可视化。本篇文章将详细介绍如何利用`html2canvas.js`和`canvas2image.js`这两个库来实现这个...
JavaScript(简称JS)拖拽功能是网页交互中的一个重要部分,它可以增强用户体验,使得用户可以通过鼠标操作页面元素,如图片、窗口或自定义对象等。在本"JS拖拽DEMO大全"中,我们将会探讨一系列关于JavaScript实现...
在书籍翻页效果中,动画可能涉及到页面的旋转、缩放和透明度变化,以模拟真实的纸张翻动。 此外,为了实现更真实的翻页效果,开发者可能会用到物理引擎,如Box2D或PhysicsBody。这些引擎可以帮助计算页面的物理行为...
在H5页面开发中,有时候我们需要实现一个功能:当用户点击图片时,图片会放大并在屏幕上展示,同时支持用户在放大后的图片之间进行轮播。这个功能可以提升用户体验,特别是在展示一组相关的图片时。以下是对这个功能...
这款插件的核心功能是在网页上以弹出式、全屏或半透明背景的方式展示图片,为用户提供了无需离开当前页面就能查看大图的便利。Lightbox JS 的设计理念是简洁而高效,它能够无缝地融入任何网站设计,同时保持出色的...
因此,当你在IE6中使用PNG-24格式的图片时,透明部分会显示为完全不透明,即背景色或默认颜色。 为了解决这个问题,我们可以使用一种名为“PNGFix”的JavaScript库,如压缩包中的`js`文件可能就是这样一个解决方案...
1. **弹出窗口显示**:当用户点击图片链接时,图片会在一个半透明的背景上以放大格式弹出,保持用户对网页的视觉连续性。 2. **缩放动画**:图片加载时通常伴随着平滑的缩放动画,提高了用户体验。 3. **导航控制*...
在loading效果中,这通常涉及改变背景颜色、大小、位置或透明度等。例如: ```css @keyframes rotateLoader { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .loading-indicator { ...
要解决“PNG图片在IE6下的背景透明”问题,有几种常见的方法: 1. **CSS滤镜方法**:IE6支持CSS滤镜,可以利用它来实现PNG的透明效果。例如,对于一个ID为"imgId"的PNG图片,可以添加以下CSS样式: ```css #imgId...
通过研究和运行这个Demo,你可以更深入地理解如何在自己的项目中实现类似功能。 总之,Android半透明图层用户引导是一个实用且有效的教学工具,通过合理的设计和编程,可以提升用户对应用的理解和满意度。在实践中...
3. **CSS集成**:资源包中提及引入CSS文件来使用图标,这通常意味着图标被用作CSS背景图像,或者使用CSS符号(如`content`属性和`data URI`)内联嵌入。这种技术可以减少HTTP请求,提高页面加载速度。 4. **响应式...
综上所述,"perfect_demo.zip"可能是一个演示项目,展示了如何在Java环境中,结合图像处理和PDF操作技术,实现在图片和PDF上添加手写签名、盖章和水印的功能。这涉及到的技能包括但不限于Java编程、PDF处理库的使用...
透明背景在网页设计中至关重要,因为它允许用户在观看Flash内容的同时,仍然能清晰地看到页面的其他部分,比如图片、文字或者其他交互元素。这样的设计增强了网页的层次感和深度,有助于提升用户在浏览过程中的沉浸...
本示例“将flash设为网页的背景demo.zip”旨在演示如何将Flash对象集成到网页背景中,以提升网站的视觉效果和用户体验。在2000年代初,这种技术非常常见,因为Flash提供了丰富的动画功能,而HTML和JavaScript当时还...
然而,早期的Internet Explorer 6(简称IE6)浏览器对PNG8和PNG24格式的支持存在局限性,特别是对Alpha透明通道的支持不完全,导致PNG图片的透明效果在IE6上显示异常。 为了解决这个问题,开发者们提出了一些解决...
在自定义PDF文档背景方面,iText允许开发者添加图片或者颜色作为背景。这通常通过创建一个PdfTemplate对象,然后将其作为页面的背景添加到PDF文档中。例如,你可以设置一个全尺寸的图像作为每一页的背景,或者使用...
示例代码中使用了一个名为loading.gif的动态图片来达到这个效果,并指定了图片的URL路径。 知识点8:资源组织和下载 为了方便读者使用,示例代码附带了一个可供下载的demo源码链接,用户可以将完整的JavaScript代码...