PNG ohne Reue: Die Einschränkungen

Veröffentlicht am 12. April 2007

Als ich in meinen letzten Post zum Thema PNG verfasste, habe ich geschickterweise komplett vergessen, auf die Einschränkungen und wichtigen Details der PNG-Lösung hinzuweisen beziehungsweise eines dieser Probleme überhaupt zu recherchieren. Dies soll hier nachgeholt werden.

.HTC, Windows XP SP2 & Apache

Metax brachte mich darauf, nochmal zu recherchieren wie es um die Kompatibilität von .htc-Files steht. Dort gibt es in der Tat eine Lücke, denn der Apache Webserver liefert .htc-Dateien mit einem MIME-Type aus, den der Internet Explorer 6 unter Windows XP mit installiertem Service Pack 2 nicht annimmt. Dort wird text/x-component verlangt, der Apache aber sendet www/unknown.

Wie man das Problem (per .htaccess oder Serverkonfiguration) löst, kann man beim Support von Microsoft erfahren. Nutzer von Microsoft-Servern sollten sich hierüber keine Gedanken machen müssen.

Wie konfiguriere ich mein Hintergrund-PNG?

Eine nicht unberechtigte Frage von Jeena Paradies. Sie lässt sich auch (leider) sehr einfach mit gar nicht beantworten. Denn das was etwas leichtfertig als PNG für CSS-Hintergründe betitelt wurde, ist eigentlich kein richtiges CSS-Hintergrundbild:

(AlphaImageLoader Filter) displays an image within the boundaries of the object and between the object background and content, with options to clip or resize the image.

Eine mit dem Filter geladene Grafik kann man also nicht ohne weiteres positionieren oder kacheln - sie ist kein Hintergrundbild. Aus diesem Grund muss auch im IE-Stylesheet der eigentliche Hintergrund entfernt werden, sonst bekommt man das Hintergrundbild und das für den IE geladene PNG zu sehen.

Was an dieser Stelle vielleicht man ganz sinnvoll wäre, ist eine kurze Erklärung zum AlphaImageLoader und dem was dieser überhaupt kann. Hier nochmal das Beispiel aus dem ersten Artikel:

/* AlphaImageLoader in Aktion */
#element {
    width: 640px;
    background: none;
    filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=scale, src='bild.png');
}

Wie zu sehen ist, kennt der Filter drei Parameter. Während enabled und src wohl keiner Erklärung bedürfen, ist sizingMethod etwas interessanter, denn hier kann man etwas am Erscheinungsbild des Angezeigten verändern. Der Parameter kann einen von drei Werten annehmen:

crop: Clips the image to fit the dimensions of the object.
image:Default. Enlarges or reduces the border of the object to fit the dimensions of the image.
scale: Stretches or shrinks the image to fill the borders of the object.

Die einzigen Darstellungsoptionen die es gibt sind eine einfache Anzeige des Bildes links oben im betroffenen Element (crop) und ein Strecken des Bildes auf die Dimensionen des Elements (scale). Der andere Wert (image) reduziert das Element auf die Maße des Bildes und ist vermutlich in Sachen Hintergrund nur bedingt zu gebrauchen.

Also: Einen normalen gekachelten Hintergrund mit transparenten PNGs gibt es im Internet Explorer nicht. Man kann den AlphaImageLoader allerdings für Hintergrundbilder verwenden, wenn es sich um eine einfache Anzeige eines sich nicht wiederholenden, nicht positionierten Bildes handelt oder wenn das Strecken des PNGs eine optisch vertretbare Option darstellt - Bilder die nur 1px breit oder hoch sind sollten sich hierzu eignen. Eine positionierte, einfache Hintergrundgrafik könnte man unter Zuhilfenahme eines entsprechend platzierten Extra-Containers tricksen, in den dann das PNG gezeichnet wird.

Streikende Links

Ganz wichtig: Links in einem Container mit PNG-Hintergrund wie oben beschrieben funktionieren ohne weiteres nicht oder nur bedingt. Das liegt eben daran, dass das PNG irgendwo zwischen Inhalts- und Hintergrundebene umherschwirrt und dabei Links oder zumindest deren Mouseover-Effekte blockiert. Zum Glück lässt sich das recht einfach korrigieren:

/* In die ie.css */
#mein-png-container a {
    position: relative;
    z-index: 1000;
}

Das verändert nichts am Aussehen, bringt aber die Links wieder zum laufen. Weitere Fragen und Probleme bin ich gern bereit zu lösen.

PNG ohne Reue: Die definitive Lösung

Veröffentlicht am 10. April 2007

Da ja der Internet Explorer 5 so gut wie ausgestorben ist, steht dem Einsatz von PNG im Websites nichts mehr im Wege. Jedenfalls wurde das in der Vergangenheit mal von mir behauptet. Nun ist es an der Zeit, das Ganze auch einmal auszunutzen.

Das große Plus von PNG ist Alpha-Transparenz, die dem Webdesigner einiges erleichtert; der Nachteil ist die mangelhafte Unterstützung in älteren Versionen (6, 5.5) des Microsoft Internet Explorer. Und zumindest der IE6 wird uns noch einige Zeit erhalten bleiben. Das muss uns nicht aufhalten, allerdings sollten die Einschränkungen der im Folgenden beschriebenen Techniken beachtet werden!

Was ist .htc?

Sucht man im Internet nach nach einer Lösung für das Problem, findet man eine ganze Reihe Abhilfe versprechende .htc-Dateien. Bei .htc handelt es sich um DHTML-Scripts, mit denen man dem Internet Explorer neue Sachen beibringen kann.

For Microsoft Internet Explorer 5 and later, HTML Components (HTCs) provide a mechanism to implement components in script as Dynamic HTML (DHTML) behaviors. An HTC is an HTML file that contains script and a set of HTC-specific elements that define the component; it is saved with an .htc extension.

Beispielsweise sorgt ein solches Script dafür, dass die CSS-Navigation von Kram-hochladen.de auch im IE funktioniert - die vom Internet Explorer normalerweise nur rudimentär vorhandene Unterstützung für die CSS-Pseudoklasse :hover wird durch die .htc als DHTML-Script simuliert. So lange der IE-Surfer Javascript nicht abschaltet, merkt er davon nichts.

PNG für IMG-Elemente

Mit .htc-Dateien kann man auch dem Internet Explorer 6 und 5 PNG-Support für <img>-Elemente einreden. Von den vielen Scripts die man hierzu finden kann, empfehle ich PNG Behavior von WebFX, denn es funktioniert im Gegensatz zu vielen anderen perfekt und kann frei benutzt werden:

Notice that the PNG Behavior does not require any license. You may use it in any way you see fit as long as credit is given where credit is due. In other words, don't claim you create it and don't try to make money directly from it.

Was genau macht nun pngbehavieror.htc? Streng genommen ist die Behauptung Der IE kann keine transparenten PNGs nicht ganz richtig. Er kann schon, man muss ihm nur mit etwas MS-eigenem CSS auf die Sprünge helfen. Ein wie folgt eingebundenes PNG würde im IE vollkommen problemlos dargestellt werden:

<img
    src="unsichtbar.gif"
    style="width:100px;
           height:100px;
           filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='bild.png', sizingMethod='scale');"
/>

Es wird also anstelle der eigentlichen Grafik ein unsichtbares GIF eingebunden und das PNG mit einem speziellen Microsoft-Filter darübergehext. Das ist natürlich in dieser Form keine Lösung für den normalen Einsatz, aber genau an dieser Stelle hilft uns PNG Behavior. Das Script in .htc-Datei durchforstet nämlich den Quelltext der Seite nach PNG-Dateien und wendet auf sie den Filter an. Der Einbau eines .htc-Scripts ist denkbar einfach und wird via CSS durchgeführt:

img {
    behavior:url('pngbehavior.htc');
}

Da die CSS-Eigenschaft behavior beim CSS Validator für Unmut sorgt, ist es ratsam obrige CSS-Zeile in einen IE-spezifischen Stylesheet zu verfrachten, der via Conditional Comments eingebunden wird. Zwingend notwendig ist das nicht, da nur der IE etwas mit behavior anfangen kann - alle anderen Browser irgnorieren diese Angabe.

In PNG Behavior von WebFX kann man in Zeile 45 der Datei pngbehavior.htc noch genauer festlegen, welche PNGs vom Script bearbeitet werden sollen und welche nicht. Auch sollte in Zeile 48 der Pfad zum unsichtbaren GIF überprüft werden; stimmt dieser nicht, sind PNGs zwar transparent, aber von einem hässlichen Rahmen umgeben.

Nach dem Einbinden der .htc-Datei via CSS und der Anpassung der Zeilen 45 und 48 in pngbehavior.htc stellen IE5.5 und IE6 PNG-Bilder fehlerfrei dar.

PNG für CSS-Hintergründe

Obwohl es Scripts geben soll, die auch die Transparenz von Hintergrund-PNGs korrigieren können sollen, konnte ich keines finden, das wirklich funktionierte. Das macht allerdings nichts, denn meist sind ja Hintergrundbilder ohnehin per CSS-Datei und nicht als Inline-Anweisung realisiert. Da bietet es sich an, den PNG-Filter für betroffene Elemente einfach in den gleichen IE-spezifischen Stylesheet einzubinden, in dem schon die behavior-Anweisung steht.

/* style.css */
div.box {
    background:url(img/zb_mid.png) repeat-y top center;
}

/* ie.css */
div.box {
    width:640px;
    background:none;
    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=scale, src='img/zb_mid.png');
}

Es wird also im IE-Stylesheet einfach der Hintergrund ganzlich entfernt und stattdessen das PNG mit dem Microsoft-Filter geladen. Dieser besteht außerdem in jedem Fall auf eine Breitenangabe des betroffenen Elements, was aber auch kein Problem darstellt.

Zusammenfassung

Alle Internet Explorer, die aktueller als Version 5 sind, können transparente PNGs darstellen. Allerdings muss man es allen die älter als Version 7 sind erst klar machen. Das geschieht für <img>-Elemente mittels PNG Behavior fast automatisch und bei Hintergrundbildern durch das manuelle Aufrufen des IE-eigenen PNG-Loaders. Weil alles in einem IE-eigenen Stylesheet stattfindet (Conditional Comments), beklagt sich darüber auch kein Validator und kein anderer Browser.

Es gibt also wirklich keinen Grund mehr, sich in Sachen PNG zurückzuhalten. Die Seite von Neff ist ein Beispiel die oben erklärten Techniken.

Nachtrag I (11. April, 13:25 Uhr)

Bitte dringend die untenstehenden Kommentare lesen! Es scheint, als würde Windows XP SP2 die .htc-Dateien nicht ohne weiteres von Apache-Servern annehmen. Wer das fragliche Betriebssystem zur Hand hat, möge bitte testen ob Hayungs.de jetzt korrekt dargestellt wird und seinen Befund als Kommentar hinterlassen.

Nachtrag II (13. April, 1:30 Uhr)

Bitte dringend lesen: PNG ohne Reue - Die Einschränkungen! Das ist der Folgeartikel zu diesem und befasst sich mit Problemen bei der Benutzung der in diesem Artikel beschriebenen Techniken.

Nachtrag III (9. Mai, 16:20 Uhr)

Einen nicht überraschenden, aber doch wichtigen Hinweis zu Formularen auf transparentem Hintergrund im Internet Explorer möchte ich an dieser Stelle auch nicht unerwähnt lassen.

Browserstatistiken sind Lug und Trug

Veröffentlicht am 26. November 2006

Der, um in der Sprache der BusinessWeek.com-Headline zu bleiben, Endsieg der Mozilla Foundation ist nah, glaubt man den genannten Statistiken. Diese stammen von WebSideStory, einem Unternehmen für Internet-Marktanalysen, und bescheinigen Deutschland einen IE-Anteil von nur noch kümmerlichen 65,04%. Jeder vierte Deutsche soll Firefox-Nutzer sein.

Das klingt ja recht schön, aber bei solchen Statistiken muss man natürlich fragen, wie sie denn zustande kommen. In diesem Fall ist es einfach: Sie stammen von genau jenen Websites, die das WebSideStory-Produkt HBX On-Demand Web Analytics einsetzen. Aus dem Press Release (Hervorhebung von mir):

For the month of June 2006, Germany averaged a Firefox usage rate of 26.80 percent, followed by France (14.89 percent), Italy (12.46), Spain (9.86) and the U.K. (8.82), according to the WebSideStory Index, a statistical barometer featuring global Internet user trends culled from the millions of daily visitors to web sites using the company’s award-winning web analytics technology, HBX Analytics.

Die Vermutung liegt nahe, dass der für diese Statistik herangezogene Stichprobenumfang nicht viel taugt. Doch es heißt, WebSideStory sei mit ihrem HBX Marktführer in Sachen Website-Analyse - vielleicht ist es Programm ja so weit verbreitet, dass die Statistik doch zu etwas nützt? Um das zu ermitteln, sollte man einmal herausfinden was das feine Programm denn so kostet. Die HBX-Website selbst nennt keinen Preis, sondern fordert einen Suchenden nur stets auf, doch einen Sales Executive zu kontaktieren. Billig wird's also kaum sein. Bemüht man Google, findet man auch konkrete Zahlen, nach denen sich jedes Jahr HBX-Benutzung mit mindestens $15.000 zu Buche schlägt.

Wer außer einigen großen Unternehmen wird sich so etwas leisten? Die Macher von WebSideStory mögen (nach eigener Aussage) mit ihrem Programm Marktführer sein, mehr als einen Bruchteil des Internets können sie auch nicht erfassen. Selbst in ihrem die Statistiken veröffentlichenden Press Release steht es!

More than 1,300 enterprises worldwide are using one or more components of the Active Marketing Suite to optimize their online business.

Dieser Bruchteil kann nicht repräsentativ sein, wenn er voraussetzt, dass eine Website mindestens $15.000 auf den Tisch legen muss um erfasst zu werden. Und da das Internet eben nicht zum Großteil aus den 1.300 Websites millionenschwerer Konzerne besteht, ist diese an allen Ecken und Enden genannte Statistik gänzlich wertlos - wie eigentlich jede Browserstatistik, von der man behauptet, sie würde das ganze Internet umfassen.

Spamschutz leichtgemacht

Veröffentlicht am 14. September 2006

Kaum hatte ich einen wüsten Wutanfall zum Thema Captcha gelesen, da machte Gaim pling und Frank, mein alter Schulkamerad und persönlicher Lieblingsprovider von Messetechnik (nicht dass ich jetzt so übermäßig viele kennen würde) erzählte mir von seinem aktuellen Spamproblem

Nachdem ein Bot ein Kontaktformular auf einer seiner zahlreichen Websites genutzt hatte, um ihm (ungelogen) stündlich 300 patente Diättipps zukommen zu lassen, war jetzt das Gästebuch seiner wichtigsten Seite dran. Alle 60 Minuten kamen sechs Einträge, die die Vorzüge eines bestimmten potenzfördernden Generikas priesen. Angesichts des Alters derer, die normalerweise Franks Events besuchen, würde ich fast vermuten, dass man dort eher mit zu viel als mit zu wenig Potenz zu kämpfen hat... aber Marketingstrategie ist eben nichts für Spambots.

Es kann so einfach sein

Das Idioten-Captcha
Meine Sicherheitsabfrage. Funktioniert wirklich prima.

Diese sind nämlich strunzdumme Maschinen. Man soll seinen Gegner nie unterschätzen, sicherlich, aber wenn man ihn überschätzt, tut man sich selbst auch nichts gutes. Und das tun viele, so zum Beispiel auch ich... bis ich den eingangs genannten Artikel las. Weil ich keine Lust hatte, für Frank irgendein abgefahrenes Hightech-Captcha zu installieren, habe ich einfach als Experiment das dümmstmögliche gebaut.

Damit nicht der Eindruck entsteht, dies sei eine komplizierte Angelgenheit... es handelt sich um nichts weiter als das Bild eines Elefanten. Das Script prüft einfach, ob die Frage mit Elefant beantwortet wurde (Rechtschreibfehler und originelle Groß- und Kleinschreibung werden akzeptiert) und speichert dann den Kommentar.

Das Bild ändert sich nie. Die Antwort ist immer Elefant. Das ist die dümmste Sicherheitsabfrage der Welt. Und sie funktioniert.

Mit Kanonen auf Spatzen

Nutzlos und lästig.
Spät am Abend ist sowas zu hoch für mich. Wenn es ein Spambot drauf anlegen würde, würde er dieses Ding überwinden. Nur passiert das eben nicht.

Es ist technisch durchaus möglich, Captchas durch Maschinen knacken zu lassen. Nur passiert das praktisch kaum, höchstens wenn ein Spambot gezielt auf eine bestimmte Captcha-Software angesetzt wird. Warum sollte man sich dann die Mühe machen? Normale Captchas sind ab einem gewissen Müdigkeitsgrad auch für optisch optimal ausgerüstete Menschen nicht mehr zu knacken und unter der Bilderzeugung schwitzt unnötig der Server.

Wenn man's barrierefrei halten möchte, sollte statt eines Bildes vielleicht eine einfache (nicht-mathematische) Frage gestellt werden, zum Beispiel Wie lautet der Vorname von Franz Beckenbauer?.