ie6下png图片背景不透明的解决办法使用js实现


Posted in Javascript onJanuary 11, 2013

我们时常在使用png图片的时候,在ie6下发生背景不透明的问题,下面给大家介绍下一个js解决的方式。
首先我们要用到一个js,代码如下:

/** 
* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>. 
* Author: Drew Diller 
* Email: drew.diller@gmail.com 
* URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/ 
* Version: 0.0.8a 
* Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license 
* 
* Example usage: 
* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector 
* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement 
**/ 
/* 
PLEASE READ: 
Absolutely everything in this script is SILLY. I know this. IE's rendering of certain pixels doesn't make sense, so neither does this code! 
*/ 
/** rewrite by waitingbar 2012.1.12 
为了解决IE6下透明的png图片缩小时不能完全显示问题 
el.vml.image.fill.type = 'tile'; 改为: 
el.vml.image.fill.type = 'frame'; 
*/ var DD_belatedPNG = { 
ns: 'DD_belatedPNG', 
imgSize: {}, 
delay: 10, 
nodesFixed: 0, 
createVmlNameSpace: function () { /* enable VML */ 
if (document.namespaces && !document.namespaces[this.ns]) { 
document.namespaces.add(this.ns, 'urn:schemas-microsoft-com:vml'); 
} 
}, 
createVmlStyleSheet: function () { /* style VML, enable behaviors */ 
/* 
Just in case lots of other developers have added 
lots of other stylesheets using document.createStyleSheet 
and hit the 31-limit mark, let's not use that method! 
further reading: http://msdn.microsoft.com/en-us/library/ms531194(VS.85).aspx 
*/ 
var screenStyleSheet, printStyleSheet; 
screenStyleSheet = document.createElement('style'); 
screenStyleSheet.setAttribute('media', 'screen'); 
document.documentElement.firstChild.insertBefore(screenStyleSheet, document.documentElement.firstChild.firstChild); 
if (screenStyleSheet.styleSheet) { 
screenStyleSheet = screenStyleSheet.styleSheet; 
screenStyleSheet.addRule(this.ns + '\\:*', '{behavior:url(#default#VML)}'); 
screenStyleSheet.addRule(this.ns + '\\:shape', 'position:absolute;'); 
screenStyleSheet.addRule('img.' + this.ns + '_sizeFinder', 'behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;'); /* large negative top value for avoiding vertical scrollbars for large images, suggested by James O'Brien, http://www.thanatopsic.org/hendrik/ */ 
this.screenStyleSheet = screenStyleSheet; 
/* Add a print-media stylesheet, for preventing VML artifacts from showing up in print (including preview). */ 
/* Thanks to R?i Pr?ost for automating this! */ 
printStyleSheet = document.createElement('style'); 
printStyleSheet.setAttribute('media', 'print'); 
document.documentElement.firstChild.insertBefore(printStyleSheet, document.documentElement.firstChild.firstChild); 
printStyleSheet = printStyleSheet.styleSheet; 
printStyleSheet.addRule(this.ns + '\\:*', '{display: none !important;}'); 
printStyleSheet.addRule('img.' + this.ns + '_sizeFinder', '{display: none !important;}'); 
} 
}, 
readPropertyChange: function () { 
var el, display, v; 
el = event.srcElement; 
if (!el.vmlInitiated) { 
return; 
} 
if (event.propertyName.search('background') != -1 || event.propertyName.search('border') != -1) { 
DD_belatedPNG.applyVML(el); 
} 
if (event.propertyName == 'style.display') { 
display = (el.currentStyle.display == 'none') ? 'none' : 'block'; 
for (v in el.vml) { 
if (el.vml.hasOwnProperty(v)) { 
el.vml[v].shape.style.display = display; 
} 
} 
} 
if (event.propertyName.search('filter') != -1) { 
DD_belatedPNG.vmlOpacity(el); 
} 
}, 
vmlOpacity: function (el) { 
if (el.currentStyle.filter.search('lpha') != -1) { 
var trans = el.currentStyle.filter; 
trans = parseInt(trans.substring(trans.lastIndexOf('=')+1, trans.lastIndexOf(')')), 10)/100; 
el.vml.color.shape.style.filter = el.currentStyle.filter; /* complete guesswork */ 
el.vml.image.fill.opacity = trans; /* complete guesswork */ 
} 
}, 
handlePseudoHover: function (el) { 
setTimeout(function () { /* wouldn't work as intended without setTimeout */ 
DD_belatedPNG.applyVML(el); 
}, 1); 
}, 
/** 
* This is the method to use in a document. 
* @param {String} selector - REQUIRED - a CSS selector, such as '#doc .container' 
**/ 
fix: function (selector) { 
if (this.screenStyleSheet) { 
var selectors, i; 
selectors = selector.split(','); /* multiple selectors supported, no need for multiple calls to this anymore */ 
for (i=0; i<selectors.length; i++) { 
this.screenStyleSheet.addRule(selectors[i], 'behavior:expression(DD_belatedPNG.fixPng(this))'); /* seems to execute the function without adding it to the stylesheet - interesting... */ 
} 
} 
}, 
applyVML: function (el) { 
el.runtimeStyle.cssText = ''; 
this.vmlFill(el); 
this.vmlOffsets(el); 
this.vmlOpacity(el); 
if (el.isImg) { 
this.copyImageBorders(el); 
} 
}, 
attachHandlers: function (el) { 
var self, handlers, handler, moreForAs, a, h; 
self = this; 
handlers = {resize: 'vmlOffsets', move: 'vmlOffsets'}; 
if (el.nodeName == 'A') { 
moreForAs = {mouseleave: 'handlePseudoHover', mouseenter: 'handlePseudoHover', focus: 'handlePseudoHover', blur: 'handlePseudoHover'}; 
for (a in moreForAs) { 
if (moreForAs.hasOwnProperty(a)) { 
handlers[a] = moreForAs[a]; 
} 
} 
} 
for (h in handlers) { 
if (handlers.hasOwnProperty(h)) { 
handler = function () { 
self[handlers[h]](el); 
}; 
el.attachEvent('on' + h, handler); 
} 
} 
el.attachEvent('onpropertychange', this.readPropertyChange); 
}, 
giveLayout: function (el) { 
el.style.zoom = 1; 
if (el.currentStyle.position == 'static') { 
el.style.position = 'relative'; 
} 
}, 
copyImageBorders: function (el) { 
var styles, s; 
styles = {'borderStyle':true, 'borderWidth':true, 'borderColor':true}; 
for (s in styles) { 
if (styles.hasOwnProperty(s)) { 
el.vml.color.shape.style[s] = el.currentStyle[s]; 
} 
} 
}, 
vmlFill: function (el) { 
if (!el.currentStyle) { 
return; 
} else { 
var elStyle, noImg, lib, v, img, imgLoaded; 
elStyle = el.currentStyle; 
} 
for (v in el.vml) { 
if (el.vml.hasOwnProperty(v)) { 
el.vml[v].shape.style.zIndex = elStyle.zIndex; 
} 
} 
el.runtimeStyle.backgroundColor = ''; 
el.runtimeStyle.backgroundImage = ''; 
noImg = true; 
if (elStyle.backgroundImage != 'none' || el.isImg) { 
if (!el.isImg) { 
el.vmlBg = elStyle.backgroundImage; 
el.vmlBg = el.vmlBg.substr(5, el.vmlBg.lastIndexOf('")')-5); 
} 
else { 
el.vmlBg = el.src; 
} 
lib = this; 
if (!lib.imgSize[el.vmlBg]) { /* determine size of loaded image */ 
img = document.createElement('img'); 
lib.imgSize[el.vmlBg] = img; 
img.className = lib.ns + '_sizeFinder'; 
img.runtimeStyle.cssText = 'behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;'; /* make sure to set behavior to none to prevent accidental matching of the helper elements! */ 
imgLoaded = function () { 
this.width = this.offsetWidth; /* weird cache-busting requirement! */ 
this.height = this.offsetHeight; 
lib.vmlOffsets(el); 
}; 
img.attachEvent('onload', imgLoaded); 
img.src = el.vmlBg; 
img.removeAttribute('width'); 
img.removeAttribute('height'); 
document.body.insertBefore(img, document.body.firstChild); 
} 
el.vml.image.fill.src = el.vmlBg; 
noImg = false; 
} 
el.vml.image.fill.on = !noImg; 
el.vml.image.fill.color = 'none'; 
el.vml.color.shape.style.backgroundColor = elStyle.backgroundColor; 
el.runtimeStyle.backgroundImage = 'none'; 
el.runtimeStyle.backgroundColor = 'transparent'; 
}, 
/* IE can't figure out what do when the offsetLeft and the clientLeft add up to 1, and the VML ends up getting fuzzy... so we have to push/enlarge things by 1 pixel and then clip off the excess */ 
vmlOffsets: function (el) { 
var thisStyle, size, fudge, makeVisible, bg, bgR, dC, altC, b, c, v; 
thisStyle = el.currentStyle; 
size = {'W':el.clientWidth+1, 'H':el.clientHeight+1, 'w':this.imgSize[el.vmlBg].width, 'h':this.imgSize[el.vmlBg].height, 'L':el.offsetLeft, 'T':el.offsetTop, 'bLW':el.clientLeft, 'bTW':el.clientTop}; 
fudge = (size.L + size.bLW == 1) ? 1 : 0; 
/* vml shape, left, top, width, height, origin */ 
makeVisible = function (vml, l, t, w, h, o) { 
vml.coordsize = w+','+h; 
vml.coordorigin = o+','+o; 
vml.path = 'm0,0l'+w+',0l'+w+','+h+'l0,'+h+' xe'; 
vml.style.width = w + 'px'; 
vml.style.height = h + 'px'; 
vml.style.left = l + 'px'; 
vml.style.top = t + 'px'; 
}; 
makeVisible(el.vml.color.shape, (size.L + (el.isImg ? 0 : size.bLW)), (size.T + (el.isImg ? 0 : size.bTW)), (size.W-1), (size.H-1), 0); 
makeVisible(el.vml.image.shape, (size.L + size.bLW), (size.T + size.bTW), (size.W), (size.H), 1 ); 
bg = {'X':0, 'Y':0}; 
if (el.isImg) { 
bg.X = parseInt(thisStyle.paddingLeft, 10) + 1; 
bg.Y = parseInt(thisStyle.paddingTop, 10) + 1; 
} 
else { 
for (b in bg) { 
if (bg.hasOwnProperty(b)) { 
this.figurePercentage(bg, size, b, thisStyle['backgroundPosition'+b]); 
} 
} 
} 
el.vml.image.fill.position = (bg.X/size.W) + ',' + (bg.Y/size.H); 
bgR = thisStyle.backgroundRepeat; 
dC = {'T':1, 'R':size.W+fudge, 'B':size.H, 'L':1+fudge}; /* these are defaults for repeat of any kind */ 
altC = { 'X': {'b1': 'L', 'b2': 'R', 'd': 'W'}, 'Y': {'b1': 'T', 'b2': 'B', 'd': 'H'} }; 
if (bgR != 'repeat' || el.isImg) { 
c = {'T':(bg.Y), 'R':(bg.X+size.w), 'B':(bg.Y+size.h), 'L':(bg.X)}; /* these are defaults for no-repeat - clips down to the image location */ 
if (bgR.search('repeat-') != -1) { /* now let's revert to dC for repeat-x or repeat-y */ 
v = bgR.split('repeat-')[1].toUpperCase(); 
c[altC[v].b1] = 1; 
c[altC[v].b2] = size[altC[v].d]; 
} 
if (c.B > size.H) { 
c.B = size.H; 
} 
el.vml.image.shape.style.clip = 'rect('+c.T+'px '+(c.R+fudge)+'px '+c.B+'px '+(c.L+fudge)+'px)'; 
} 
else { 
el.vml.image.shape.style.clip = 'rect('+dC.T+'px '+dC.R+'px '+dC.B+'px '+dC.L+'px)'; 
} 
}, 
figurePercentage: function (bg, size, axis, position) { 
var horizontal, fraction; 
fraction = true; 
horizontal = (axis == 'X'); 
switch(position) { 
case 'left': 
case 'top': 
bg[axis] = 0; 
break; 
case 'center': 
bg[axis] = 0.5; 
break; 
case 'right': 
case 'bottom': 
bg[axis] = 1; 
break; 
default: 
if (position.search('%') != -1) { 
bg[axis] = parseInt(position, 10) / 100; 
} 
else { 
fraction = false; 
} 
} 
bg[axis] = Math.ceil( fraction ? ( (size[horizontal?'W': 'H'] * bg[axis]) - (size[horizontal?'w': 'h'] * bg[axis]) ) : parseInt(position, 10) ); 
if (bg[axis] % 2 === 0) { 
bg[axis]++; 
} 
return bg[axis]; 
}, 
fixPng: function (el) { 
el.style.behavior = 'none'; 
var lib, els, nodeStr, v, e; 
if (el.nodeName == 'BODY' || el.nodeName == 'TD' || el.nodeName == 'TR') { /* elements not supported yet */ 
return; 
} 
el.isImg = false; 
if (el.nodeName == 'IMG') { 
if(el.src.toLowerCase().search(/\.png$/) != -1) { 
el.isImg = true; 
el.style.visibility = 'hidden'; 
} 
else { 
return; 
} 
} 
else if (el.currentStyle.backgroundImage.toLowerCase().search('.png') == -1) { 
return; 
} 
lib = DD_belatedPNG; 
el.vml = {color: {}, image: {}}; 
els = {shape: {}, fill: {}}; 
for (v in el.vml) { 
if (el.vml.hasOwnProperty(v)) { 
for (e in els) { 
if (els.hasOwnProperty(e)) { 
nodeStr = lib.ns + ':' + e; 
el.vml[v][e] = document.createElement(nodeStr); 
} 
} 
el.vml[v].shape.stroked = false; 
el.vml[v].shape.appendChild(el.vml[v].fill); 
el.parentNode.insertBefore(el.vml[v].shape, el); 
} 
} 
el.vml.image.shape.fillcolor = 'none'; /* Don't show blank white shapeangle when waiting for image to load. */ 
//el.vml.image.fill.type = 'tile'; /* Makes image show up. */ 
el.vml.image.fill.type = 'frame'; /* 2012.1.12 */ 
el.vml.color.fill.on = false; /* Actually going to apply vml element's style.backgroundColor, so hide the whiteness. */ 
lib.attachHandlers(el); 
lib.giveLayout(el); 
lib.giveLayout(el.offsetParent); 
el.vmlInitiated = true; 
lib.applyVML(el); /* Render! */ 
} 
}; 
try { 
document.execCommand("BackgroundImageCache", false, true); /* TredoSoft Multiple IE doesn't like this, so try{} it */ 
} catch(r) {} 
DD_belatedPNG.createVmlNameSpace(); 
DD_belatedPNG.createVmlStyleSheet();

下面我们来看怎么使用这个js
DD_belatedPNG是一款完美解决IE6下的PNG透明JS插件,DD_belatedPNG使用了微软的VML语言对PNG图片进行重新绘制,以达到半透明的效果,并且能支持background-position和background-repeat属性,支持伪类。在众多的ie6下png透明问题上,DD_belatedPNG是最好的解决方案,其它的都有很多负作用。

使用方法

< !--[if IE 6]><script src="DD_belatedPNG.js"></script><script> DD_belatedPNG.fix('.png_bg');</script><![endif]-->

引用函数是DD_belatedPNG.fix(),括号里的 *表示所有css选择器.png_bg 改成你的css选择器名称。
Javascript 相关文章推荐
jquery中get和post的简单实例
Feb 04 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
Oct 23 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
Aug 25 Javascript
详解jQuery lazyload 懒加载
Dec 19 Javascript
bootstrap实现图片自动轮播
Dec 21 Javascript
Bootstrap按钮组简单实现代码
Mar 06 Javascript
详解angularjs 关于ui-router分层使用
Jun 12 Javascript
jQuery实现html双向绑定功能示例
Oct 09 jQuery
webpack构建换肤功能的思路详解
Nov 27 Javascript
JS通过位运算实现权限加解密
Aug 14 Javascript
如何制作一个Node命令行图像识别工具
Dec 12 Javascript
vue.js购物车添加商品组件的方法
Sep 17 Javascript
关于全局变量和局部变量的那些事
Jan 11 #Javascript
jquery延迟加载外部js实现代码
Jan 11 #Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
Jan 11 #Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
Jan 11 #Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
Jan 11 #Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
Jan 11 #Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
Jan 11 #Javascript
You might like
神族 Protoss 历史背景
2020/03/14 星际争霸
用PHP开发GUI
2006/10/09 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
点击弹出层外区域关闭弹出层jquery特效示例
2013/08/25 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
2016/12/12 Javascript
Bootstrap源码解读导航条(7)
2016/12/23 Javascript
jQuery条件分页 代替离线查询(附代码)
2017/08/17 jQuery
浅谈如何通过node.js对数据进行MD5加密
2018/05/16 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
Python基类函数的重载与调用实例分析
2015/01/12 Python
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
初中美术教学反思
2014/01/29 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
人事部专员岗位职责
2014/03/04 职场文书
大学生党员承诺书
2014/05/20 职场文书
2014年高中班主任工作总结
2014/11/08 职场文书
李强为自己工作观后感
2015/06/11 职场文书
初中语文教学反思范文
2016/03/03 职场文书
Go语言怎么使用变长参数函数
2022/07/15 Golang