Wissen Sie, was der Unterschied zwischen diesen Selektoren ist?
ul li { margin: 0 0 5px 0; }
ul > li { margin: 0 0 5px 0; }
Ich gebe zu, es hat länger gedauert, als es wahrscheinlich sollte (schon damals), als ich die Grundlagen von CSS lernte. In beiden Fällen werden Listenelemente ausgewählt, die Kinder von ungeordneten Listen sind. Aber es gibt einen Unterschied zwischen Kindern und Nachkommen.
Der erste Selektor oben ist ein Nachkommen-Selektor. Er wählt alle Listenelemente aus, die sich irgendwo unterhalb einer ungeordneten Liste in der Markup-Struktur befinden. Das Listenelement könnte drei Ebenen tief in andere verschachtelte Listen eingebettet sein, und dieser Selektor wird es trotzdem finden. Der zweite Selektor oben ist ein Kind-Kombinator-Selektor. Das bedeutet, er wählt nur Listenelemente aus, die direkte Kinder einer ungeordneten Liste sind. Mit anderen Worten, er schaut nur eine Ebene tief in die Markup-Struktur, nicht tiefer. Wenn also eine weitere ungeordnete Liste tiefer verschachtelt wäre, würden die Listenelemente, die deren Kinder sind, von diesem Selektor nicht angesprochen.
Ich denke, jeder versteht den grundlegenden Nachkommen-Selektor, aber lassen Sie uns einen schnellen Überblick über die anderen Selektoren dieses Typs geben: den Kind-Kombinator, den benachbarten Geschwister-Kombinator und den allgemeinen Geschwister-Kombinator.
Kind-Kombinator
Diesen haben wir bereits in der Einleitung dieses Artikels behandelt. Lassen Sie uns dasselbe Beispiel mit einer visuellen Darstellung vertiefen.

Ich denke, die verschachtelte Liste ist ein perfektes Beispiel dafür, warum dieser Selektor nützlich ist. Er kann als eine Möglichkeit betrachtet werden, zu verhindern, dass sich Stile weiter nach unten vererben, als man es möchte. Vielleicht möchten Sie die äußersten Listenelemente groß und header-ähnlich gestalten, aber die verschachtelten Listen kleiner und eher wie Fließtext. Mit einem Kind-Kombinator können Sie nur diese obersten Listenelemente auswählen und müssen sich keine Sorgen machen, dass die großen/header-ähnlichen Stile auf die verschachtelten Listen übergreifen und Sie gegen diese Stile ankämpfen müssen.
Benachbarter Geschwister-Kombinator
Ein Selektor mit einem benachbarten Geschwister-Kombinator ermöglicht es Ihnen, ein Element auszuwählen, das direkt nach einem anderen bestimmten Element kommt.
p + p { font-size: smaller; } /* Selects all paragraphs that follow another paragraph */
#title + ul { margin-top: 0; } /* Selects an unordered list that directly follows the element with ID title */
Diese Selektoren können Ihnen helfen, Stile kontextbezogen anzuwenden. Vielleicht haben Sie viele Artikel auf einer Website. Die meisten beginnen mit <p>-Elementen und das sieht gut aus. Aber einige beginnen mit einer <ul>, die oben und unten einen Abstand hat, damit sie innerhalb eines Artikels gut aussieht. Aber wenn sie einen Artikel beginnen, verursacht dies eine unangenehme Lücke. Der letztere Selektor würde diesen oberen Abstand auf Null setzen, wenn er auf einen Titel folgt.
Hoffentlich hilfreiche Grafik

Allgemeiner Geschwister-Kombinator
Der allgemeine Geschwister-Kombinator-Selektor ist dem benachbarten Geschwister-Kombinator-Selektor, den wir uns gerade angesehen haben, sehr ähnlich. Der Unterschied ist, dass das ausgewählte Element den ersten Elementen nicht unmittelbar folgen muss, sondern irgendwo danach erscheinen kann.
Wenn wir die gleiche Beispielstruktur wie oben verwenden, wird das letzte <p>-Element vonp ~ pebenso ausgewählt, da es von einem anderen <p>-Element vorausgeht, auch wenn nicht direkt.

Beachten Sie, dass bei sowohl den allgemeinen Geschwister- als auch den benachbarten Geschwister-Selektoren die Logik innerhalb desselben Elternelements stattfindet. Das ist es, was Geschwister bedeutet... sie teilen sich denselben Elternteil. In den obigen grafischen Beispielen ist das der Grund, warum das umgebende <div> vorhanden ist. Wenn nach diesem <div> ein weiteres <p>-Element stünde, würde es immer noch von beiden ausgewählt werdendiv ~ punddiv + pobwohl es ein Geschwister und ein benachbartes Geschwister dieses <div> wäre.
Browser-Unterstützung
Diese sind alle ab IE 8 und höher sowie in allen anderen modernen Browsern gut einsatzbereit. IE 7 hat auch Unterstützung, aber beachten Sie, dass HTML-Kommentare sie durcheinanderbringen und dazu führen können, dass sie nicht übereinstimmen, wenn sie sich zwischen Geschwistern befinden.
Wenn Sie mehr Unterstützung als diese benötigen, hilft Ihnen das ie7-js Projekt (jetzt bis ie9.js aktualisiert), mit einer einzigen einfachen JavaScript-Einbindung Unterstützung für all dies bis hin zu IE 5.5 zu erhalten.
Wunsch
Ich habe es schon oft gesagt, aber eine der großen fehlenden Selektor-Stile in CSS ist eine Art "enthält" (oder "hat" oder "qualifiziert" oder wie auch immer man es nennen will. Die Idee ist, z. B. "wähle alle Absätze aus, die Bilder enthalten".
p < img { width: 150%; } /* Not real! */
Anscheinend haben die zuständigen Stellen es aus komplexen Gründen (ich glaube, es hat mit Geschwindigkeit zu tun) mehrfach abgelehnt. jQuery kann das
$("p:has(img)")
Und kann sogar angepasst werden, um die "<" Syntax zu verwenden.
jQuery.parse.push(/^\s*(<)(\s*)(.*)$/);
jQuery.expr["<"] = jQuery.expr[":"].has;
Die Spezifikation
Es schadet nicht, auch die Spezifikation für diese Dinge durchzulesen.
Hallo Chris,
Ich kannte das „>“ schon, die anderen sind neu für mich. Vielen Dank…
PS. Ich frage mich immer wieder, woher du die Zeit findest, all die Dinge zu tun, die du tust :)
Gr. Bert
Chris schläft nicht. Er könnte ein Alien von einem anderen Planeten sein.
Ich kann nicht glauben, dass ich erst jetzt auf diesen perfekten Beitrag gestoßen bin.
Nachdem ich sehr lange mit CSS gearbeitet habe, ist es gut, alte Gewohnheiten abzulegen und etwas Neues zu lernen :)
Vielen Dank!!
Chris, danke für den Artikel; wie üblich: perfektes Timing! Schau dir einen Blogbeitrag an, den ich vor ein paar Wochen bei DynamicDrive gemacht habe: CSS selector wish list
Das sind coole Selektoren und besonders nützlich für das Styling von Menüs. Oder um das erste Element in einer Liste hervorzuheben. Ich würde meine Layouts nicht darauf aufbauen. Eine Änderung im HTML könnte die Sache leicht durcheinander bringen.
Adobe hat Dreamweaver CS5 mit vielen Funktionen veröffentlicht, und eine davon ist der CSS-Inspektionsmodus, der sich um CSS-Eigenschaften kümmert.
Meine Frage ist, ob es möglich sein wird, CSS-Eigenschaften zu korrigieren, ohne sie im Detail zu kennen, mit Dreamweaver CS5. Ich habe andere wichtige Funktionen auf einem Beitrag hier gesammelt: Dreamweaver CS5 features for CSS properties and some others new features
Meiner Meinung nach ist die größte Sünde von IE6, dass er diese Selektoren nicht unterstützt. Sie sind immens nützlich und fast niemand benutzt sie.
IE8s größte Sünde vielleicht, aber nicht die von IE6.
Und selbst wenn wir über IE8 sprechen, bin ich nicht davon überzeugt, dass er schlecht ist. Unerwünscht, ja, aber akzeptabel, wenn man das Gesamtbild betrachtet.
IE7 war (soweit ich weiß) hauptsächlich eine Sitzung zur Ergänzung von Funktionen.
IE8 war eine CSS-Ergänzungssitzung, ihr Versuch, CSS2 vollständig zu unterstützen, und besteht die Säure 2 fast.
IE9 scheint beeindruckende CSS3-Unterstützung und HTML5-Unterstützung zu haben, sowie Unterstützung für Hardwarebeschleunigung (obwohl es umstritten ist, warum dies benötigt wird).
Also, obwohl IE nicht so schnell vorankommt, wie wir uns das alle gewünscht hätten, tut er es *doch*.
Ah, das ergibt für mich Sinn.
kein ul li ul li ul li ul li {} mehr!
Vielen Dank Chris, deine Beiträge sind immer nützlich
Das war ziemlich neu für mich. Danke!
Die Bilder in diesem Beitrag sind eine wirklich tolle Möglichkeit, genau zu erklären, wie jeder Selektor funktioniert.
Als kurze Randbemerkung: Warum gibt es im neuen "Shoutouts"-Bereich keine "Powered by: WordPress"-Angabe? Ich denke, es wäre eine perfekte Ergänzung und würde den Bereich schön ausfüllen.
Bitte korrigieren Sie mich, wenn ich falsch liege, aber ich denke, das ist nicht richtig.
ul>li wählt jedes li aus, das ein Kind einer ul ist.
In Ihrem Beispiel haben Sie eine OL verschachtelt, aber ändern Sie sie in eine UL (wie Sie im Text erwähnen) und die verschachtelten Elemente 1 und 2 werden ebenfalls angesprochen.
Das Beispiel mag ein wenig seltsam sein, da sich einige Dinge trotzdem über die Liste vererben könnten, da eine verschachtelte Liste ein Kind dieser obersten Listenelemente ist... Aber der Kind-Selektor wählt die unteren Listenelemente tatsächlich nicht aus.
Das klingt irgendwie nach Kauderwelsch... Hier ist ein Beispiel, bei dem die innere OL die Farbe Schwarz hat, dann haben die übergeordneten Listenelemente die Farbe Rot. Der Listenelement-Selektor ist spezifischer, aber er wählt weder die OL noch die OL-LI's aus, sodass die Farbe Schwarz bleibt.
http://cdpn.io/qmGck
Ich verstehe das Beispiel mit dem Link
Die OL ist schwarz, also sind die Aufzählungspunkte und das Wort "Test" schwarz. Die OL ist jedoch in li-Tags eingeschlossen, sodass die gesamte OL zu einem li wird, das das Kind der ul ist, und mit dem Stil ul>li Farbe Rot wird die OL rot sein, was bedeutet, dass die Aufzählungspunkte rot sind. OK, klar.
In Ihrem Beispiel ist die OL in den li-Tags von Listenelement 2 eingeschlossen, infolgedessen wird die gesamte OL im gleichen Stil wie die ul>li gestaltet.
Wenn Sie die OL aus den genannten li-Tags entfernen, werden Nested Item 1 und 2 nicht mehr beeinflusst, da sie Kinder der OL sind.
Wenn Sie die OL in eine UL ändern, erhalten Sie eine übergeordnete UL mit 3 Kindern (3 li), von denen 1 ein Kind hat (die zweite UL, die wiederum 2 Kinder hat, die Nested Items.
OK, jetzt wird ul>li die 3 li auswählen, die Kinder der oberen ul sind, aber auch die 2 verschachtelten li von der verschachtelten ul…
(OK, jetzt tut mir der Kopf weh. Ich freue mich auf Ihre Antwort)
Ja, ich glaube, alles, was ich dort verstanden habe, ist richtig =)
Machen Sie sich Sorgen, dass die Verwendung dieses Selektors trotzdem alle Listenelemente in verschachtelten Listen auswählt (und nicht wie erwähnt "die Kaskade stoppt"?)
Wenn das der Fall ist, denke ich, dass dies im Allgemeinen mit z.B. einem ID-Selektor kombiniert würde. Also ul#main-navigation > li würde nur die obersten LI's auswählen, ohne andere verschachtelte LI's auszuwählen.
Ja, eine ID würde den Trick tun, aber das bringt mich zu meinem ursprünglichen Punkt zurück.
Nehmen wir an (in Ihrem Beispiel), Sie möchten, dass die Schriftfarbe des Inhalts der 3 oberen li's (also der Text List Item One, Two und Three) rot ist.
Wenn Sie ul>li verwenden, werden nicht nur die 3 li rot, sondern auch die gesamte ol (Aufzählungspunkte und Text Nested Item One und Two.
Wenn Sie die ol aus dem 2. li (mit dem Inhalt List Item Two) entfernen, werden tatsächlich nur die 3 Haupt-li's rot sein, aber nur, weil die verschachtelten li's Kinder einer ol sind.
Ändern Sie diese ol in eine ul, und der Inhalt (Text) der 3 Haupt-li's UND der Inhalt (Text) der 2 verschachtelten li's werden rot sein.
Die Kaskade stoppt also nicht auf der ersten Ebene, sondern durchläuft alles und jagt jedes einzelne li, das ein Kind einer ul ist, egal wie tief es sitzt.
@Leonardo: Zu diesem Zeitpunkt sind IDs, Klassen oder mehr Kontext Ihre einzige Option.
#nav > ul > li
.article > ul > li
div > ul > li
Das ist es, wonach Sie gefragt haben, soweit ich das verstehe.
Chris hätte auch schreiben können
ul { color: red; }
ol { color: black; }
Aber ich denke, diese Sprache ist verwirrend
„Mit anderen Worten, er schaut nur eine Ebene tief in die Markup-Struktur, nicht tiefer.“
Was nicht stimmt. Ich habe das gerade getestet. Ohne weitere Stile (ja, ich sehe dein JSbin Chris, und du stylst die ol), geht es tatsächlich tiefer. Es trifft jedes li innerhalb dieser ul, egal ob du eine ID/Klasse verwendest oder nicht.
Sie müssten die ol stylen, um die verschachtelten li's die Farbe ändern zu lassen (was Chris im JSbin-Ding getan hat).
Ja, auch wenn die li's in der ol nicht angesprochen werden, erben sie die Regeln, die die angesprochene li in der ul erhält. Ein besseres Beispiel wäre
ul>li>a {}
<ul>
<li><a>eins</a></li>
<li>
<ol>
<li><a>zwei</a></li>
</ol>
</li>
</ul>
Das würde nur „eins“ ansprechen.
Danke dafür, Chris!
Sie erwähnen, dass es in modernen Browsern unterstützt wird, ist es also in Safari und Firefox in Ordnung?
Das könnte sehr nützlich sein, um Listen auf bestimmte Weise zu gestalten. Ich füge ständig Klassen zu Elementen hinzu, um sie anders aussehen zu lassen, aber mit der gezeigten Technik wird das kein Problem mehr sein.
Aber etwas, das Leonardo über mir erwähnt hat, dass ul>li jedes li anspricht, das ein Kind einer ul ist, bedeutet das, dass Sie stattdessen eine verwenden müssen? Hoffe, ich mache Sinn! Aber wenn Sie eine innerhalb einer und ul>li verwenden, wird dies dann nicht trotzdem die inneren ul li's stylen?
Vielleicht kann jemand anderes das besser auf Englisch formulieren!
Danke
Sehr zeitnaher und informativer Beitrag. (Hoffentlich lassen sie Sie Ihren MBP tauschen. :-))
Genialer Beitrag! Sicher, das wird Codezeilen sparen, aber wir haben noch einen langen Weg, um es zum Standard zu machen, zum Glück…
Schauen Sie sich diesen interaktiven jQuery-Selektor-Tester an, mit dem Sie Ihre Ausdrücke gegen Ihren HTML testen können.
Danke Chris, nützliche Einblicke
Ich wünschte mir wirklich einen "Eltern"-Selektor. So könnte man den Container eines Elements auswählen. Das wäre besonders nützlich, wenn man nicht sicher ist, in welchem Container sich der Inhalt befindet, man aber einen Stil für diesen Container hinzufügen muss.
Vielen Dank für die Hilfe, aber sagen Sie mir, funktioniert das in allen Browsern?
Chris sagte
„Diese sind alle ab IE 8 und höher sowie in allen anderen modernen Browsern gut einsatzbereit. IE 7 hat auch Unterstützung, aber beachten Sie, dass HTML-Kommentare sie durcheinanderbringen und dazu führen können, dass sie nicht übereinstimmen, wenn sie sich zwischen Geschwistern befinden.“
Danke für den Artikel Chris, er ist sehr informativ.
Ich kannte >, und benutze es regelmäßig, aber ich habe noch nie von + und ~ gehört. Sie scheinen sehr nützlich zu sein! Danke für den Tipp.
Genialer Artikel – diese Selektoren haben mir vorher immer Schwierigkeiten bereitet, aber jetzt macht es viel mehr Sinn.
Mein Lieblingsanwendungsfall für + ist etwas wie dieses
p{margin:0}
p + p{margin: 30px 0 0 0}
Oder noch schöner
dd + dt {margin: 30px 0 0 0}
Für > ist es besonders schön in HTML5, wo divs mit Klassen und IDs durch schöne Header und Footer ersetzt werden können.
body > header{color:white;}
article > header{color:blue;}
Tatsächlich ist die Menge an nützlichen Beispielen endlos.
Ich habe gelesen, dass diese Selektoren mein CSS verlangsamen. Aber ich bezweifle, dass jemand den Unterschied zwischen schnellem CSS und schnellerem CSS sehen kann (CSS ist immer schnell).
ul > li ist tatsächlich schneller als ul li
Cool, ich kannte den benachbarten Geschwister-Selektor nicht, das ist ziemlich nützlich, um große CSS-Dateien voller kontextbezogener Regeln zu vermeiden.
Hallo Chris, dieser Artikel war etwas verwirrend. Es wäre wirklich großartig, wenn Sie ihn einfacher erklären könnten.
Danke für so nette CSS-Tricks.
Ich wusste wirklich nichts von >, + und ~.
Danke und machen Sie weiter so mit guter Arbeit.
:)
Das ist 6 Jahre alt..
Es spielt keine Rolle, wie alt es ist, nicht viele Leute benutzen es und Chris gibt Wissen an diejenigen weiter, die es nicht tun. Das sind wirklich großartige Selektoren, also wenn Sie sie kennen, ist das großartig, aber nicht wir alle tun das.
Es hat eine Weile gedauert, bis ich > benutzt habe, ich werde versuchen, + mehr zu benutzen, obwohl ich einige der anderen mit Attributselektoren verwende.
nette Post. Danke für all die Mühen.
Der Grund, warum es keinen "Eltern von"-Selektor geben kann, liegt darin, dass CSS eine einmalige Algorithmusbeschränkung hat.
Wenn ein Browser CSS-Selektoren parst, kann er die Stile auf jedes Element anwenden, indem er jedes Element genau einmal durchläuft. Wenn Elternselektoren erlaubt wären, müsste der Parser den XML-Baum nach oben durchlaufen, was exponentiell langsamer ist.
All diese Dinge, die man mit Hilfe von fortgeschrittenen Selektoren tun kann, sind einfach überwältigend. Wie Sie ie7.project empfohlen haben, kamen mir ein paar Fragen in den Sinn.
1. Warum haben die Leute immer noch Angst, solche Skripte zu benutzen?
2. Welche drastischen Auswirkungen könnten solche Skripte auf Ihre Website haben?
3. Ist es ein richtiger/guter Weg, den Browser dazu zu bringen, zu tun, was Sie wollen?
Ich bin wirklich verwirrt
Ziemlich erstaunlich! Dieser Artikel hilft uns wirklich. Und das ie7-js-Projekt ist auch sehr nützlich. Ich fange an, es hier zu testen. Danke für die Mühe.
Dieser Artikel hat mich, wie IMMER, etwas gelehrt, das ich sofort bei einem aktuellen Projekt anwenden konnte, danke Chris nochmals !!!
Das ist ein sehr, sehr hilfreicher Artikel, danke sehr, sehr viel!
„Ich habe es schon oft gesagt, aber eine der großen fehlenden Selektor-Stile in CSS ist eine Art 'enthält' (oder 'hat' oder 'qualifiziert' oder wie auch immer man es nennen will.“
Ich habe mich mit diesem Thema nicht im Detail befasst, aber ich verstehe, dass dies dem Konzept der Kaskade selbst widersprechen würde und daher nicht in Frage kommt. Ich habe jQuery verwendet, um Anker auszuwählen, die Bilder enthalten (um einen unteren Rand zu entfernen).
Tatsächlich, die „alle divs, aber mit einem Filter auf das ID-Attribut
div.myClass => alle divs, aber mit einem Filter auf das Klassenattribut
a[title] => alle Links, aber mit einem Filter auf die Anwesenheit des Titelsattributs
So können wir uns leicht etwas Ähnliches vorstellen, um nach dem Inhalt zu filtern
p[ alle Paragraphen, aber mit einem Filter auf die Anwesenheit eines img
Danke Chris! Ich habe diese oft gesehen, aber zugegeben, ich war faul und habe mir nie die Zeit genommen zu verstehen, was zum Teufel sie tun. Diese werden in Zukunft sehr nützlich sein. Ich werde sie wahrscheinlich auf meiner neuen Website ausprobieren.
Ich hatte gemischte Erfolge bei der Verwendung von Kindselektoren, hauptsächlich aufgrund von Problemen mit IE6 und IE7.
Ich habe IE7.js und IE8.js ausprobiert, aber sie schienen damals etwas fehlerhaft zu sein und verursachten nach der Einbindung noch erraticeres Verhalten.
Aus irgendeinem Grund konnte es bestimmte absolut und relativ positionierte Elemente überhaupt nicht verarbeiten, was dazu führte, dass Blöcke von HTML in IE6 ohne ersichtlichen Grund gar nicht angezeigt wurden. Ich habe die JS-Einbindung schließlich verworfen und stattdessen eine bedingt eingebundene ie6.css-Datei verwendet.
Wenn ich kein CSS für IE6 schreiben muss, benutze ich immer diese Selektoren. Weil sie den Code leichter lesbar machen (sowohl CSS als auch HTML).
Ich weiß, ich bin spät dran... Aber ich habe einen schnellen Beitrag erstellt, der ein paar andere schicke CSS3-Selektoren veranschaulicht, die Chris hier nicht aufgeführt hat.
Danke! :D
Das war sehr hilfreich, ich konnte es nicht selbst herausfinden und hatte auch keine Zeit zum Testen.
Ich habe mich gefragt, warum es einen benachbarten Geschwister-Operator gibt und keinen nth-sibling-Selektor?
Betrachten wir zum Beispiel diese Situation
Was ist, wenn Sie nur das mittlere p auswählen möchten, aber nur nach dem div.only-after-me (das ist derzeit unmöglich, soweit ich weiß)?
Es wäre so etwas (oder ich würde gerne Vorschläge hören)
div.only-after-me + p:nth-sibling(2)
Wo allein die Verwendung von **p:nth-sibling(2)** jedes zweite p auswählen würde, das nach einem Element kommt.
Dies verstößt nicht gegen die Rechts-nach-Links-Darstellung und Speicherprobleme, daher bin ich eher neugierig, ob dies zuvor dem CSS-Entwurf vorgeschlagen wurde und warum es abgelehnt wurde, und wenn es nicht vorgeschlagen wurde, warum nicht?
Chris, ich schätze deine Arbeit sehr und würde gerne deine Meinung hören und dieses Thema diskutieren.
Danke
Diese Diagramme sind so entscheidend, um den Unterschied zwischen den Selektoren zu lernen, es kann sehr verwirrend zu erklären sein.