Logo Adobe Certified Expert (ACE) und Adobe Certified Instructor (ACI) für Adobe Acrobat

02. Juni 2006

CSS: die Spezifität eines Selectors bestimmen

w3c-LogoIn der täglichen Arbeit mit CSS stoße ich immer wieder auf das Phänomen, dass eine Stildefinition scheinbar keine Auswirkung hat. Zum Beispiel definiere ich in einen längeren Stylesheet: p {line-height: 1.6em} und es wirkt sich nicht aus. Erst wenn ich diverse, früher eingeführte Selektoren davor setze, funktioniert es: #inhalt #linkeSpalte p {...}. Der Grund war mir bisher nicht klar, erst ein Tipp in der deutschen Typo3-Mailingliste hat mich auf die richtige Spur gebracht.

Wann sich ein Selektor oder eine Selektorkombination durchsetzt wird als »Spezifität eines Selektors« bezeichnet. Und natürlich gibt es bei w3c eine exakte Definition dafür, die ich mir bisher nie genau angesehen habe. Leider, sonst hätte ich mit derartigen Problemen nicht so viel Zeit verschwendet. Da ich diese Definition für sehr wichtig halte und sie in den einschlägigen CSS-Büchern kaum erwähnt wird, möchte ich sie hier kurz darstellen. Das englische Original ist hier zu finden.

Die Spezifität eines Selektors wird über vier getrennte Schritte (a, b, c und d) bestimmt, die jeweils eine Ziffer ergeben. Diese Ziffern werden dann zu einer Zahl zusammengesetzt:

a  b  c  d
0  0  1  2

Die Definition mit der höheren Zahl (= höheren Spezifität) entscheidet darüber, welche Definition sich durchsetzt.

Die Spezifität eines Selektors wird folgendermaßen errechnet:

  • a: bekommt den Wert 1, wenn es sich um ein "style"-Attribut handelt. Wenn nicht, wird der Wert 0. Da eine "style"-Definition keine weiteren Selectoren hat, ist der resultierende Wert immer 1.0.0.0. Und das ist auch der höchste zu erreichende Wert – womit erklärt ist, warum sich "style"-Attribute immer durchsetzen.
  • b: die Anzahl der ID-Attribute im Selektor: "#inhalt #linkeSpalte" bekommt den Wert 0.2.0.0
  • c: die Anzahl anderer Attribute und Pseudoklassen im Selektor: ".meineKlasse" bekommt den Wert 0.0.1.0
  • d: die Anzahl von Elementnamen und Pseudo-Elementen im Selektor: "ul li" bekommt den Wert 0.0.0.2
 *             {}  /* a=0 b=0 c=0 d=0 -> specificity = 0,0,0,0 */
 li            {}  /* a=0 b=0 c=0 d=1 -> specificity = 0,0,0,1 */
 li:first-line {}  /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
 ul li         {}  /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
 ul ol+li      {}  /* a=0 b=0 c=0 d=3 -> specificity = 0,0,0,3 */
 h1 + *[rel=up]{}  /* a=0 b=0 c=1 d=1 -> specificity = 0,0,1,1 */
 ul ol li.red  {}  /* a=0 b=0 c=1 d=3 -> specificity = 0,0,1,3 */
 li.red.level  {}  /* a=0 b=0 c=2 d=1 -> specificity = 0,0,2,1 */
 #x34y         {}  /* a=0 b=1 c=0 d=0 -> specificity = 0,1,0,0 */
 style=""          /* a=1 b=0 c=0 d=0 -> specificity = 1,0,0,0 */

Und schon wird völlig klar, wann sich welcher Selektor durchsetzt ... Es ist also nicht nur die Reihenfolge, wie ich fälschlicherweise immer geglaubt habe. Im Gegenteil: die Reihenfolge spielt nur eine Rolle, wenn die Selektoren die gleiche Spezifität haben.

Damit erklärt sich auch mein eingangs geschildertes Problem: Wenn ich irgendwo im Quelltext mal #inhalt p {} definiert habe, kann ich das nicht mit p {} ausser Kraft setzen. Der erste Fall hat die Spezifität 0.1.0.1 und der zweite nur 0.0.0.1. Erst wenn ich auch bei der zweiten Definition einen ID-Selektor davor setze, wird es funktionieren.

Von Peter am 02.06 um 11:00 Uhr. Kategorie: HTML-CSS | Netzwelt

Trackbacks

  1. Trackback-URL: http://www.lisardo.biz/trackback/437/Wb1fMJcf/

Kommentare

  1. Um den unvermeidlichen Kommentarspam zu verringern, musste ich leider einige Hürden einbauen: zunächst muss eine gültige E-Mailadresse eingegeben werden, die allerdings auf der öffentlichen Webseite nicht erscheint. Ausserdem kann der Kommentar erst nach dem Aufrufen einer eigenen Vorschau-Seite gespeichert werden. Sie müssen ausserdem einen Namen angeben (Vorname, Nachname, Spitzname oder Pseudonym).



Persönliche Angaben merken
Emailbenachrichtigung?

Aktuelle Seminartermine:

PSO-Workflow-Kompentenzen: Normgerechte PDF-Daten erstellen nach PSO
17. September 2008, Skill GmbH in Ismaning, München Mehr Infos …
Seminar: Adobe Acrobat im PDF Workflow
30. September 2008, Skill GmbH in Ismaning, bei München Mehr Infos …
Seminar: Adobe Acrobat – PDF-Prüfung und Korrektur mit PitStop
08. Oktober 2008, Skill GmbH in Ismaning, bei München Mehr Infos …

Seminarkalender abonnieren

Icon einer Kalenderdatei
Seminarkalender als .ics-Datei: Für Kalenderanwendungen herunterladen (alle Systeme)
Icon einer Kalenderdatei
Seminarkalender für iCal: Kalender abonnieren (nur Mac OS X)