Wie kann man PNG-Alphatransparenz im IE nutzen? 09. Juni 2007 um 18:02 Uhr / Webdesign
Vor zwei Jahren habe ich den durchaus erfolgreichen Artikel PNG - die Vorurteile und die Fakten geschrieben. Darin lege ich dar, dass man Alphatransparente PNGs in allen (aktuellen) Browsern nutzen kann, und dass nur der IE kleiner Version 7 eine Sonderbehandlung braucht. Ich legte aber nicht dar wie.
Das möchte ich heute nachholen. Dazu müssen wir uns eigentlich nur den IE 6 und IE 5.5 für Windows angucken. Der IE 5.0 für Windows kann überhaupt nicht mit der Alphatransparenz umgehen, er wird aber auch an sich kaum mehr benutzt. Und die hier vorgestellten Lösungen sind meiner Meinung nach das kleinste Übel. Dazu aber später mehr.
AlphaImageLoader Filter
Soweit ich es verstanden habe hatten die Jungs von Microsoft zwar schon eine Methode um alphatransparente PNGs in Ihrem Browser anzuzeigen zur Verfügung, aber damals nicht genügend Zeit um es sinnvoll zu implementieren. Deshalb konnte man alphatransparente PNGs nur über eine spezielle ActiveX-Komponente (eine Art Plugin) laden, die den Namen AlphaImageLoader trägt. Wenn man JavaScript im IE abschaltet wird auch ActiveX abgeschalten und somit funktioniert diese Methode nicht mehr. Was aber nichts ausmacht, da dann einfach das PNG mit der voreingestellten Hintergrundfarbe angezeigt wird.
Im IE läd man diese Komponente über die IE-eigene CSS-Eigenschaft filter:
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop src='mypic.png')
Das ganze funktioniert im Prinzip genau so wie die CSS-Eigenschaft background-image: url(mypic.png), nur dass das Bild relativ zur aufgerufenen Seite gesucht wird anstatt relativ zur externen CSS-Datei. Man sollte deshalb die Pfade immer absolut angeben.
Hintergrundbilder
Für Hintergrundbilder ist das ja dann so kein Problem, bei mir sieht das dann in etwa so aus:
#foo { background: url(mypic.png) red; }
* html #foo {
background-image: none;
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop src='mypic.png')
}
Dabei gibt es folgendes zu beachten:
- Man kann die Hintergrundbilder, die mit dem AlphaImageLoader geladen wurden nicht positionieren. D.h., dass man das nur da anwenden kann wo die Bilder oben links anfangen, oder der Hintergrund eine feste Größe hat, so dass man ein großes Bild reinmachen kann und das leere mit transparenz füllen kann.
- Und im IE 5.0 wird dieses Hintergrundbild nicht angezeigt. Da wir aber Inhalte sowieso nicht im CSS transportieren macht das nichts, denn da wird es in einem alten Browser einfach nicht so gut dargestellt, das ist alles.
- Das CSS wird dadurch invalide, ich lege solche Sachen in eine zusätzliche IE-Stylesheet-Datei, die ich mit Conditional-Comments einbinde.
Normale Bilder
Bei Bildern die Inhalte vermitteln und via <img src="myimg.png" alt="Blume"> eingebunden werden ist das ganze ein wenig schwieriger. Man muss das Bild wegmachen und es mit einem anderen Element ersetzen, das dann das Bild mit Hilfe des AlphaImageLoaders als Hintergundbild darstellt. Das Element benötigt natürlich auch die gleiche Größe wie das Bild und es müssen alle Attribute übertragen werden wie CSS-Klassen usw.
Da der AlphaImageLoader sowieso von JavaScript abhängig ist können wir die ganze Friemelarbeit auch gleich JavaScript selbst erledigen lassen. Glücklicherweise hat sich da vor einiger Zeit Bob Osola die Mühe gemacht und das Problem gelöst:
/*
* Correctly handle PNG transparency in Win IE 5.5 & 6.
* http://homepage.ntlworld.com/bobosola. Updated 18-Jan-2006.
* Use in <HEAD> with DEFER keyword wrapped in conditional comments:
* <!--[if lt IE 7]>
* <script defer type="text/javascript" src="pngfix.js"></script>
* <![endif]-->
*/
var arVersion = navigator.appVersion.split("MSIE")
var version = parseFloat(arVersion[1])
if ((version >= 5.5) && (document.body.filters))
{
for(var i=0; i<document.images.length; i++)
{
var img = document.images[i]
var imgName = img.src.toUpperCase()
if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
{
var imgID = (img.id) ? "id='" + img.id + "' " : ""
var imgClass = (img.className) ? "class='" + img.className + "' " : ""
var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
var imgStyle = "display:inline-block;" + img.style.cssText
if (img.align == "left") imgStyle = "float:left;" + imgStyle
if (img.align == "right") imgStyle = "float:right;" + imgStyle
if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
var strNewHTML = "<span " + imgID + imgClass + imgTitle
+ " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
+ "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
+ "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>"
img.outerHTML = strNewHTML
i = i-1
}
}
}
Wie oben im Kommentar angemerkt sollte man das JavaScript als externe JS-Datei so einbinden: <!--[if lt IE 7]><script defer type="text/javascript" src="pngfix.js"></script><![endif]-->
Durch das Attribut defer wird das JavaScript erst aufgerufen, wenn das HTML heruntergeladen wurde. Man sollte den Bildern aber height und onload aufrufen zu müssen und sichtbares Flackern zu bekommen.
Jetzt haben wir zwei einfache Methoden alphatransparente PNGs in allen heute benutzten Browsern mit kleinen Einschränkungen nutzen zu können. Eine für (nicht positionierte) Hintergrundbilder und eine für normale Bilder mit Inhalt.
Zusätzlicher Lesestoff
- PNG - die Vorurteile und die Fakten
- Wann kommt der IE 5.x Nachruf?
- IE7 Transparent PNG Implementation
- AlphaImageLoader Filter
- Umgang mit IE-Hacks und anderen CSS-Dateien
- The PNG problem in Windows Internet Explorer
- Cross-Browser Variable Opacity with PNG: A Real Solution
Pingbacks
- miese Gedanken » Transparente PNGs transparent
- PNG-Alphatransparenz im Internet Explorer » Peruns Weblog
- ovaler Button - Rand zu pixelig! - Photoshop @ tutorials.de: Forum, Tutorial, Anleitung, Schulung & Hilfe
- http://xhtmlforum.de/48267-png-und-ie6.html#post352105
- http://xhtmlforum.de/49503-halbtranzaprente-grafiken.html#post363538
- Wordpress Java scribt - Forum Fachinformatiker.de
- Layoutcheck - Sportverein - XHTMLforum




abonnieren.
Horst Scheuer aus Otzberg schrieb am 10.06.2007
Prima Artikel! Ich werde ihn in meiner Bookmarksammlung erwähnen.
Siechfred schrieb am 11.06.2007
Was mir am letzten Codeschnipsel nicht gefällt, ist das Ermitteln der IE-Version via UserAgent-String. Schöner wären da Conditional Compilations oder die proprietären ScriptEngine-Funktionen. Die JScript-Version dürfte bestenfalls 5.5 sein (Übersicht).
Gruß,
Siechfred
Metty aus Zülpich schrieb am 13.06.2007
Manueller Trackback:
http://www.discobeats.de/2007/06/13/transparente-png-in-ie6/
:-)
Vaeron aus NRW schrieb am 18.06.2007
DANKE DANKE DANKE!
Ich wäre heute fast verzweifelt! Diese dämliche Pfadangabe!
Hab 20 Workshops ausprobiert und es hat nie geklappt weil ich die pngs relativ zur CSS Datei gelinkt habe!
DANKE für die Auflösung! :)
timmae aus Deutschland schrieb am 03.07.2007
Hallo Jeena und alle anderen!
Ich benutze beide PNG-Fixes für den IE (Bilder als auch Hintergrundbilder).
Warum funktionieren meine Menü-Verweise dann nicht mehr? Was mach ich falsch? Menü liegt über den PNG-Hinterrundbildern.
Vielleicht kann jemand mit mehr Ahnung mir helfen ;-)
Danke im Voraus
Jeena Paradies aus Varberg schrieb am 03.07.2007
Ich hatte ein ähnliches Problem einmal, und lösen konnte ich es durch explizites position: relative; (und evtl. display: block; )
Benjamin aus Berlin schrieb am 03.07.2007
Ok, dass habe ich überlesen, geht also nicht ein Bild mit diesem Workaround repeaten zu lassen.
Jeena Paradies aus Varberg schrieb am 03.07.2007
Nein, leider nicht, auch nicht wiederholen zu lassen.
nitnat aus Karlsruhe, Deutschland schrieb am 05.07.2007
super erklärt, hat mir sehr viel weitergeholfen!
Ingo Chao aus Göttingen schrieb am 06.07.2007
Bei dem Problem mit den nicht funktionierenden Links muss die Fälle abgrenzen, in denen der Block mit dem Filter selbst positioiniert wurde. Dann hilft der einfache position:relative hack nicht. Man kann sich behelfen, indem man dem positionierten Block den Filter wegnimmt und den Filter dafür auf ein sich innen anschmiegendes, nichtpositioniertes div legt.
Meerblickzimmer schrieb am 25.07.2007
Hei! Super Artikel und es klappt bei fast allem, nur dann nicht: Hast du ein Hintegrundbild mit einem repeat drin, dann klappt es nicht. Ist ja auch logisch, da die IE-Variante ein background: none; hat und das andere Bild "normal" eingefuegt wird. Nur, kennst du oder jmd. anderes noch eine Methode fuer Hintergrundbilder mit repeat. In meinem Fall ist es "nur" ein repeat-x. Danke und viele Gruesse! M
Nils schrieb am 05.09.2007
Das Problem habe ich leider auch. Nur musste ich feststellen, dass es schlichtweg nicht geht. Konnte keine Lösung finden und habe jetzt eine weniger detailreiche Grafik von 1px höhe über die ganze höhe - in deinem Fall die Breite - skaliert.
Unschön, aber was will man machen?
Nici schrieb am 30.04.2009
schreibt doch einfach background-image:none; anstatt background:none; dann wird die Positionierung beibehalten und trotzdem wird das png umgewandelt - Google Maps macht das beim Infofenster auch so und es klappt wunderbar.