Created
February 19, 2014 15:03
-
-
Save wizard04wsu/9093850 to your computer and use it in GitHub Desktop.
IE 6 PNG fix
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This fixes the transparency of PNG images in IE 6, for both image elements and background image styles. | |
This also requires a 1-pixel transparent GIF "blank.gif" in the same directory as "iepngfix.htc". | |
Put the HTML below into <head>, make sure the path to "iepngfix.htc" is correct, and apply it to specific elements instead of everything. | |
<!--[if lte IE 6]> | |
<style type="text/css" media="all"> | |
* { behavior:url(/css/iepngfix.htc); } /*IE 6 PNG fix*/ | |
</style> | |
<![endif]--> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<public:component> | |
<script type="text/javascript"> | |
// IE5.5+ PNG Alpha Fix v2.0 Alpha | |
// (c) 2004-2009 Angus Turnbull http://www.twinhelix.com | |
// This is licensed under the GNU LGPL, version 2.1 or later. | |
// For details, see: http://creativecommons.org/licenses/LGPL/2.1/ | |
var IEPNGFix = window.IEPNGFix || {}; | |
IEPNGFix.data = IEPNGFix.data || {}; | |
// CONFIG: blankImg is the path to blank.gif, *relative to the HTML document*. | |
// Try either: | |
// * An absolute path like: '/images/blank.gif' | |
// * A path relative to this HTC file like: thisFolder + 'blank.gif' | |
var thisFolder = document.URL.replace(/(\\|\/)[^\\\/]*$/, '/'); | |
IEPNGFix.blankImg = thisFolder + 'blank.gif'; | |
IEPNGFix.fix = function(elm, src, t) { | |
// Applies an image 'src' to an element 'elm' using the DirectX filter. | |
// If 'src' is null, filter is disabled. | |
// Disables the 'hook' to prevent infinite recursion on setting BG/src. | |
// 't' = type, where background tile = 0, background = 1, IMG SRC = 2. | |
var h = this.hook.enabled; | |
this.hook.enabled = 0; | |
var f = 'DXImageTransform.Microsoft.AlphaImageLoader'; | |
src = (src || '').replace(/\(/g, '%28').replace(/\)/g, '%29'); | |
if ( | |
src && !(/IMG|INPUT/.test(elm.nodeName) && (t != 2)) && | |
elm.currentStyle.width == 'auto' && elm.currentStyle.height == 'auto' | |
) { | |
if (elm.offsetWidth) { | |
elm.style.width = elm.offsetWidth + 'px'; | |
} | |
if (elm.clientHeight) { | |
elm.style.height = elm.clientHeight + 'px'; | |
} | |
if (elm.currentStyle.display == 'inline') { | |
elm.style.display = 'inline-block'; | |
} | |
} | |
if (t == 1) { | |
elm.style.backgroundImage = 'url("' + this.blankImg + '")'; | |
} | |
if (t == 2) { | |
elm.src = this.blankImg; | |
} | |
if (elm.filters[f]) { | |
elm.filters[f].enabled = src ? true : false; | |
if (src) { | |
elm.filters[f].src = src; | |
} | |
} else if (src) { | |
elm.style.filter = 'progid:' + f + '(src="' + src + | |
'",sizingMethod="' + (t == 2 ? 'scale' : 'crop') + '")'; | |
} | |
this.hook.enabled = h; | |
}; | |
IEPNGFix.process = function(elm, init) { | |
// Checks the onpropertychange event (on first 'init' run, a fake event) | |
// and calls the filter-applying-functions. | |
if ( | |
!/MSIE (5\.5|6)/.test(navigator.userAgent) || | |
typeof elm.filters == 'unknown' | |
) { | |
return; | |
} | |
if (!this.data[elm.uniqueID]) { | |
this.data[elm.uniqueID] = { | |
className: '' | |
}; | |
} | |
var data = this.data[elm.uniqueID], | |
evt = init ? { propertyName: 'src,backgroundImage' } : event, | |
isSrc = /src/.test(evt.propertyName), | |
isBg = /backgroundImage/.test(evt.propertyName), | |
isPos = /width|height|background(Pos|Rep)/.test(evt.propertyName), | |
isClass = !init && ((elm.className != data.className) && | |
(elm.className || data.className)); | |
if (!(isSrc || isBg || isPos || isClass)) { | |
return; | |
} | |
data.className = elm.className; | |
var blank = this.blankImg.match(/([^\/]+)$/)[1], | |
eS = elm.style, | |
eCS = elm.currentStyle; | |
// Required for Whatever:hover - erase set BG if className changes. | |
if ( | |
isClass && (eS.backgroundImage.indexOf('url(') == -1 || | |
eS.backgroundImage.indexOf(blank) > -1) | |
) { | |
return setTimeout(function() { | |
eS.backgroundImage = ''; | |
}, 0); | |
} | |
// Foregrounds. | |
if (isSrc && elm.src && { IMG: 1, INPUT: 1 }[elm.nodeName]) { | |
if ((/\.png/i).test(elm.src)) { | |
if (!elm.oSrc) { | |
// MM rollover compat | |
elm.oSrc = elm.src; | |
} | |
this.fix(elm, elm.src, 2); | |
} else if (elm.src.indexOf(blank) == -1) { | |
this.fix(elm, ''); | |
} | |
} | |
// Backgrounds. | |
var bgSrc = eCS.backgroundImage || eS.backgroundImage; | |
if ((bgSrc + elm.src).indexOf(blank) == -1) { | |
var bgPNG = bgSrc.match(/url[("']+(.*\.png[^\)"']*)[\)"']/i); | |
if (bgPNG) { | |
if (this.tileBG && !{ IMG: 1, INPUT: 1 }[elm.nodeName]) { | |
this.tileBG(elm, bgPNG[1]); | |
this.fix(elm, '', 1); | |
} else { | |
if (data.tiles && data.tiles.src) { | |
this.tileBG(elm, ''); | |
} | |
this.fix(elm, bgPNG[1], 1); | |
this.childFix(elm); | |
} | |
} else { | |
if (data.tiles && data.tiles.src) { | |
this.tileBG(elm, ''); | |
} | |
this.fix(elm, ''); | |
} | |
} else if ((isPos || isClass) && data.tiles && data.tiles.src) { | |
this.tileBG(elm, data.tiles.src); | |
} | |
if (init) { | |
this.hook.enabled = 1; | |
elm.attachEvent('onpropertychange', this.hook); | |
} | |
}; | |
IEPNGFix.childFix = function(elm) { | |
// "hasLayout" fix for unclickable children inside PNG backgrounds. | |
var tags = [ | |
'a', | |
'input', | |
'select', | |
'textarea', | |
'button', | |
'iframe', | |
'object' | |
], | |
t = tags.length, | |
tFix = []; | |
while (t--) { | |
var pFix = elm.all.tags(tags[t]), | |
e = pFix.length; | |
while (e--) { | |
tFix.push(pFix[e]); | |
} | |
} | |
t = tFix.length; | |
if (t && (/relative|absolute/i).test(elm.currentStyle.position)) { | |
alert('IEPNGFix: Unclickable children of element:' + | |
'\n\n<' + elm.nodeName + (elm.id && ' id=' + elm.id) + '>'); | |
} | |
while (t--) { | |
if (!(/relative|absolute/i).test(tFix[t].currentStyle.position)) { | |
tFix[t].style.position = 'relative'; | |
} | |
} | |
}; | |
IEPNGFix.hook = function() { | |
if (IEPNGFix.hook.enabled) { | |
IEPNGFix.process(element, 0); | |
} | |
}; | |
IEPNGFix.process(element, 1); | |
</script> | |
</public:component> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment