.pngfix{ background:#555 url(./img/png8_aphla.png) no-repeat 0 0; _background:#555 none; _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./img/png8_aphla.png', sizingMethod='scale'); width:150px;height:150px;line-height:30px;text-align:center;font-size:20px;color:#fff; }
filter : progid:DXImageTransform.Microsoft.AlphaImageLoader ( enabled=bEnabled , sizingMethod=sSize , src=sURL )
在对象容器边界内,在对象的背景和内容之间显示一张图片。并提供对此图片的剪切和改变尺寸的操作。如果载入的是PNG(Portable Network Graphics)格式,则0%-100%的透明度也被提供。PNG(Portable Network Graphics)格式的图片的透明度不妨碍你选择文本。也就是说,你可以选择显示在PNG(Portable Network Graphics)格式的图片完全透明区域后面的内容。
推荐使用 DD_belatedPNG,只需要一个理由,就是它支持背景重定位 background-position
和平铺 background-repeat
属性,这是其他js插件不具备的,同时 DD_belatedPNG 还支持 a:hover
属性以及 <img>
。
<img class="ie6png" src="img/pngfix.png" width="300" height="225">
<div class="test ie6png"></div>
注意:此方法若已执行,之后延迟加载的或加载完毕后重新操作src赋值的png24图片将不会进行fix处理!
giveLayout: function (el) { el.style.zoom = 1; if (el.currentStyle.position == 'static') { el.style.position = 'relative' }; }
看了这个代码发现,只要position没有设置,那么 DD_belatedPNG 就会把 position 设置为 relative。
可以加个判断如下修复:
giveLayout: function (el) { el.style.zoom = 1; if (el.currentStyle.position == 'static') { var tags=el.nodeName.toLowerCase(); if(tags!='html' && tags!='a'&& tags!='img'){ el.style.position = 'relative' }; } }
这样修改就没问题了,接着我们再看问题 2
DD_belatedPNG 中对判断是img的代码如下:
if (el.nodeName == 'IMG') { if(el.src.toLowerCase().search(/\.png$/) != -1) { el.isImg = true; el.style.visibility = 'hidden'; } ... }
这段只是匹配了这张图片是不是png,但是如果图片加了版本号例如:logo.png?v=1321303913 这样的图片在ie6下就不会透明,可如下修改:
if (el.nodeName == 'IMG') { if(/\.png(?:\W|$)/.test(el.src.toLowerCase())) { el.isImg = true; el.style.visibility = 'hidden'; } ... }
给容器加个定位
童鞋说这个js的性能很低,这个问题我没有办法解决,我发现这个js里面用了很多的addRule()这个函数,我搜索下了这个函数,很多说法,是用了这个之后cup直线上升,我也没有找到可以替代的方法。
如果可以转换思路,就尽量不要如此处理,使用 GIF 或其他方式替代。
PS:这样不停的兼容,只会延长IE6的寿命,大家应该一起努力,放弃IE6。
针对支持的浏览器使用png24格式的背景图片,但是针对IE6使用_background设置稍微差一点的png8格式,虽然效果差了一些,但是不会出现很大的问题。