ID Deines Bodys für mehr CSS-Kontrolle und Spezifität

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Nehmen wir an, du möchtest die Farbe deiner Links nur auf deiner Kontaktseite rot ändern. Auf allen anderen Seiten sind sie blau, aber es macht einfach Sinn, dass sie aus irgendeinem Grund auf deiner Kontaktseite rot sind. Es gibt ein paar Möglichkeiten, dies zu erreichen.

  • Du könntest eine separate Stylesheet für deine Kontaktseite deklarieren. Das ist nicht ideal, weil es redundant ist. Wenn du andere Änderungen vornimmst, musst du sie immer sowohl in der Haupt-Stylesheet als auch in der Stylesheet der Kontaktseite vornehmen.
  • Du könntest allen Links auf dieser Seite eine eindeutige Klasse geben. Das ist nicht ideal, weil es nicht sehr semantisch ist und auch redundant ist. Warum einer jeden einzelnen Link auf der Seite eine Klasse zuweisen, wenn sie sich kontextuell gesehen nicht von Links anderswo auf der Website unterscheiden?
  • Die beste Lösung ist, deinem Body eine eindeutige ID zu geben. Das löst das Problem perfekt. Du kannst dieselbe Stylesheet verwenden und nur die Links ansprechen, die du mit einem einzigen CSS-Selektor möchtest.

 

So wird's gemacht

Ganz einfach, weise der Body-Tag wörtlich die ID zu

   ...
</head>

<body id="contact-page">
   ...

Nun für unser Beispiel, bei dem wir alle Links auf der Kontaktseite rot statt blau machen, verwende einfach etwas CSS wie dieses

a { 
color: blue; 
}

#contact-page a {
   color: red;
}

 

Wie wäre es mit einem praktischeren Beispiel?

Verstanden. Eine der nützlichsten Anwendungen dieser Technik ist innerhalb der Navigation. Schau dir diese Beispielnavigation an

tabbednav.jpg

Siehst du, wie der Forums-Tab der "aktive" Tab ist? Sicherlich ist das nur eine kleine Änderung in CSS, wahrscheinlich nur eine Verschiebung der Position eines Hintergrundbildes. Vielleicht sieht das XHTML so aus

...
<li><a href="/fieldtips">Field tips</a></li>
<li class="active"><a href="/forums">Forums</a></li>
...

Die "aktive" Klasse, die dem Listenelement zugewiesen ist, verschiebt das Hintergrundbild. Das wird seinen Zweck erfüllen, aber was ist, wenn wir zur Feldtipps-Seite wechseln? Wir müssen die aktive Klasse vom Forums-Tab entfernen und sie dem Feldtipps-Tab zuweisen. Das ist nicht sehr praktisch. Das bedeutet, dass der Code für den Navigationsblock auf jeder einzelnen Seite der Website einzigartig ist. Sagen wir also, wir wollen später einen Kontakt-Tab hinzufügen, wir müssen den Code auf jeder einzelnen Seite ändern. Kein Spaß.

Machen wir das ein bisschen schlauer. Erstens wollen wir den Navigationsblock nicht auf jeder Seite einfügen, wir wollen ihn einbinden, wahrscheinlich mit einem einfachen PHP-Include wie diesem

<?php include_once("nav.html"); ?>

 

Aber wie weisen wir dann die "aktive" Klasse dem aktuellen Navigation List Element zu?

Hier kommt das zum Einsatz, was wir gerade über die Zuweisung eindeutiger IDs an den Body gelernt haben! Anstatt nur dem aktiven Listenelement eine Klasse zuzuweisen, weisen wir jedem einzelnen Listenelement eine eindeutige Klasse zu und geben unserem Body eine eindeutige ID.

   ...
</head>

<body id="field-tips">
   ...
   <li class="fieldtips"><a href="/fieldtips">Field tips</a></li>
   <li class="forums"><a href="/forums">Forums</a></li>
   ...

Jetzt können wir mit etwas cleverem CSS gezielt einzelne Elemente in der Navigation ansprechen

#field-tips li.fieldtips, #forums li.forums {
   background-position: bottom;
}

Das bedeutet, dass der Code für den Navigationsblock auf jeder Seite gleich bleiben kann, aber nur das Navigationselement, das dieser Seite entspricht, von diesem CSS beeinflusst wird und in den aktiven Zustand "wechselt".

 

Lassen wir es noch dynamischer werden

Leser Brian hinterließ einen tollen Kommentar darüber, wie man mit PHP die eindeutige ID dem Body-Element zuweisen kann

<body id="<?= basename($_SERVER['PHP_SELF'], ".php")?>">

Dies gibt den Namen der ausgeführten PHP-Datei als ID zurück (z. B. body id="index.php"). Um den .php-Teil wegzulassen, entferne einfach den Teil ".php".

Mehr Infos zu basename. Mehr Infos zu $_SERVER.

  • Andreas
    Permalink zu Kommentar#

    Das ist ein großartiger Trick und ich benutze ihn seit ein paar Jahren in meinem Framework.

    Zusätzlich zur ID, die die aktuelle Seite (Typ) darstellt, habe ich auch ein paar Klassen, die ich sehr nützlich finde


    <body id="home-page" class="rainy morning js-disabled not-logged-in">

    Das erste, was ich in meinem JS tue, ist $(‘body’).addClass(‘js-enabled’).removeClass(‘js-disabled’); Die Wetterklassen werden aus http://developer.yahoo.com/weather/ generiert.

    Um die Verwendung einer Klasse oder ID in jedem Navigationspunkt zu vermeiden, habe ich stattdessen angefangen, Attributselektoren zu verwenden

    #home-page #navigation a[href=”/”], #about-page #navigation a[href=”/about/”] { /* ausgewählte Navigationsstile */ }
    Zugegeben, die Abhängigkeit von den href-Attributen kann etwas unsicher sein, aber ich bin der einzige Entwickler auf meiner Website, also ist es für mich in Ordnung.

    Ich hänge auch "-page" an die Body-ID an, um doppelte IDs zu vermeiden.

    Guter Beitrag!

  • derry3
    Permalink zu Kommentar#

    Ja, auf diese Weise kann man eine bessere Kontrolle bekommen.

    Danke Chris Coyier für dieses Tutorial

  • Fred Campbell

    Großartige Arbeit! Habe noch nie mit dem Body-Tag gespielt, kann es kaum erwarten, es in meinem nächsten Projekt zu implementieren.

  • Phillip

    Hallo, ich habe diesen Trick kürzlich von einer anderen Website gelernt, habe aber eine Frage, die du vielleicht beantworten kannst... Ich habe eine Hauptnavigation, die ich mit dem Body-ID-Trick beeinflusst habe. Aber auf meinen Innenseiten habe ich eine weitere Sub-Navigation, die ich auch den gleichen Effekt haben möchte, wenn einer der Punkte angeklickt wird, möchte ich, dass er hervorgehoben bleibt, wenn die neue Seite geladen wird.
    Irgendwelche Ideen?

  • Chris Coyier

    @phillip: Du könntest der Body-Tag deiner Unterseiten Klassen hinzufügen. Wie

    <body id="body-portfolio" class="body-portfolio-audio">
    

    Verwende dann die ID, um die Hervorhebung der Hauptnavigation zu steuern, und die Klasse, um die Hervorhebung der Subnavigation zu steuern.

  • Sorin
    Permalink zu Kommentar#

    Guter Beitrag, aber ich habe eine Frage: Wie kann man die CSS mit der ID vom Body-Tag ändern, um die Stylesheet zu ändern, wie http://www.csszengarden.com es tut?

  • Andreas-L

    Wie funktioniert der Trick mit id="current"? Funktioniert er ohne Body-ID (oder andere ID), ohne PHP oder JavaScript?

    Woher weiß der Browser, welche die aktuelle Seite ist?

  • Kris
    Permalink zu Kommentar#

    Jahre nachdem dies geschrieben wurde, fand ich es sehr nützlich und es hat mir das Leben so viel einfacher gemacht. Danke. Ich habe das in meinen PHP-Headern verwendet und es funktionierte hervorragend mit meinen Sprites aus der statischen Version. Auf jeden Fall, wenn du diesen Kommentar siehst, kannst du mir bitte mitteilen, ob seitdem etwas aktualisiert wurde? Danke nochmal.

  • Hans J.J. Prins

    Netter Trick! Aber was machst du im Falle einer dynamisch generierten Liste? Lässt du PHP CSS generieren? Da ich Menüs fast immer basierend auf Datenbankinhalten generieren muss, ist das keine gute Option… Und ich möchte auf keinen Fall CSS in meinem HTML haben. Was ist, wenn ich mit LESS oder Sass kompiliere? Oder übersehe ich hier etwas?

  • Dieser Kommentarbereich ist geschlossen. Wenn Sie wichtige Informationen teilen möchten, kontaktieren Sie uns bitte.