Peter Bucher - Mein Experiment, meine Spielereien, meine Welt...   ·   Stefan Falz   ·   Jürgen Gutsch   ·   Golo Roden   ·   ASP.NET Zone   ·   Microsoft ASP.NET
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Mehrere CSS-Klassen im Selektor und IE6

Auf vielen Webauftritten sieht man des öfteren CSS-Navigationen die mehrfarbig sind, also jede Sparte ihre eigene Farbe hat.
Solch eine Formatierung ist auch gut mit CSS zu erreichen, jedoch wartet der Internet Explorer 6 mit einer Falle auf, wenn mehrere CSS-Klassen in einem Element benutzt und per Selektor selektiert werden.

Nützlich ist die mehrfache CSS-Klassen Zuweisung, wenn ein Element jeweils speziell formatiert werden möchte, die Standardformatierung jedoch als Grundlage verwendet werden möchte.

Bei folgendem CSS-Selektor wirkt der Punkt und die zweite CSS-Klasse als AND-Verknüpfung:

.nav1.active { /* Formatierung */ }

In Deutsch: Wenn ein Element die Klasse "nav1" und "active" besitzt, greift die Regel.
Mit dieser Art der Selektion hat allerdings der Internet Explorer 6 Probleme, er interpretiert diesen Selektor einfach als den folgenden:

.active { /* Formatierung */ }

Das erwünscht zu einem sehr unschönen Nebeneffekt, für die letzten Regel im CSS die zwei Klassen verknüpft greift im IE6 jeweils jedes Element das die Klasse "active" besitzt.
Die Fehlersuche bei einem solchen Fall erweist sich als sehr mühsam.

Um dieses Fehlverhalten des IE6 zu umgehen, bietet es sich an für die verschiedenen Navigationspunkte jeweils einen ID-Selektor zu benutzen - die Elemente sind ja auch eindeutig - das sieht dann bspw. so aus:

#nav1.active { /* Formatierung */ }

Damit hat der IE6 keine Probleme mehr, da der ID-Selektor ein Element darstellt und nicht eine Klasse irgend eines Elementes.
Mehr Infos zu dem Fehler, einem möglichen zweiten Workaround bei einer spezifischen Lösung finden sich hier:

Bild vom Resultat:

Folgendes Beispiel in eine Html-Datei kopiert zeigt das Fehlverhalten (Getestet kann bspw. mit dem IETester):

Update: Codetags rausgenommen, leider zerreisst es die Html-Tags.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Mehrere CSS-Klassen im Selektor und IE6 - Test</title>
    <style type="text/css">
        /* Allgemein */
        h1 { font-size: 0.9em; }
       
        li { display: inline; }
       
        a {
            display: block;
            float: left;
            color: Black;
            text-decoration: none;
            border: 1px solid gray;
            padding: 2px;
        }
       
        a:hover { text-decoration: underline; }
       
        br { clear: left; margin: 10px 0px; }
       
        .active { font-weight: bold; }
       
        /* Mehrfarbig (Mit Klassen) */       
        .multiColor a {
            border-bottom: 4px solid black;
        }
       
        .nav1 { background-color: #4c6691; }
        .nav1:hover { background-color: #8FA1BF; }
        .nav1.active { border-bottom: 4px solid #4c6691; }
       
        .nav2 { background-color: #C99F2E; }
        .nav2:hover { background-color: #DBB859; }
        .nav2.active { border-bottom: 4px solid #C99F2E; }
       
        .nav3 { background-color: #689341; }
        .nav3:hover { background-color: #99C373; }
        .nav3.active { border-bottom: 4px solid red; }
       
        /* Mehrfarbig (Mit IDs) */
        #n1 { background-color: #4c6691; }
        #n1:hover { background-color: #8FA1BF; }
        #n1.active { border-bottom: 4px solid #4c6691; }
       
        #n2 { background-color: #C99F2E; }
        #n2:hover { background-color: #DBB859; }
        #n2.active { border-bottom: 4px solid #C99F2E; }
       
        #n3 { background-color: #689341; }
        #n3:hover { background-color: #99C373; }
        #n3.active { border-bottom: 4px solid red; }
    </style>
</head>
<body>
    <h1>Normale Navigation</h1>
    <ul>
        <li><a href="#">Home</a></li>
        <li><a href="#" class="active">Über uns</a></li>
        <li><a href="#">Kontakt</a></li>
    </ul>
    <br />
    <h1>Mehrfarbige Navigation (Mehrere CSS-Klassen)</h1>
    <ul class="multiColor">
        <li><a class="nav1" href="#">Home</a></li>
        <li><a class="nav2 active" href="#">Über uns</a></li>
        <li><a class="nav3" href="#">Kontakt</a></li>
    </ul>
    <br />
    <h1>Test-Liste (IE6-Fehler)</h1>
    <ul>
        <li><a class="active" href="#">Test</a></li>
    </ul>
    <br />
    <h1>Mehrfarbige Navigation (Mehrere IDs)</h1>
    <ul class="multiColor">
        <li><a id="n1" href="#">Home</a></li>
        <li><a id="n2" class="active" href="#">Über uns</a></li>
        <li><a id="n3" href="#">Kontakt</a></li>
    </ul>
</body>
</html>

Veröffentlicht Mittwoch, 10. September 2008 20:07 von Peter Bucher
Abgelegt unter: , , , ,

Kommentare

# re: Mehrere CSS-Klassen im Selektor und IE6

Da muss man auch erstmal drauf kommen. Interessant, dass ich noch nie auf diesen Bug gestoßen bin. Danke für den Hinweis und den Workaround :-)

Donnerstag, 11. September 2008 22:43 by Jürgen Gutsch

# re: Mehrere CSS-Klassen im Selektor und IE6

Danke für deinen Kommentar Jürgen.

Ja, ich bin auch nur per Zufall auf den Bug gekommen. Hätte ich von Anfang an IDs benutzt, hätte ich ihn gar nie zu Gesicht bekommen :)

Zum Glück gibts so eine einfache Lösung und das passiert mir jetzt nicht mehr.

Freitag, 12. September 2008 02:46 by Peter Bucher
Anonyme Kommentare sind nicht zugelassen