Externe Links ohne automatische Inhalte auszeichnen

Veröffentlicht am 10. Juni 2007

Links, die von der eigenen Seite fortführen, kann und sollte man gesondert markieren. Das kommt der Usability zugute und ist auch aus rechtlicher Sicht zumindest nicht schädlich. Auf meiner Seite hier sind externe Links mit einem kleinen Pfeil am Ende gekennzeichnet. Realisiert ist das Ganze mit CSS2-Selektoren, die natürlich im Internet Explorer nicht funktionieren, aber ansonsten sehr bequem sind. So weit, so unspektakulär.

Interessant wird es, wenn man sich einmal ansieht, wie derartige Grafikanhängsel meist eingefügt werden. Oft wird an dieser Stelle weiter fortschrittliches CSS verwendet und man greift zu automatischen Inhalten. Das sieht dann in der Regel so oder ähnlich aus:

/* Erst mal allen Links, die mit http:// beginnen eine Grafik verpassen... */
a[href^="http://"]:link::after, a[href^="http://"]:visited::after {
    content:url("link_normal.png");
}
a[href^="http://"]:hover::after, a[href^="http://"]:active::after {
    content:url("link_hover.png");
}

/* ...und die dann wieder da entfernen, wo es nach dem http:// mit der Adresse MEINER Website weitergeht */
a[href^="http://www.seite.de"]:link::after,
a[href^="http://www.seite.de"]:visited::after,
a[href^="http://www.seite.de"]:hover::after,
a[href^="http://www.seite.de"]:active::after {
    content(" ");
}

Diese Methode funktioniert an sich auch ganz prächtig, aber einiges stört bei diesen mit content:url("") eingefügten Bildern ganz gewaltig: Link und Bild können durch einen Zeilenumbruch voneinander getrennt werden. So steht dann in der einen Zeile ein externer Link ohne Markierung und in der nächsten eine Markierung ohne Link. Hinzu kommt, dass das Entfernen von eingefügten Inhalten problematisch ist, denn je nach Browser ist entweder content:" ";, content:""; oder content:none; die einzige Lösung, die nicht ungewollte Leerstellen oder seltsames Verhalten der Links mit sich bringt.

Die Lösung: Vergessen wir die automatischen Inhalten und nehmen doch wieder Hintergrundbilder zur Hand.

/* Erst mal allen Links, die mit http:// beginnen eine Grafik verpassen... */
a[href^="http://"]:link, a[href^="http://"]:visited {
    padding-right:16px;
    background-image:url("link_normal.png");
    background-repeat:no-repeat;
    background-position:bottom right;
}
a[href^="http://"]:hover, a[href^="http://"]:active {
    padding-right:16px;
    background-image:url("link_hover.png");
    background-repeat:no-repeat;
    background-position:bottom right;
}

/* ...und die dann wieder da entfernen, wo es nach dem http:// mit der Adresse MEINER Website weitergeht */
a[href^="http://www.seite.de"]:link,
a[href^="http://www.seite.de"]:visited,
a[href^="http://www.seite.de"]:hover,
a[href^="http://www.seite.de"]:active {
    background-image:none;
    padding:0;
}

Das führt bei weniger Notwendigkeit für noch nicht ganz ausgereifte CSS2-Implementierungen zum optisch fast identischen Ergebnis, allerdings ohne das Problem bei Zeilenumbrüchen. Nachteilig ist, dass man diese Technik (logischerweise) nicht mit Hintergrundgrafik-Unterstreichungen kombinieren kann. Wer Zeichen statt Grafiken verwenden möchte (z.B. →) kommt ebenfalls an automatischen Inhalten und den damit verbundenen Problemen nicht vorbei.

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.