ie 6 png问题解决
<!--[if IE 6]> <script src="js/DD_belatedPNG_0.0.8a.js"></script> <script> DD_belatedPNG.fix('.ab,.ab1,.ab2,.ab3,.ab4,.ab5,.ab6,.ab7'); </script> <![endif]-->
专门解决ie6 png格式的问题,用法:粘贴上述代码,链接到DD_belatedPNG_0.0.8a.js, DD_belatedPNG.fix('.ab,.ab1,.ab2,.ab3,.ab4,.ab5,.ab6,.ab7');
.ab,.ab1,.ab2,.ab3,.ab4,.ab5,.ab6,.ab7是页面用到png的class名称
DD_belatedPNG_0.0.8a.js
当前路径:web/js/DD_belatedPNG_0.0.8a.js | |
2 | /** |
3 | * DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>. |
4 | * Author: Drew Diller |
5 | * Email: drew.diller@gmail.com |
6 | * URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/ |
7 | * Version: 0.0.8a |
8 | * Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license |
9 | * |
10 | * Example usage: |
11 | * DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector |
12 | * DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement |
13 | **/ |
14 | |
15 | /* |
16 | PLEASE READ: |
17 | 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! |
18 | */ |
19 | |
20 | var DD_belatedPNG = { |
21 | ns: 'DD_belatedPNG', |
22 | imgSize: {}, |
23 | delay: 10, |
24 | nodesFixed: 0, |
25 | createVmlNameSpace: function () { /* enable VML */ |
26 | if (document.namespaces && !document.namespaces[this.ns]) { |
27 | document.namespaces.add(this.ns, 'urn:schemas-microsoft-com:vml'); |
28 | } |
29 | }, |
30 | createVmlStyleSheet: function () { /* style VML, enable behaviors */ |
31 | /* |
32 | Just in case lots of other developers have added |
33 | lots of other stylesheets using document.createStyleSheet |
34 | and hit the 31-limit mark, let's not use that method! |
35 | further reading: http://msdn.microsoft.com/en-us/library/ms531194(VS.85).aspx |
36 | */ |
37 | var screenStyleSheet, printStyleSheet; |
38 | screenStyleSheet = document.createElement('style'); |
39 | screenStyleSheet.setAttribute('media', 'screen'); |
40 | document.documentElement.firstChild.insertBefore(screenStyleSheet, document.documentElement.firstChild.firstChild); |
41 | if (screenStyleSheet.styleSheet) { |
42 | screenStyleSheet = screenStyleSheet.styleSheet; |
43 | screenStyleSheet.addRule(this.ns + '\\:*', '{behavior:url(#default#VML)}'); |
44 | screenStyleSheet.addRule(this.ns + '\\:shape', 'position:absolute;'); |
45 | 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/ */ |
46 | this.screenStyleSheet = screenStyleSheet; |
47 | |
48 | /* Add a print-media stylesheet, for preventing VML artifacts from showing up in print (including preview). */ |
49 | /* Thanks to R閙i Pr関ost for automating this! */ |
50 | printStyleSheet = document.createElement('style'); |
51 | printStyleSheet.setAttribute('media', 'print'); |
52 | document.documentElement.firstChild.insertBefore(printStyleSheet, document.documentElement.firstChild.firstChild); |
53 | printStyleSheet = printStyleSheet.styleSheet; |
54 | printStyleSheet.addRule(this.ns + '\\:*', '{display: none !important;}'); |
55 | printStyleSheet.addRule('img.' + this.ns + '_sizeFinder', '{display: none !important;}'); |
56 | } |
57 | }, |
58 | readPropertyChange: function () { |
59 | var el, display, v; |
60 | el = event.srcElement; |
61 | if (!el.vmlInitiated) { |
62 | return; |
63 | } |
64 | if (event.propertyName.search('background') != -1 || event.propertyName.search('border') != -1) { |
65 | DD_belatedPNG.applyVML(el); |
66 | } |
67 | if (event.propertyName == 'style.display') { |
68 | display = (el.currentStyle.display == 'none') ? 'none' : 'block'; |
69 | for (v in el.vml) { |
70 | if (el.vml.hasOwnProperty(v)) { |
71 | el.vml[v].shape.style.display = display; |
72 | } |
73 | } |
74 | } |
75 | if (event.propertyName.search('filter') != -1) { |
76 | DD_belatedPNG.vmlOpacity(el); |
77 | } |
78 | }, |
79 | vmlOpacity: function (el) { |
80 | if (el.currentStyle.filter.search('lpha') != -1) { |
81 | var trans = el.currentStyle.filter; |
82 | trans = parseInt(trans.substring(trans.lastIndexOf('=')+1, trans.lastIndexOf(')')), 10)/100; |
83 | el.vml.color.shape.style.filter = el.currentStyle.filter; /* complete guesswork */ |
84 | el.vml.image.fill.opacity = trans; /* complete guesswork */ |
85 | } |
86 | }, |
87 | handlePseudoHover: function (el) { |
88 | setTimeout(function () { /* wouldn't work as intended without setTimeout */ |
89 | DD_belatedPNG.applyVML(el); |
90 | }, 1); |
91 | }, |
92 | /** |
93 | * This is the method to use in a document. |
94 | * @param {String} selector - REQUIRED - a CSS selector, such as '#doc .container' |
95 | **/ |
96 | fix: function (selector) { |
97 | if (this.screenStyleSheet) { |
98 | var selectors, i; |
99 | selectors = selector.split(','); /* multiple selectors supported, no need for multiple calls to this anymore */ |
100 | for (i=0; i<selectors.length; i++) { |
101 | this.screenStyleSheet.addRule(selectors[i], 'behavior:expression(DD_belatedPNG.fixPng(this))'); /* seems to execute the function without adding it to the stylesheet - interesting... */ |
102 | } |
103 | } |
104 | }, |
105 | applyVML: function (el) { |
106 | el.runtimeStyle.cssText = ''; |
107 | this.vmlFill(el); |
108 | this.vmlOffsets(el); |
109 | this.vmlOpacity(el); |
110 | if (el.isImg) { |
111 | this.copyImageBorders(el); |
112 | } |
113 | }, |
114 | attachHandlers: function (el) { |
115 | var self, handlers, handler, moreForAs, a, h; |
116 | self = this; |
117 | handlers = {resize: 'vmlOffsets', move: 'vmlOffsets'}; |
118 | if (el.nodeName == 'A') { |
119 | moreForAs = {mouseleave: 'handlePseudoHover', mouseenter: 'handlePseudoHover', focus: 'handlePseudoHover', blur: 'handlePseudoHover'}; |
120 | for (a in moreForAs) { |
121 | if (moreForAs.hasOwnProperty(a)) { |
122 | handlers[a] = moreForAs[a]; |
123 | } |
124 | } |
125 | } |
126 | for (h in handlers) { |
127 | if (handlers.hasOwnProperty(h)) { |
128 | handler = function () { |
129 | self[handlers[h]](el); |
130 | }; |
131 | el.attachEvent('on' + h, handler); |
132 | } |
133 | } |
134 | el.attachEvent('onpropertychange', this.readPropertyChange); |
135 | }, |
136 | giveLayout: function (el) { |
137 | el.style.zoom = 1; |
138 | if (el.currentStyle.position == 'static') { |
139 | el.style.position = 'relative'; |
140 | } |
141 | }, |
142 | copyImageBorders: function (el) { |
143 | var styles, s; |
144 | styles = {'borderStyle':true, 'borderWidth':true, 'borderColor':true}; |
145 | for (s in styles) { |
146 | if (styles.hasOwnProperty(s)) { |
147 | el.vml.color.shape.style[s] = el.currentStyle[s]; |
148 | } |
149 | } |
150 | }, |
151 | vmlFill: function (el) { |
152 | if (!el.currentStyle) { |
153 | return; |
154 | } else { |
155 | var elStyle, noImg, lib, v, img, imgLoaded; |
156 | elStyle = el.currentStyle; |
157 | } |
158 | for (v in el.vml) { |
159 | if (el.vml.hasOwnProperty(v)) { |
160 | el.vml[v].shape.style.zIndex = elStyle.zIndex; |
161 | } |
162 | } |
163 | el.runtimeStyle.backgroundColor = ''; |
164 | el.runtimeStyle.backgroundImage = ''; |
165 | noImg = true; |
166 | if (elStyle.backgroundImage != 'none' || el.isImg) { |
167 | if (!el.isImg) { |
168 | el.vmlBg = elStyle.backgroundImage; |
169 | el.vmlBg = el.vmlBg.substr(5, el.vmlBg.lastIndexOf('")')-5); |
170 | } |
171 | else { |
172 | el.vmlBg = el.src; |
173 | } |
174 | lib = this; |
175 | if (!lib.imgSize[el.vmlBg]) { /* determine size of loaded image */ |
176 | img = document.createElement('img'); |
177 | lib.imgSize[el.vmlBg] = img; |
178 | img.className = lib.ns + '_sizeFinder'; |
179 | 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! */ |
180 | imgLoaded = function () { |
181 | this.width = this.offsetWidth; /* weird cache-busting requirement! */ |
182 | this.height = this.offsetHeight; |
183 | lib.vmlOffsets(el); |
184 | }; |
185 | img.attachEvent('onload', imgLoaded); |
186 | img.src = el.vmlBg; |
187 | img.removeAttribute('width'); |
188 | img.removeAttribute('height'); |
189 | document.body.insertBefore(img, document.body.firstChild); |
190 | } |
191 | el.vml.image.fill.src = el.vmlBg; |
192 | noImg = false; |
193 | } |
194 | el.vml.image.fill.on = !noImg; |
195 | el.vml.image.fill.color = 'none'; |
196 | el.vml.color.shape.style.backgroundColor = elStyle.backgroundColor; |
197 | el.runtimeStyle.backgroundImage = 'none'; |
198 | el.runtimeStyle.backgroundColor = 'transparent'; |
199 | }, |
200 | /* 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 */ |
201 | vmlOffsets: function (el) { |
202 | var thisStyle, size, fudge, makeVisible, bg, bgR, dC, altC, b, c, v; |
203 | thisStyle = el.currentStyle; |
204 | 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}; |
205 | fudge = (size.L + size.bLW == 1) ? 1 : 0; |
206 | /* vml shape, left, top, width, height, origin */ |
207 | makeVisible = function (vml, l, t, w, h, o) { |
208 | vml.coordsize = w+','+h; |
209 | vml.coordorigin = o+','+o; |
210 | vml.path = 'm0,0l'+w+',0l'+w+','+h+'l0,'+h+' xe'; |
211 | vml.style.width = w + 'px'; |
212 | vml.style.height = h + 'px'; |
213 | vml.style.left = l + 'px'; |
214 | vml.style.top = t + 'px'; |
215 | }; |
216 | 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); |
217 | makeVisible(el.vml.image.shape, (size.L + size.bLW), (size.T + size.bTW), (size.W), (size.H), 1 ); |
218 | bg = {'X':0, 'Y':0}; |
219 | if (el.isImg) { |
220 | bg.X = parseInt(thisStyle.paddingLeft, 10) + 1; |
221 | bg.Y = parseInt(thisStyle.paddingTop, 10) + 1; |
222 | } |
223 | else { |
224 | for (b in bg) { |
225 | if (bg.hasOwnProperty(b)) { |
226 | this.figurePercentage(bg, size, b, thisStyle['backgroundPosition'+b]); |
227 | } |
228 | } |
229 | } |
230 | el.vml.image.fill.position = (bg.X/size.W) + ',' + (bg.Y/size.H); |
231 | bgR = thisStyle.backgroundRepeat; |
232 | dC = {'T':1, 'R':size.W+fudge, 'B':size.H, 'L':1+fudge}; /* these are defaults for repeat of any kind */ |
233 | altC = { 'X': {'b1': 'L', 'b2': 'R', 'd': 'W'}, 'Y': {'b1': 'T', 'b2': 'B', 'd': 'H'} }; |
234 | if (bgR != 'repeat' || el.isImg) { |
235 | 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 */ |
236 | if (bgR.search('repeat-') != -1) { /* now let's revert to dC for repeat-x or repeat-y */ |
237 | v = bgR.split('repeat-')[1].toUpperCase(); |
238 | c[altC[v].b1] = 1; |
239 | c[altC[v].b2] = size[altC[v].d]; |
240 | } |
241 | if (c.B > size.H) { |
242 | c.B = size.H; |
243 | } |
244 | el.vml.image.shape.style.clip = 'rect('+c.T+'px '+(c.R+fudge)+'px '+c.B+'px '+(c.L+fudge)+'px)'; |
245 | } |
246 | else { |
247 | el.vml.image.shape.style.clip = 'rect('+dC.T+'px '+dC.R+'px '+dC.B+'px '+dC.L+'px)'; |
248 | } |
249 | }, |
250 | figurePercentage: function (bg, size, axis, position) { |
251 | var horizontal, fraction; |
252 | fraction = true; |
253 | horizontal = (axis == 'X'); |
254 | switch(position) { |
255 | case 'left': |
256 | case 'top': |
257 | bg[axis] = 0; |
258 | break; |
259 | case 'center': |
260 | bg[axis] = 0.5; |
261 | break; |
262 | case 'right': |
263 | case 'bottom': |
264 | bg[axis] = 1; |
265 | break; |
266 | default: |
267 | if (position.search('%') != -1) { |
268 | bg[axis] = parseInt(position, 10) / 100; |
269 | } |
270 | else { |
271 | fraction = false; |
272 | } |
273 | } |
274 | bg[axis] = Math.ceil( fraction ? ( (size[horizontal?'W': 'H'] * bg[axis]) - (size[horizontal?'w': 'h'] * bg[axis]) ) : parseInt(position, 10) ); |
275 | if (bg[axis] % 2 === 0) { |
276 | bg[axis]++; |
277 | } |
278 | return bg[axis]; |
279 | }, |
280 | fixPng: function (el) { |
281 | el.style.behavior = 'none'; |
282 | var lib, els, nodeStr, v, e; |
283 | if (el.nodeName == 'BODY' || el.nodeName == 'TD' || el.nodeName == 'TR') { /* elements not supported yet */ |
284 | return; |
285 | } |
286 | el.isImg = false; |
287 | if (el.nodeName == 'IMG') { |
288 | if(el.src.toLowerCase().search(/\.png$/) != -1) { |
289 | el.isImg = true; |
290 | el.style.visibility = 'hidden'; |
291 | } |
292 | else { |
293 | return; |
294 | } |
295 | } |
296 | else if (el.currentStyle.backgroundImage.toLowerCase().search('.png') == -1) { |
297 | return; |
298 | } |
299 | lib = DD_belatedPNG; |
300 | el.vml = {color: {}, image: {}}; |
301 | els = {shape: {}, fill: {}}; |
302 | for (v in el.vml) { |
303 | if (el.vml.hasOwnProperty(v)) { |
304 | for (e in els) { |
305 | if (els.hasOwnProperty(e)) { |
306 | nodeStr = lib.ns + ':' + e; |
307 | el.vml[v][e] = document.createElement(nodeStr); |
308 | } |
309 | } |
310 | el.vml[v].shape.stroked = false; |
311 | el.vml[v].shape.appendChild(el.vml[v].fill); |
312 | el.parentNode.insertBefore(el.vml[v].shape, el); |
313 | } |
314 | } |
315 | el.vml.image.shape.fillcolor = 'none'; /* Don't show blank white shapeangle when waiting for image to load. */ |
316 | el.vml.image.fill.type = 'tile'; /* Makes image show up. */ |
317 | el.vml.color.fill.on = false; /* Actually going to apply vml element's style.backgroundColor, so hide the whiteness. */ |
318 | lib.attachHandlers(el); |
319 | lib.giveLayout(el); |
320 | lib.giveLayout(el.offsetParent); |
321 | el.vmlInitiated = true; |
322 | lib.applyVML(el); /* Render! */ |
323 | } |
324 | }; |
325 | try { |
326 | document.execCommand("BackgroundImageCache", false, true); /* TredoSoft Multiple IE doesn't like this, so try{} it */ |
327 | } catch(r) {} |
328 | DD_belatedPNG.createVmlNameSpace(); |
329 | DD_belatedPNG.createVmlStyleSheet(); |