Making IE use PNG Alpha transparency

Navigation

Skip navigation.

Site search

Site navigation

Deprecated

This fix is deprecated and is no longer supported (meaning that I will not help you to get it working with your pages). It was only written to fill the gap while waiting for Internet Explorer to implement PNG alpha. That has now happened in IE 7. Although this fix can make it work in IE 6 as well, that is counter productive for the future of the Web. IE 6 is a major problem to Web developers (IE 7 is a problem as well, but for now, let's overlook that, since it does at least implement PNG alpha), and the sooner it stops being used, the better.

Instead of using this hack, users of IE 6 should be encouraged to upgrade to IE 7. Users who cannot upgrade to IE 7 (because IE 7 is not being released for most Windows operating systems) should use a better browser, such as Opera or Firefox. They have been abandoned by Microsoft.

What is PNG?

PNG is an image format that combines the best features of GIF and JPG/JPEG, the traditional and most common image formats used on the World Wide Web. PNG is supported by virtually all major and minor browsers that are in use today.

What is wrong with the PNG format?

Well, ... nothing. The problem is that the most popular browser - Internet Explorer 6- for Windows - does not natively understand Alpha transparency, even though Gecko browsers, KHTML/WebKit browsers, Opera, Internet Explorer Mac and several minor browsers all do. It displays normal PNGs correctly, and version 4 and up can handle binary transparency if the palette is saved with the image, but as soon as any Alpha transparency is applied, the transparency is replaced with the image's background colour. This is what Internet Explorer 6- normally shows when a PNG image with alpha transparency is placed over another image (the green box is there just so that you can see what's happening):

Image with no Alpha transparency

But this is what it should show:

Image with no Alpha transparency

'But you said you could make it work!'

And I can! You see, Internet Explorer supports some extra style features for providing transitions and filters to images, so you can do wipes and fade-ins and lots of other tricks that should really be left to PowerPoint. However, two of these can help here. One is the AlphaImageLoader, which applies an image to the background of any element whose height and width are both explicitly set (or if the position: absolute; style is set) and supports full Alpha transparency. It is supported from Internet Explorer 5.5. The second is Alpha, which can be used to provide Alpha transparency to any element, making the element transparent. There are two versions of this filter, one that works in all versions of Internet Explorer 4+ for Windows, and one that works in version 5.5 and above. As the AlphaImageLoader works only from 5.5, I will use the Alpha for version 5.5+ as well. IE 7 does support alpha transparency, so I will exclude it from this fix.

Using these filters this way means that no JavaScript is required, no browser detects are required and no conditional comments are required. All browsers that do not understand Alpha (including earlier versions of IE for Windows and IE5.5/Win with stylesheets disabled - a very difficult thing to do!) will display the image in the non-Alpha format.

You may also notice that I set display:inline-block on the span. This is actually the effect we need, since the span will be displaying the image, and it needs to be allowed to accept size. IE only partially understands inline-block, but fortunately it understands enough to use it here (this is only needed in IE 6 when you use a strict doctype - other versions always asume inline-block when you give dimensions, however it is a good idea to always include it just in case you change doctypes later). Unfortunately this may have unwanted alignment effects in other browsers, but that will be solved by using conditional comments (see below).

<span style="width:400px;height:32px;display:inline-block;
/* the height and width should match those of the image */
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='varyAlpha.png');
/* apply the background image with Alpha in IE5.5/Win. The src should match that of the image */
"><img style="
filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);
/* make the real image fully transparent in IE5.5/Win, so the Alpha image can show through */
" src="varyAlpha.png" width="400" height="32" border="0" alt=""></span>

If you need the image to display at any other size than its natural size, change this:

(src='varyAlpha.png')

To this:

(src='varyAlpha.png',sizingMethod='scale')

And make sure that the size of the image in the IMG tag, and the size of the span match the chosen size.

Result:

Image with Alpha transparency

Just make sure that there is no whitespace (tab, space or linebreak characters) between the IMG and the SPAN tags.

Making it validate

This is not valid CSS, and it may cause problems in IE 7. If you want to make it valid, you can put the extra CSS in a conditional comment, and use that to protect IE 7, make it work in IE 5.5-6, and allow your page to validate. However, this would need to contain one CSS rule for each image, as the filter needs to be different for each image. For this reason, I assign an ID to each span, and then use the ID to set the filter.

<!--[if gte IE 5.5]>
<![if lt IE 7]>
<style type="text/css">
#alImg1 img, #alImg2 img { filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0); }
#alImg1, #alImg2 { display: inline-block; }
#alImg1 { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='varyAlpha.png'); }
#alImg2 { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='alphaTwo.png'); }
</style>
<![endif]>
<![endif]-->

...

<span id="alImg1" style="width:400px;height:32px;">
<img src="varyAlpha.png" width="400" height="32" border="0" alt=""></span>
<span id="alImg2" style="width:30px;height:50px;">
<img src="alphaTwo.png" width="30" height="50" border="0" alt=""></span>
This site was created by Mark "Tarquin" Wilton-Jones.
Don't click this link unless you want to be banned from our site.