Umgang mit IE-Hacks und anderen CSS-Dateien | 24. März 2007 um 20:55 Uhr / Webdesign
Über die Jahre habe ich eine Methode entwickelt wie ich mit CSS-Hacks für den IE umgehe. Ich denke dass sie mittlerweile so verfeinert ist, dass ich mich traue sie nun öffentlich vorzustellen. Es kann natürlich sein, dass der eine oder andere es genau so macht, oder vielleicht sogar noch besser, aber ich habe oft gesehen dass Kollegen eben damit sehr große Probleme haben.
Ich habe grundsätzlich immer 100% des CSS in externen Dateien und nutze nie Inlinestyle. Auch wenn es sowieso nur ganz sicher auf einer einzelnen Seite vorkommen wird, kommt bei mir alles in die externe CSS Datei. (Meist stellt sich nach einem halben Jahr heraus, dass man das doch noch ein zweites oder drittes mal gebrauchen könnte).
Druckstylesheet
Als erstes binde ich meine print.css ein. Es hat sich irgendwann herausgestellt, dass der IE manchmal die screen.css und print.css beim ausdrucken vermischt, wenn man die print.css nach der screen.css eingebunden hat. Deshalb mache ich das seit damals pauschal in dieser Reihenfolge und hatte seit dem diese Probleme nicht mehr. Ich binde all meine CSS-Dateien mit Hilfe des <link>-Tags ein.
<link rel="stylesheet" href="/css/print.css" type="text/css" media="print" />
Stylesheet für den Bildschirm
Ich binde als zweites meine screen.css ein. Dabei gebe ich als media zwei Sachen ein, screen und projection. Damit stelle ich sicher dass der Netscape 4.x gar kein CSS bekommt und die Inhalte so für die User sicher zugänglich sind, wenn auch nicht schön formatiert.
<link rel="stylesheet" href="/css/western/screen.css" type="text/css" media="screen, projection" />
Zusätzliches Stylesheet für den IE
Der Internet Exploerer braucht als einziger zusätzliche Angaben, die die anderen Browser verwirren würden. Ich binde für diesen Browser also eine zusätzliche CSS Datei ein, die ie.css.
Sie wird innerhalb eines Conditional Comments auch mit Hilfe des <link>-Tags eingebunden:
<!--[if IE]><link rel="stylesheet" href="/css/ie.css" type="text/css" /><![endif]-->
Wie man sieht binde ich das ohne die media Angabe ein, denn alle bisherigen IEs haben das Problem dass sie die media-Angaben innerhalb eines CCs leider sowieso nicht interpretieren wie ich gerade las. Hm, das könnte auch das komische Verhalten mit dem Drucklayout erklären, was ich weiter oben anmerkte.
CSS-Filter für die ie.css
Natürlich könnte ich für jede IE Version mit Hilfe von CCs eine extra CSS Datei einbinden. Wenn aber wieder eine neue Version herauskommt müsste ich wieder alle HTML Dateien ändern um diese hinzuzufügen. Deshalb bin ich zu der Überzeugung gekommen dass es viel praktischer ist nur eine einzelne CSS-Datei mit allen IE-Hacks zu haben und innerhalb dieser mit CSS-Filtern für die jeweiligen Versionen zu arbeiten.
Seit eh und je hilft mir bei der wahl des richtigen Filters für den IE die Seite CSS für alle Browser von Kristof Lipfert. Hier eine kleine Auswahl:
/* -- alle IE (incl. 7) -- */
#nav li { height: 1%; }
/* -- IE7 -- */
h2 { *margin-top: -5px; }
/* -- IE <= 6 -- */
* html h1 { margin: 0 150px 50px -30px; }
* html img.alpha { behavior: url("/css/pngbehavior.htc"); }
/* -- IE 5.5 -- */
html. * .spalte { width: 28%; }
/* -- IE 5.0 -- */
html + body a.extlink { background: none; }
/* -- IE <= 5.5 -- */
* html .beispiel { content:"\"; overflow: auto; }
So kann ich meine eigentliche screen.css komplett von Hacks freihalten und sie sogar validieren (wenn ich nicht gerade opacity nutzen möchte). Auch der HTML-Code bleibt sauber und muss bei einer neuen IE-Version nicht verändert werden.
Nutzt ihr ähnliche Strategien, oder komplett andere? Was würdet ihr daran noch verbessern?
Kommentare
Die Kommentare sind für diesen Eintrag geschlossen.




abonnieren.
Tobi aus Raincastle schrieb am 25.03.2007
Für die unterschiedlichen IE Versionen nutze ich Conditional Comments. Die Hacks finde ich einfach zu umständlich. Und da bei meinen Seiten meist ein CMS zum Einsatz kommt, muss ein evtl. neues Stylesheet auch nicht in diversen HTML-Dateien, sondern nur im zentralen Template eingefügt werden.
Jeena Paradies aus Varberg schrieb am 25.03.2007
Wie machst du es dann mit Anpassungen, die für alle IE-Browser gelten, kopierst du diese in alle vier ie_x.css Dateien? Das finde wiederum ich sehr umständlich weil man nicht auf einen Blick sieht in welcher Datei man was ändern muss.
Du weißt auch dass jede zusätzliche Datei einen extra aufruf im Server bedeutet, auch wenn sie im Cache liegen (weil nachgefragt werden muss ob sich etwas verändert hat). Das kann bei größeren Seiten durchaus problematisch werden.
Anonym schrieb am 26.03.2007
Vorab sei erwähnt, dass ich alle Hacks für IE stets direkt da notier, wo auch alle weiteren Eigenschaften eines Elementes im Standardstylesheet stehen. So habe ich alle Eigenschaften sofort im Blick, welche sich Browserübergreifend auf das jeweilige HTML-Element auswirken. Jeder Hack wird von mir bewusst eingesetzt – auch nur wenn nötig versteht sich von selbst – so dass das Stylesheet im ersten Augenblick nicht valide erscheinen mag. Erstens kann ich hierdurch auf einen CC im HTML-Code verzichten und zweitens hilft es mir unheimlich die Übersicht zu behalten. Im Gegensatz dazu, wenn ich erst beim bearbeiten der Eigenschaften eines Elementes noch andere Stylesheets überblicken müsste, welche noch Sachen enthalten, die wiederum Eigenschaften (für spezielle Browserversionen) überschreiben könnten.
Ich verwende jeweils ein Stylesheet für Screen sowie Projection und eines für Print. Diese beiden importieren via »Escaped Comment-End« und @import-Rule weitere Stylesheets.
Die da wären (Basis):
- layout.css
- content.css
- … bei größeren Projekten, gern auch weiteres Splitting wie etwa eine form.css usw. So bekommt auch ein Nutzer mit IE 5.x auf dem Mac plain-HTML serviert.
Nicht wie im Stylesheet für den Bildschirm, werden im Printstyle jedoch neben dem Import der content.css auch allgemein gültige Eigenschaften notiert. Undezware um die für die Druckversion nicht benötigten Sachen via display: none; auszublenden. Das darf auch der IE 5.x auf dem Mac auslesen und verstehen.
Jetzt geht es aber erst richtig los. In die layout.css packe ich alles – wie der Name schon verrät – was mit dem Layout (Maße und Position der einzelnen Bereiche einer Seite) im entferntesten Sinne zu tun hat.
Die content.css enthält die Eigenschaften aller Inhaltselemente. Also jene Eigenschaften, die zur Formatierung aller HTML-Elemente nötig sind, womit Inhalte HTML-technisch ausgezeichnet werden, wie etwa table, ul, ol, p, h… und so auch für die Printversion von Interesse sind.
Die content.css wird durch die screen.css als auch die print.css importiert und verarbeitet. Also alle Eigenschaften die sowohl für Print als auch Bildschirm zur Anwendung kommen sollen, landen in der content.css. Alles andere lagere ich in die layout.css aus.
Falls ein Element mal an Stelle einer Hintergrundfarbe für die Druckversion einen Rahmen in der Farbe der Hintergrundfarbe erhalten soll, notiere ich zu erst den Rahmen und setzte diesen dann innerhalb @media screen, projection zurück und notiere weitere Eigenschaften wie etwa eine Hintergrundfarbe, welche *nur* für den Bildschirm gelten sollen. So fällt gleich ein Druckstyle mit ab und Eigenschaften müssen nicht unentwegt doppelt für screen und print notiert/gepflegt werden.
Jens Meiert aus Berlin schrieb am 13.04.2007
Ich bin so frei, in dieses Thema sowohl Hinweise auf einen alternativen und noch immer (mit üblichen Risiken) stabilen IE-Syntax-"Filter" sowie die generelle Problematik mit "Conditional Comments" einzurühren. Kann ich mir unmöglich verkneifen, Jeena ;)
Anonym schrieb am 23.04.2007
Meiner Meinung nach ist dein IE7 Hack nicht valide, siehe (http://www.thestyleworks.de/tut-art/ie7.shtml#ie7-hacks)
Valide wäre z.B. *:first-child+html h2 {color:red;}
mfg darki
Jeena Paradies aus Varberg schrieb am 23.04.2007
Der muss auch nicht valide sein, Anonym, denn er ist sowieso in einem conditional comment drinn.