Nehmen wir an, dieses HTML
<section>
<p>Little</p>
<p>Piggy</p> <!-- We want this one -->
</section>
Diese tun genau dasselbe
p:nth-child(2) { color: red; }
p:nth-of-type(2) { color: red; }
Es gibt aber natürlich einen Unterschied.
Unser :nth-child-Selektor oben bedeutet in "einfacher Sprache", wähle ein Element aus, *wenn*
- es ein Paragraphenelement ist
- es das zweite Kind eines Elternelements ist
Unser :nth-of-type-Selektor bedeutet in "einfacher Sprache"
- Wähle das zweite Paragraphenkind eines Elternelements aus
:nth-of-type ist... wie kann man es am besten ausdrücken... *weniger bedingt*.
Nehmen wir an, unser Markup wurde zu diesem geändert
<section>
<h1>Words</h1>
<p>Little</p>
<p>Piggy</p> <!-- We want this one -->
</section>
Das bricht
p:nth-child(2) { color: red; } /* Now incorrect */
Das funktioniert immer noch
p:nth-of-type(2) { color: red; } /* Still works */
Mit "bricht" meine ich, dass der oben genannte :nth-child-Selektor jetzt das Wort "Little" anstelle von "Piggy" auswählt, weil dieses Element sowohl 1) das zweite Kind als auch 2) ein Paragraphenelement ist. Mit "funktioniert immer noch" meine ich, dass "Piggy" immer noch ausgewählt wird, weil es der zweite Paragraph unter diesem Elternelement ist.
Wenn wir ein <h2> nach diesem <h1> hinzufügen würden, würde der :nth-child-Selektor *gar nichts auswählen*, weil jetzt das zweite Kind kein Paragraph mehr ist, sodass der Selektor nichts findet. Der :nth-of-type funktioniert wieder, wie erwartet.
Ich finde, :nth-of-type ist weniger zerbrechlich und generell nützlicher, obwohl :nth-child häufiger vorkommt (meiner Meinung nach). Wie oft denkst du "Ich möchte das zweite Kind eines Elternelements auswählen, wenn es zufällig ein Paragraph ist." Möglicherweise manchmal, aber wahrscheinlicher möchtest du "den zweiten Paragraph auswählen" oder "jede dritte Tabellenzeile auswählen", was Fälle sind, in denen :nth-of-type (meiner Meinung nach) die stärkere Wahl ist.
Ich stelle fest, dass die meisten meiner "Mist, warum funktioniert dieser :nth-child-Selektor nicht?!"-Momente darauf zurückzuführen sind, dass sich herausstellt, dass ich den Selektor mit einem Tag versehen habe und das Kind mit der entsprechenden Nummer nicht wirklich dieses Tag hat. Wenn ich also :nth-child verwende, ist es meiner Erfahrung nach generell am besten, das Elternelement anzugeben und :nth-child ohne Tag-Qualifizierung zu belassen.
dl :nth-child(2) { } /* is better than */
dd:nth-child(2) { } /* this */
Aber natürlich hängt alles von der genauen Situation ab.
Die Browserunterstützung für :nth-of-type ist ziemlich gut... Firefox 3.5+, Opera 9.5+, Chrome 2+, Safari 3.1+, IE 9+.
Ich würde sagen, wenn Sie eine tiefere Unterstützung benötigen, würde jQuery Ihnen helfen (verwenden Sie den Selektor dort, weisen Sie eine Klasse zu und gestalten Sie mit dieser Klasse), aber tatsächlich hat jQuery die Unterstützung für :nth-of-type eingestellt. Das erscheint mir seltsam. Ich habe gehört, es lag an geringer Nutzung. Wenn Sie diesen Weg gehen möchten, hier ist ein Plugin, um sie zurückzubekommen. jQuery 1.9 unterstützt :nth-of-type jetzt wieder (bis IE 6), das ist also eine Option.
Verwandt: Vergessen Sie nicht die fantastischen Cousins :first-of-type, :last-of-type, :nth-last-of-type und :only-of-type. Erfahren Sie hier mehr.
Wenn Sie mit einem visuellen Beispiel experimentieren möchten, schauen Sie sich dieses Werkzeug an!
für diese Angelegenheit wäre :last-child genauso gut...
Tolle Erklärung. Glauben Sie es oder nicht, ich bin heute darauf reingefallen, ungefähr eine Stunde lang!
Ich muss auch sagen, dieses Verhalten ist verwirrend!
Wenn Sie CSS beim Überfahren mit der Maus anwenden wollten, würden Sie hinzufügen
p:hover {}
Es liegt also nahe, dass Sie, wenn Sie CSS auf jeden n-ten p anwenden wollten, Folgendes verwenden würden
p:nth-child(2)
Das ist natürlich nicht der Fall.
Genau, es ist einfach ein bisschen unberechenbar und stimmt nicht immer mit natürlichen Annahmen überein.
Ich muss jetzt wirklich ein paar Dutzend Stylesheets überprüfen ><
Was es wert ist, ich stimme Ihnen zu, nth-of-type ist wirklich nützlich.
Und um die Kompatibilität mit offiziell nicht unterstützten Browsern sicherzustellen: Dies ist eine Aufgabe für das mächtige selectivzr.
Hoppla! Kleiner Tippfehler in diesem Link. Versuchen Sie stattdessen http://selectivizr.com/.
Selectivizr ist tatsächlich von Keith Clark, der auch das jQuery-Plugin gemacht hat, auf das Chris in seinem Beitrag verlinkt hat. Ich vermute also, Selectivizr ist wahrscheinlich die aktuellere Option.
Ich bin letzte Woche auf dieses Problem gestoßen. Es hat mich ungefähr eine Stunde gekostet, bis mir klar wurde, dass ich :north-of-type verwenden sollte.
Ich konnte nicht ganz verstehen, warum das so war, bis jetzt :)
Guter Artikel. Ich denke, die meiste Zeit möchte man nth-of-type gegenüber nth-child verwenden.
Eine Instanz von nth-child, die nützlich wäre, und ich denke, es lohnt sich hervorzuheben, ist, wenn Sie das n-te Element wünschen, sich aber nicht darum kümmern, welche Art von Element es ist. z. B.
.some-parent :nth-child(n)
Dann ist es egal, ob es voller spans, divs oder was auch immer ist, Sie erhalten immer das n-te Element..
Ja, das ist der technische Anwendungsfall, aber was ist ein echter Anwendungsfall? Ich bin sicher, es gibt einige hier und da, aber es ist nicht üblich.
Der tatsächliche Anwendungsfall ist wahrscheinlich begrenzt, aber vorhersehbar – wie z. B. die Hervorhebung bestimmter Tabellenzeilen oder -spalten... oder bestimmter Listenelemente. In Fällen wie diesen können Sie sicher sein, dass ein tr ein tr bleibt oder ein li ein li bleibt, wodurch das nth-child zur richtigen Wahl wird. Aber wie Sie erwähnt haben, funktioniert nth-of-type auch einwandfrei.
Wirklich großartig, Chris. Danke für den Tipp.
Kristallklar! Danke für dieses wunderbare Beispiel und die Beschreibung!
Fantastisch nützlich. Ich habe es ausgedruckt und in meinen zufälligen "Schnipsel"-Ordner gelegt. Vielen Dank.
es gibt :first-child
gibt es ein :first-of-type?
bin nur neugierig darauf, es gibt :first-child
gibt es ein :first-of-type?
nur neugierig darauf ^^
Nein Julian,
First-of-type ist nicht anwendbar und dieses Attribut ist in CSS3 nicht aktualisiert.
Entschuldigung... für den vorherigen Beitrag...
http://reference.sitepoint.com/css/pseudoclass-firstoftype
Schauen Sie einfach hier für Ihre Lösungen.
Es ist schade, dass jQuery nth-of-type fallen gelassen hat. In letzter Zeit habe ich es ziemlich oft verwendet, um die Anzahl der Klassen zu reduzieren, die ich in meinem Markup verwende. Die Verwendung von nth-of-type erleichtert die Feinabstimmung des Elements, das ich anvisieren möchte. Hoffentlich werden sie es in naher Zukunft wieder einführen, sobald die Leute erkennen, welch mächtiges Werkzeug es ist.
Ich bin neugierig auf die angegebene Anforderung für Paragraphen bei nth-of-child. Gestern habe ich nth-child verwendet, um dieses Markup zu gestalten
Zum Beispiel habe ich #company li:nth-child(2) verwendet, um den Register-Button zu spezifizieren. Funktioniert gut in FF und Safari, ich habe noch keine weiteren Tests durchgeführt, nur ein grober Mockup...
Mein Verständnis ist, dass nth-child für jedes Kindelement funktioniert, unabhängig vom Elementtyp. Was übersehe ich?
Danke!
Paragraphen waren nur ein Beispiel in diesem Artikel. In Ihrem Beispiel haben Sie li:nth-child(2) verwendet, sodass dieser Selektor nur dann übereinstimmt, wenn das zweite Kind ein Listenelement ist. Wenn das zweite Kind ein beliebiges anderes Element ist, wird es nicht übereinstimmen.
Cool, verstanden. Und ich wollte Ihnen nur für die Zusammenstellung dieser großartigen Ressource danken. Ich lande hier definitiv ein paar Mal pro Woche, um zu recherchieren, wie man dies oder jenes tut...
Kann jemand erklären, "warum" entschieden wurde, dass nth-child Elemente mit display:none ignorieren soll?
CHRIS, danke dafür! Ich wurde verrückt, weil ich einem Ihrer Podcasts gefolgt bin ("A Quick Useful Case for Sass Math and Mixins" vom 13.03.) und dann einen " in meine Boxen geworfen habe und alles schiefging... das hat alles richtiggestellt!