Können Sie den Unterschied zwischen diesen beiden Selektoren erkennen?
#header.callout { }
#header .callout { }
Sie sehen fast identisch aus, aber die obere hat keinen Leerraum zwischen #header und .callout, während die untere einen hat. Dieser kleine Unterschied macht einen großen Unterschied in dem, was er tut. Für einige von Ihnen mag der obere Selektor wie ein Fehler erscheinen, aber es ist tatsächlich ein sehr nützlicher Selektor. Sehen wir uns den Unterschied an, was der obere Selektor bedeutet und erkunden wir mehr von diesem Stilselektor.
Hier ist die „einfache Sprache“ von #header .callout
Wählen Sie alle Elemente mit dem Klassennamen callout aus, die Nachfahren des Elements mit der ID header sind.
Hier ist die „einfache Sprache“ von #header.callout
Wählen Sie das Element aus, das die ID header und auch den Klassennamen callout hat.
Vielleicht macht diese Grafik das deutlicher

Kombinationen von Klassen und IDs
Der Hauptpunkt hierbei ist, dass Sie Elemente, die Kombinationen von classes und IDs haben, ansprechen können, indem Sie diese Selektoren ohne Leerzeichen aneinanderreihen.
ID- und Klassenselektor
Wie oben bereits erwähnt, können Sie Elemente mit einer Kombination aus ID und class ansprechen.
<h1 id="one" class="two">This Should Be Red</h1>
#one.two { color: red; }
Doppelklassenselektor
Zielen Sie auf ein Element, das alle von mehreren classes hat. Unten mit zwei classes gezeigt, aber nicht auf zwei beschränkt.
<h1 class="three four">Double Class</h1>
.three.four { color: red; }
Mehrfach
Wir sind hier nicht auf zwei beschränkt, wir können so viele classes und IDs zu einem einzigen Selektor kombinieren, wie wir wollen.
.snippet#header.code.red { color: red; }
Obwohl man bedenken muss, dass das schon ein wenig lächerlich wird.
Erfahren Sie mehr über die Auswahl von IDs, Klassen und mehreren Klassen bei DigitalOcean.
Beispiel
Wie nützlich ist das wirklich? Insbesondere bei IDs, sie sollen sowieso eindeutig sein, warum also mit einer class kombinieren? Ich gebe zu, die Anwendungsfälle für die ID-Versionen sind geringer, aber es gibt sicherlich Anwendungen. Eine davon ist das einfache Überschreiben von Stilen.
#header { color: red; }
#header.override { color: black; }
Die zweite zielt auf dasselbe Element, überschreibt aber die Farbe, anstatt zu haben
.override { color: black !important }
Oder vielleicht wird der Selektor mit etwas noch Spezifischerem vorangestellt.
Nützlicher sind mehrere classes und deren Verwendung im „objektorientierten“ CSS-Stil, der gerade im Trend liegt. Nehmen wir an, Sie hatten eine Menge divs auf einer Seite und haben verschiedene beschreibende class-Namen darauf verwendet.
<div class="red border box"></div>
<div class="blue border box"></div>
<div class="green border box"></div>
<div class="red box"></div>
<div class="blue box"></div>
<div class="green box"></div>
<div class="border box"></div>
Sie alle teilen sich die class „box“, die vielleicht eine Breite oder eine Hintergrundtextur festlegt, etwas, das sie alle gemeinsam haben. Dann haben einige von ihnen Farbnamen als classes, dies wäre zur Steuerung der Farben im Inneren der Box. Vielleicht bedeutet Grün, dass die Box einen grünlichen Hintergrund und hellgrünen Text hat. Ein paar von ihnen haben einen class-Namen von „border“, vermutlich hätten diese dann einen Rahmen, während die anderen keinen hätten.
Richten wir also etwas ein
.box { width: 100px; float: left; margin: 0 10px 10px 0; }
.red { color: red; background: pink; }
.blue { color: blue; background: light-blue; }
.green { color: green; background: light-green; }
.border { border: 5px solid black; }
Cool, wir haben hier eine gute Werkzeugkiste, mit der wir neue Boxen erstellen können und eine Vielzahl von Optionen haben, wir können eine Farbe wählen und ob sie einen Rahmen hat oder nicht, nur durch die Anwendung einiger ziemlich semantischer classes. Der Klassename „toolbox“ ermöglicht es uns auch, eindeutige Kombinationen dieser classes anzusprechen. Zum Beispiel funktioniert vielleicht der schwarze Rahmen nicht auf den roten Boxen, beheben wir das.
.red.border { border-color: #900; }

Basierend auf dieser Demoseite.
Spezifität
Es ist auch wichtig zu beachten, dass die Spezifitätswerte von Selektoren wie diesem das gleiche Gewicht tragen wie wenn sie getrennt wären. Das ist es, was ihnen die Überschreibungskraft verleiht, wie im obigen Beispiel.
Erfahren Sie mehr über Spezifität in CSS bei DigitalOcean.
Browserkompatibilität
Alle guten aktuellen Browser unterstützen dies, ebenso wie IE ab Version 7. IE 6 ist ziemlich seltsam. Es wählt basierend auf dem letzten Selektor in der Liste aus. Also „.red.border“ wählt basierend auf „.border“ aus, was die Sache ruiniert. Aber wenn Sie IE 6 unterstützen, sind Sie ohnehin an solche Spielchen gewöhnt und können sie einfach mit bedingten Stilen beheben.
Danke für diesen tollen Überblick ;)
Sie haben die anfänglichen Beschreibungen vertauscht, obwohl die folgende Grafik richtig ist. `#header.callout` ist das Element mit sowohl id=”header” als auch class=”callout”, während `#header .callout` ein Kind mit class=”callout” des Elements mit id=”header” ist.
Ich wollte das nur anmerken :)
Die Bilder zeigen es aber richtig.
Gut, dass ich nicht der Einzige war, der stutzte?
Tatsächlich betrifft #header .callout das/die Element(e) mit der Klasse = callout, das/die Nachfahre(n) (nicht Kinder) des Elements mit id=header ist/sind.
Für Kindelemente wäre es #header > .callout.
Richtig. „Nachfahren“ ist der korrektere Begriff.
Genau wie Chris – Sie haben die Beschreibungen vertauscht..
Wow! Das ist großartig. Das ist das erste Mal, dass ich von dieser Kombination von Selektoren gehört habe. Es wird äußerst hilfreich sein, um die Anzahl der divs innerhalb von divs zu reduzieren. Toller Beitrag. Danke.
Das ist eine großartige Übersicht über Selektoren und die Unterschiede zwischen ihnen. Danke!
Wie Chris Pratt sagte, haben Sie die englischen Klartextversionen Ihrer Klassen verwechselt.
Trotzdem schöner Artikel. Danke.
Ich werde diese ID + Klassenregeln noch einmal überprüfen müssen. Wir haben angefangen, viele davon beim letzten Job zu verwenden – dann haben wir sie alle entfernt, als sie in IE6 nicht wie erwartet funktionierten. Mir war nie bewusst, dass IE6 nur den ersten Selektor verwendete. Da ich sowieso ein bedingtes Stylesheet für IE6 verwende – scheint dies eine großartige Option zu sein, zu der ich zurückkehren kann.
Passiert das noch jemandem? Immer wenn ich so etwas finde, das nicht in allen Browsern funktioniert, baue ich eine Art mentale Blockade auf, die es mir nicht erlaubt, diese Technik mehr anzuwenden – und denke nie an eine einfache Lösung dafür.
Laut CSS The Missing Manual Second Edition
„Wenn mehr als ein Stil gilt
für ein Tag, muss ein Webbrowser
ermitteln, welcher Stil „gewinnen“ soll
soll, wenn Stileigenschaften
konfliktieren. In CSS ist die
Wichtigkeit eines Stils als Spezifität
bekannt und wird durch die Art der
verwendeten Selektoren bestimmt, wenn
der Stil erstellt wird. Jeder Selektor-Typ hat einen
unterschiedlichen Wert, und wenn mehrere
Selektor-Typen in einem Stil vorkommen –
zum Beispiel der absteigende
Selektor #banner p – werden die Werte von
allen verwendeten Selektoren addiert.“
Beispiel
Selektor ID Klasse Tag Gesamt
p 0 0 1 1
.byline 0 1 0 10
p.byline 0 1 1 11
#banner 1 0 0 100
#banner p 1 0 1 101
#banner .byline 1 1 0 110
a:link 0 1 1 11
p:first-line 0 0 2 2
h2 strong 0 0 2 2
#wrapper #content .byline a:hover 2 2 1 221
Und das verursacht Überschreibung und nicht „den Selektor mit etwas noch Spezifischerem voranstellen“.
Stimmt?
Danke für den Artikel. Er gab mir viele wunderbare Ideen für ein paar Websites, an denen ich arbeite, und erspart mir eine Menge Span-Tags.
Sie sagten: „IE 6 ist ziemlich seltsam. Er wählt basierend auf dem ersten Selektor in der Liste aus.“
Ich glaube, das wäre der letzte Selektor in der Liste, oder?
Nicht nach meiner bisherigen Erfahrung… .red.border wählt .red aus, nicht .border
David hat Recht. In IE6 ist red.border dasselbe wie .border, daher wird die Rahmenfarbe als #900 angewendet. Hier ist ein Screenshot des Renderings in IE6.
Das hätte .red.border ist dasselbe wie .border sein sollen
Nur um eine weitere Stimme hinzuzufügen: David und Ethan haben Recht bezüglich „.class1.class2 == .class2“ in IE6. Obwohl ich mir nicht sicher bin, wie es „#id.class“ behandelt.
Ja, das sieht richtig aus, ich habe falsch interpretiert, was ich sah.
Danke für diese Information!
Tolle Seite! Schöne und nützliche Tutorials für mich. Entschuldigung, dass ich erst jetzt hier bin! Vielen Dank!
Wirklich cooler Artikel. Ich kann es kaum erwarten, es auszuprobieren :)
Das ist nichts für den täglichen Gebrauch, wie haben Sie das herausgefunden :D Dieses hier ist cool: #header.callout
Danke für das Teilen.
Wow, ich habe mich gefragt, wohin Sie damit wollen. Aber angesichts der Tatsache, dass IDs sowieso nur einmal pro Seite verwendet werden sollten, sollte die ID nicht ausreichen, um sie zu spezifizieren?
In den meisten Fällen ja, aber ich habe oben ein spezifisches Beispiel besprochen. Genauer gesagt: Vielleicht hatten Sie auf jeder einzelnen Seite Ihrer Website eine h2#comments. Auf einer davon wollten Sie das Styling ein wenig ändern. Sie könnten einen Klassennamen hinzufügen und dann den Doppelselektor verwenden, um alle vorhandenen Werte zu überschreiben. Sie müssten dann keine !important-Regeln oder spezifischere Selektoren verwenden.
Hey Chris, du hast „Kinder“ geschrieben, meintest aber „Nachfahren“. Kinder werden mit dem „größer als“-Zeichen wie folgt ausgewählt: E > F
Danke Chris! IE6 und Spielchen im selben Satz. Ich mag deine Ausdrucksweise.
Großartige Sachen, ich habe tatsächlich etwas gelernt :). Danke.
Nur ein Gedanke, ich glaube, ein klareres (aber nicht wirklich reales) Beispiel wäre
HTML
CSS
Nur ein Gedanke, ich glaube, ein klareres (aber nicht wirklich reales) Beispiel wäre
HTML
Kapitel 4
Das Abenteuer beginnt
An diesem Tag…
CSS
p {color: black}
p.title {text-decoration:underline}
p.title#chapter4 {text-transform:uppercase; background-image: url(4.jpg)}
Und ich sage das, weil .box class in Demo Could tatsächlich das div-Element ist. Und so weiter.
Aber ich weiß nicht, ob ich das Beispiel beschuldige oder ob hier etwas faul ist.
Es ist mir ziemlich klar, dass, wenn Sie eine andere Klasse für ein HTML-Element erstellen, Sie unterschiedliche CSS-Markup-Möglichkeiten haben werden.
Mehr noch, ich würde sagen, dass Sie hier ein Beispiel dafür zusammenstellen, WIE MAN NICHT kaskadiert…?
Nur an dem Tag, an dem wir mehr als zwei Klassen verwenden können… ah..
Tatsächlich nutzen wir das jeden Tag für einige klassische, dynamische Dropdown-Menüs. Die div-ID zur Gestaltung des Containers und die mehreren Klassen zur Gestaltung der li- und a-Tags im Menü. Da es Zeiten gibt, in denen wir dasselbe Menüsystem zweimal auf einer Website benötigen, können wir ein Menü mit den Klassen gestalten und ein Menü mit der ID überschreiben.
Jedes Menü hat eine andere ID, aber damit sie funktionieren, benötigen beide dieselben Klassen.
Bei meinen freiberuflichen Arbeiten verwende ich diese Dinge ständig für Überschriften. Sie hätten also h1.red oder h1.blue… so etwas. Es gibt andere Fälle, aber dieser fällt mir sofort ein.
Wie immer nützlich.
Tolle Erklärung!
Wow Chris, tolle Erklärung!
Ich wusste das nie und jetzt, da ich es weiß, sehe ich, wie nützlich das sein könnte.
Danke.
Ich benutze ständig mehrere Selektoren wie diesen, besonders mit jQuery. Ich füge dem Container eine Klasse hinzu, sodass etwas wie
#some-container.added-class .child-selectorsehr hilft und viel einfacher ist, als alles nur mit Klassen zu versehen (und schneller).Ich wette auch, dass in HTML5 die Leute das viel tun werden. Zum Beispiel
header.main { styles for main header }da man nicht nur das Header-Element selbst stylen möchte, da es auch für andere Zwecke verwendet wird.
Kein Bedarf. Ein saubererer (oder zumindest meiner Meinung nach) Weg wäre die Verwendung von Kindselektoren wie
body > header { styling }
Und für die anderen Header würden Sie etwas Ähnliches oder einfach
div header { styling }
Wo wir davon ausgehen, dass Sie 1 Styling-Div für den Hauptcontainer verwenden. Könnte auch article oder section oder was auch immer Sie wollen sein.
Nur IE6 unterstützt > (was CSS2 ist) nicht nativ, aber Sie bräuchten sowieso JavaScript, um HTML5 in IE zu unterstützen.
Ich habe den Artikel heute Morgen gelesen. Ich fand ihn cool, konnte mir aber nicht vorstellen, ihn zu benutzen.
… Natürlich habe ich ihn gerade benutzt, um ein Selektorproblem zu lösen.
Chris, Sie haben eine unheimliche Art, Artikel genau zur richtigen Zeit zu veröffentlichen!
Danke für diese Infos. Das wusste ich nicht über CSS-Selektoren.
Gutes altes IE verursacht immer Probleme, wer hätte das gedacht.
Schöner Artikel… Tolle Erklärung!
Ich habe vor einiger Zeit von dieser Technik gehört und liebte sie, weil sie die Menge des Markups stark reduzierte. Ich habe sie auf ein paar meiner Websites ausprobiert, musste sie aber wegen der Probleme mit IE6 aufgeben.
Können Sie einige Beispiele geben, wie das IE6-Problem mit bedingten Stilen gelöst werden kann.
Wie würden Sie z.B. das IE6-Problem in Ihrem Box-Beispiel lösen, ohne zusätzlichen Markup hinzuzufügen?
Wirklich nützlich zur Erinnerung, danke.
Danke dafür, Chris.
Die beste Erklärung der Spezifität, die ich je gelesen habe, war CSS: Specificity Wars, die eine wirklich nützliche Möglichkeit bietet, sich die Spezifitätsregeln mithilfe von Star Wars-Charakteren zu merken…
Das war ein sehr hilfreicher Beitrag, da ich wusste, dass es einen Unterschied zwischen der Verwendung eines Leerzeichens und dem Nichtverwenden gab.
Ich wusste auch nicht, dass man mehrere Klassennamen innerhalb eines Satzes von Anführungszeichen deklarieren kann. z.B. class=”class1 class2″
Obwohl es Ihr HTML nicht schöner macht, können Sie die letzte #id.class in IE6 auswählen, indem Sie die Klassen im Markup stapeln.
style
div#something { color: orange; }
div#something.foo { color: red; }
div#something.bar { color: blue; }
html
Dies wird rot sein.
Dies wird blau sein
Dies wird auch in Firefox blau ergeben.
Ich bin auch neugierig, wie das Problem mit bedingten Stilen gelöst wird. Mir fällt nicht ein, wie man #id.class in IE6 mit bedingten Stilen verwendet. Oder auch nicht.
hm. Entschuldigung; totaler Anfänger. Ich habe das in pre verpackt, aber es kam nicht richtig heraus. trotzdem
div id=”something” class=”foo”
div id=”something” class=”foo bar”
Das zweite Beispiel ergibt Blau. Das erste ist rot. Keine Klasse ergibt natürlich orange.
Eine Anwendung, die ich sehe, ist bei einem CMS wie Drupal. Drupal fügt Klassennamen basierend auf dem Inhalt der Seite zu Elementen mit IDs hinzu. Wenn Sie beispielsweise eine Seitenleiste sichtbar haben, erhält die #wrapper div eine Klasse „left-sidebar“. Auf einer Seite ohne Seitenleiste ist die Klasse nicht vorhanden.
Ich kann mir vorstellen, dass dies der beste Weg ist, ein Element basierend auf Seiteninhalt in einem solchen System zu gestalten.
Ich dachte, #header.callout wäre ein Tippfehler!
Danke Chris – heute etwas Neues gelernt!
Perfekt! Danke Chris, ich habe dir einen Wunsch per E-Mail geschickt für weitere fortgeschrittene Selektionen wie diese, und das war genau das, was ich mir vorgestellt hatte. Was Sie so viel besser machen als die meisten, ist, den Code aufzunehmen, den Code visuell darzustellen und uns dann Strategien zu geben. Nochmals vielen Dank.
(Ich möchte meiner Wunschliste hinzufügen – diese Konzepte auf WordPress übertragen. Ich habe Schwierigkeiten zu lernen, wie WP die Tags, die Sie um die Schleife legen, neu generiert und wie die Selektoren richtig eingestellt werden.)
Toller Artikel, danke für die Infos.
Für diejenigen, die dies tatsächlich in IE6 zum Laufen bringen wollen, habe ich diesen Link gefunden, der erklärt wie
http://bytesizecss.com/blog/post/the-idclass-selector-in-ie6
Sie hätten Ihr Container-Div mit einer ID und einer Klasse, DANN ein leeres Div (ohne ID oder Klasse), DANN Ihren Inhalt.
Ihr CSS wäre für IE6 wie folgt, um zu funktionieren
#header.callout div {styles}
Als ich diesen bytesizecss-Artikel schrieb, meinte ich nicht, dass die Leute denken sollen, dass nur ein ‚div‘-Element ohne ID oder Klasse die Lösung sei.
Es könnte jedes Element sein und es könnte eine Klasse und/oder eine ID haben. Sie müssen im Grunde nur ein Kindelement hinzufügen. Zum Beispiel würde Folgendes gut funktionieren
HalloHallo
Hallo
.button span {
color: #000;}
.button.highlight span {
color: #ccc;}
.button.lowlight span {
color: #f00;}
hm, das war ein epischer Fehler. Das HTML hätte so aussehen sollen
<a href="#" class="button"><span>Hallo</span></a><a href="#" class="button highlight"><span>Hallo</span></a>
<a href="#" class="button lowlight"><span>Hallo</span></a>
Das ist der richtige Ort zum Lernen.
Danke!
Hallo Chris
Können Sie einen Artikel darüber schreiben, wie Stacking Classes funktioniert? Ich habe diesen Artikel gefunden, der darüber spricht, aber er erklärt nicht, wie er verwendet wird, noch zeigt er Beispiele, wie er funktioniert. Hier ist der Link zum Artikel und ein Auszug aus dem, was er beschreibt.
Vielen Dank, Ihre Artikel sind immer so gut gemacht und leicht verständlich.
Link
http://blog.jm3.net/2007/03/16/the-only-ten-things-to-know-about-css/
Auszug
Stapeln Sie Ihre Klassen: Niemand benutzt diesen Trick nie; Sie können so viele CSS-Klassen wie gewünscht auf ein einzelnes Tag anwenden, setzen Sie einfach Leerzeichen zwischen die Namen, wie z. B. die Anwendung der Klassen exciting UND warning. Dies spart TONNEN von Duplikaten in Ihrem CSS. (Ich weiß nicht, warum niemand diesen Trick benutzt. Er ist großartig. Wenn Sie in der Stylesheet eines Benutzers Dutzende von Zeilen wie sehen: .redtext { font-family: Arial, Helvetica, sans-serif; color: red; } .bluetext { font-family: Arial, Helvetica, sans-serif; color: blue; }, ist das ein Zeichen dafür, dass sie diesen Trick wahrscheinlich nicht kennen.
Schöner Artikel, ich finde die Kombination von Klassen und IDs sehr nützlich.
Ich habe meine Vermutung bestätigt.
Nach langer Zeit bin ich zu folgender Schlussfolgerung gekommen: das ist für Amateure, die Klassen über Klassen bauen (was einen nur fragen lässt: „Was wollte ich hier machen?“).
Es gibt einen besseren, saubereren Weg, nur mit einer CSS-Deklaration. Möchten Sie wissen wie?
Kannst du mir bitte sagen
warum es nicht funktioniert
idname1{
font-size: 29px;
}
idname2{
font-size: 23px;
}
idname1, #idname2 p{
margin-left: 77px;
}
Ich versuche das, aber es funktioniert nicht
Es tut mir leid, aber ich wünschte wirklich, Sie würden nicht mit den Dingen durcheinander geraten. Das macht es so verwirrend. Können Sie nicht einfach bei „erst das mit Leerzeichen und dann das ohne Leerzeichen“ bleiben, anstatt alles zu vermischen? Sie sind bereits so ähnlich, und das Vermischen erschwert das Verfolgen Ihres Beitrags erheblich.
Wie greife ich mit CSS-Selektoren auf Elemente innerhalb einer Klasse zu, Beispiel
ein Div mit Klasse
div class=”something”
dann
img-Tag innerhalb einer Klasse
Ich muss den img-Tag ändern, sagen Sie mir, wie ich darauf zugreifen kann
Großartig! Danke! Hier ist eine interessante Sache, die mir immer wieder begegnet, zu der ich aber noch keine Antwort gefunden habe
Ich habe also zwei Klassen, jede mit einer zusätzlichen Klasse und/oder einem zusätzlichen Selektor. Um DRY (Don't Repeat Yourself) zu sein, wie würde ich den Selektor schreiben, um sicherzustellen, dass beide ausgewählt werden?
Das WET-Beispiel
Gewünschtes DRY-Beispiel: (?)
Im Grunde möchte ich mehrere Klassen mit mehreren Klassen auswählen, habe das aber oben nicht aufgelistet gesehen.
Irgendwelche Ideen?
Gute Sachen. Ein sehr hilfreicher Artikel für mich.
Hervorragend. Danke für die Erweiterung der Verwendung von ID- und Klassen-Kombinationen.