CSS-Angaben vor dem Internet Explorer 8 mit Selektoren verstecken

Manchmal möchte man bestimmte Formatierungen vor älteren Internet Explorern verstecken. Im Beitrag zeige ich zwei Möglichkeiten, wie man Selektoren formuliert, dass sie vom IE8 ignoriert werden.

Eine Lösung besteht darin, den Selektor um Bestandteile zu ergänzen, die die älteren IEs (d.h. IE < 9) nicht verstehen – etwa durch :root.

:root input[type=checkbox] {
/* original check box are push outside the viexport */
position: absolute;
left: -1000em;
}

Dieser Code stammt aus einem Beispiel zur Erstellung angepasster Checkboxen (https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Forms/Advanced_styling_for_HTML_forms).

Vor dem Selektor, der vom IE8 ignoriert werden soll, wird :root ergänzt.

:root zur Auswahl des Wurzelelements

:root ist eine in CSS3 eingeführte Pseudoklasse, die das Wurzelelement des Dokuments auswählt. Mit :root input[type=checkbox] wählt man alle Checkboxen aus, die Nachfahren des Wurzelelements sind. Da ja alle Elemente Nachfahren des Wurzelelements sind, ist das keine Einschränkung – ausgewählt werden alle Checkboxen. Da jedoch der IE8 :root nicht versteht, kann er diesen Ausdruck nicht interpretieren.

Das heißt, bei allen Angaben, die nicht vom IE8 gelesen werden sollen, ergänzt man :root vor dem Selektor.

Problem Spezifität

Etwas unpraktisch an dieser Lösung ist, dass für Browser, die :root interpretieren, es einen Unterschied zwischen den beiden Selektoren gibt:

input[type=checkbox]

und

:root input[type=checkbox]

Das Letztere hat eine höhere Spezifität. Und das kann eine Rolle spielen, wenn man im Weiteren einen solchen Ausdruck überschreiben möchte.

Besser: Selektorgruppe

Die zweite Lösung, bei der wir die Spezifität nicht ändern, besteht darin, mit einer Selektorgruppe zu arbeiten, eine Selektorgruppe ist eine durch Komma getrennte Liste von Selektoren. Denn in CSS gilt: Wenn ein Selektor einer Selektorgruppe formal ungültig ist, wird der ganze Ausdruck ignoriert. In der W3C-Spezifikation heißt es: „If just one of these selectors were invalid, the entire group of selectors would be invalid.“ (http://www.w3.org/TR/css3-selectors/)

Das heißt, wir müssen nur am Anfang einen Selektor ergänzen, der für moderne Browser formal korrekt ist, aber kein Element auswählt, und der für ältere IEs formal nicht korrekt ist. Da wäre beispielsweise

* :root

Das wählt das Wurzelelement aus, das innerhalb eines beliebigen Elements steht, d.h. konkret kein Element. Aber der Trick: der Selektor ist formal korrekt, d.h. die danach hinter einem Komma angeführten weiteren Selektoren werden normal interpretiert – von modernen Browsern, aber nicht vom IE8.

Wenn ich ein Element mit der Klasse zwei nur in modernen Browsern formatieren möchte, muss ich also schreiben:

* :root, .zwei { }

Vom IE8 ignorierte Selektorenausdrücke

Sehen wir uns das konkret an einem kleinen Beispiel mit zwei Elementen an:

<div class="eins"></div>
<div class="zwei"></div>

Gehen wir davon aus, dass beide Elemente Hintergrundfarben erhalten sollen, aber nur in modernen Browsern und nicht im IE8. Einmal verwenden wir den Kombinator, der eben eine höhere Spezifität hat:

:root .eins {
background: green;
}

Und jetzt nehmen wir den Selektor-Gruppierungstrick:

* :root, .zwei {
background: blue;
}

In beiden Fällen klappt es: Moderne Browser weisen die Hintergrundfarbe zu, der IE8 nicht.

linke ohne Hintergrundfarben (IE), recht mit Hintergrundfarben (moderner Browser)

Der Vorteil in der zweiten Methode liegt aber darin, dass ich den eigentlichen Selektor nicht verändert habe.

Selektor-Gruppierungstrick bei jsFiddle ausprobieren

Das war nur ein Beispiel, Angaben zu verstecken. Es gibt – je nach den Erfordernissen der Situation – natürlich passendere/elegantere Methoden: So kann man Modernizr zur Feature-Detection verwenden oder man kann mit konditionalen Kommentaren um das HTML-Element arbeiten, die einem passende Klassen für die IEs zuweisen.  Aber manchmal braucht man eben auch die schnelle Möglichkeit, das rein über Selektoren zu erledigen … und dann kann das Gezeigte praktisch sein.

Kommentare? Gerne :-)

HTML: Folgender HTML-Code kann verwendet werden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>