Es gibt einen CSS-Selektor, genauer gesagt einen Pseudo-Selektor, namens :nth-child. Hier ist ein Beispiel für dessen Verwendung
ul li:nth-child(3n+3) {
color: #ccc;
}
Das obige CSS wählt jedes dritte Listenelement innerhalb von ungeordneten Listen aus. Das heißt, das 3., 6., 9., 12. usw. Aber wie funktioniert das? Und was kann man sonst noch mit :nth-child machen? Schauen wir uns das mal an.
Es kommt darauf an, was sich in diesen Klammern befindet. nth-child akzeptiert an dieser Stelle zwei Schlüsselwörter: even (gerade) und odd (ungerade). Diese sollten ziemlich selbsterklärend sein. „Even“ wählt Elemente mit geraden Nummern aus, wie das 2., 4., 6. usw. „Odd“ wählt Elemente mit ungeraden Nummern aus, wie das 1., 3., 5. usw.
Wie im ersten Beispiel zu sehen ist, akzeptiert nth-child auch Ausdrücke zwischen den Klammern. Der einfachste mögliche Ausdruck? Nur eine Zahl. Wenn Sie einfach eine Zahl in die Klammern setzen, wird nur das Element mit dieser Nummer ausgewählt. Hier ist zum Beispiel, wie man nur das 5. Element auswählt
ul li:nth-child(5) {
color: #ccc;
}
Kommen wir aber auf das 3n+3 aus dem ursprünglichen Beispiel zurück. Wie funktioniert das? Warum wählt es jedes dritte Element aus? Der Trick liegt im Verständnis von „n“ und dem algebraischen Ausdruck, den es darstellt. Denken Sie daran, dass n bei Null beginnt und dann alle positiven ganzen Zahlen durchläuft. Vervollständigen Sie dann den Ausdruck. Also ist 3n gleich „3xn“, und der gesamte Ausdruck ist „(3xn)+3“. Wenn wir nun Null und die positiven ganzen Zahlen einsetzen, erhalten wir
(3 x 0) + 3 = 3 = 3rd Element
(3 x 1) + 3 = 6 = 6th Element
(3 x 2) + 3 = 9 = 9th Element
etc.
Wie sieht es mit :nth-child(2n+1) aus?
(2 x 0) + 1 = 1 = 1st Element
(2 x 1) + 1 = 3 = 3rd Element
(2 x 2) + 1 = 5 = 5th Element
etc.
Moment mal! Das ist dasselbe wie „ungerade“, also muss man das wahrscheinlich nicht sehr oft verwenden. Aber warten Sie mal. Haben wir nicht unser ursprüngliches Beispiel als zu kompliziert entlarvt? Was wäre, wenn wir anstelle von „3n+3“ 3n+0 oder sogar einfacher 3n verwenden würden?
(3 x 0) = 0 = no match
(3 x 1) = 3 = 3rd Element
(3 x 2) = 6 = 6th Element
(3 x 3) = 9 = 9th Element
etc.
Wie Sie sehen, sind die Treffer genau die gleichen, es ist kein „+3“ nötig. Wir können negative n-Werte verwenden und auch Subtraktion in den Ausdrücken. Zum Beispiel 4n-1
(4 x 0) - 1 = -1 = no match
(4 x 1) - 1 = 3 = 3rd Element
(4 x 2) - 1 = 7 = 7th Element
etc.
Die Verwendung von -n-Werten scheint etwas seltsam zu sein, denn wenn das Endergebnis negativ ist, gibt es keinen Treffer, daher müssen Sie dem Ausdruck etwas hinzufügen, um ihn wieder positiv zu machen. Wie sich herausstellt, ist dies eine ziemlich clevere Technik. Sie können sie verwenden, um die „ersten n Elemente“ mit -n+3 auszuwählen
-0 + 3 = 3 = 3rd Element
-1 + 3 = 2 = 2nd Element
-2 + 3 = 1 = 1st Element
-3 + 3 = 0 = no match
etc.
Sitepoint hat einen schönen Referenzleitfaden, der diese praktische Tabelle enthält, die ich hier schamlos wieder veröffentlichen werde
n | 2n+1 | 4n+1 | 4n+4 | 4n | 5n-2 | -n+3 |
|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 4 | – | – | 3 |
| 1 | 3 | 5 | 8 | 4 | 3 | 2 |
| 2 | 5 | 9 | 12 | 8 | 8 | 1 |
| 3 | 7 | 13 | 16 | 12 | 13 | – |
| 4 | 9 | 17 | 20 | 16 | 18 | – |
| 5 | 11 | 21 | 24 | 20 | 23 | – |
Browser-Unterstützung
| Chrome | Safari | Firefox | Opera | IE | Android | iOS |
|---|---|---|---|---|---|---|
| Alle | 3.2+ | Alle | 9.5+ | 9+ | Alle | Alle |
Immer noch nicht kapiert?
Ich bin kein großer Fan von der Phrase „Ich bin ein visueller Lerner.“ Natürlich bist du das, das sind alle. Visuelle Hilfsmittel sind in solchen Situationen enorm hilfreich. Um zu helfen, habe ich eine kleine :nth-child-Testerseite zusammengestellt. Dort können Sie Ausdrücke eingeben und die Ergebnisse sehen, was es darunter auswählt.
Siehe auch diese Seite mit nützlichen :nth-child-Rezepten für schnellen Kopier- und Einfügecode für die häufigsten positionsbezogenen Auswahlbedürfnisse.
Danke dafür!
Guter Tipp!
Ihre Geduld mit uns anderen ist immer noch erstaunlich, Chris.
Gut geschrieben, und wichtiger noch, so geschrieben, dass dieses Konzept endlich klar für mich wird.
Und das war „ohne“ die Phrase „Ich bin ein visueller Lerner“
:)
Danke, dass Sie sich die Zeit genommen haben, dies zu tun, und für Ihr Teilen. Sie haben definitiv etwas zurückgegeben.
Wirklich schöner Beitrag. Bitte fügen Sie einen Retweet-Button in Ihre Beiträge ein, damit er auf Twitter einfach geteilt werden kann.
Danke.
Nicht, dass ich hier wie ein Wichtigtuer klingen will, aber Retweet-Buttons nehmen Twitter den ganzen Geist, wenn Sie mich fragen. Wenn Ihnen dieser Beitrag gefällt (danke!), dann gehen Sie zur URL-Leiste, kopieren Sie die URL, gehen Sie zu Twitter, schreiben Sie einen neuen Tweet in Ihren eigenen Worten und teilen Sie den Link.
Sie haben vielleicht sogar eine viel einfachere Möglichkeit zum Twittern (zum Beispiel auf meinem Mac benutze ich Tweetie und ich drücke einfach Command-Return und ich habe ein neues Tweet-Fenster).
Auf diese Weise
1) Sie werden nicht von meiner Seite weggerissen mit einem vorgefertigten, seelenlosen Tweet
2) Die Leute tun es nur, wenn sie es wirklich teilen wollen, und tun es mit ihrer eigenen Stimme
Das klingt nicht nach Wichtigtuerei, das klingt nachdenklich, fair und verantwortungsbewusst. Gute Arbeit :)
Genau! Das hat mich definitiv zum Nachdenken über meine Twitter-Aktivitäten gebracht.
Das stimmt, aber Share-Buttons müssen nicht unbedingt aufdringlich sein und können für viele Leute nützlich sein.
Wort!
Auch schöner Beitrag :)
und schöne Testerseite.
Wow, ich habe diesen CSS-Selektor noch nie gehört. Ich denke, die Idee des progressiven Enhancements ist ein wichtiges Verkaufsargument für die meisten Kunden, aber die erste Frage, die sie stellen, ist: „Wie wird die Seite auf IE6 auf einem 800 x 600 Bildschirm aussehen?“ Technologie-Liebe!
In der Zwischenzeit verwenden Sie einfach jQuery.
Eine Sache, die ich etwas kontraintuitiv an :nth-child finde, ist, dass es alle Geschwisterelemente berücksichtigt, um zu bestimmen, welche Elemente gestylt werden sollen, aber nur diejenigen stilisiert, die dem darin übergebenen Selektor entsprechen.
Zum Beispiel, wenn ich eine Textseite mit p-Tags, einem h1-Tag und einigen h2-Tags habe und aus irgendeinem seltsamen Grund die Farben der p-Tags abwechseln möchte, würde nth-child dies nicht erfolgreich tun.
p:nth-child(2n) würde stylen…
h1
h2
p
p – Dieser Absatz
p
h2
p
p – Dieser Absatz.
p
…was der 2. und 5. Absatz ist. Nicht, was ich erwartet hätte.
Sicherlich sollten nur die p-Tags gezählt werden?
Entschuldigung, falls das nicht gut lesbar ist.
Es stellt sich heraus, dass ich stattdessen :nth-of-type benötige.
Nicht ganz… Sie würden benachbarte Geschwisterkombinatoren verwenden wollen
h1 + p + p { color: red; }
Demo
:nth-of-type würde immer noch erfordern, dass diese Überschriften und Absätze in einem übergeordneten Element gekapselt sind.
nth-child akzeptiert keine Gleichungen.
Es akzeptiert Ausdrücke.
Ich war auch überrascht, das Wort „Gleichung“ im Text zu sehen. Das sollte ein Ausdruck sein.
Noch erstaunlicher – der Autor hat es all die Jahre noch nicht korrigiert!
In Ordnung. Ich werde es ändern. Ich kann nicht anders, als das Gefühl zu haben, dass es ein wenig pedantisch ist, aber es ist auch korrekter.
Danke für den großartigen Beitrag, Chris!
Ich habe letzte Woche genau versucht, „den rechten Rand jedes dritten Kastens in einem Drei-mal-Drei-Raster aus Kästen zu entfernen, damit sie richtig passen“. Und obwohl ich wusste, dass ich JS verwenden müsste, um IE zu umgehen, hatte ich Schwierigkeiten, die Gleichung/den Ausdruck richtig hinzubekommen. Aus irgendeinem Grund hatte ich die gesamte Algebra verpasst.
Aber dank Ihres praktischen Auffrischungskurses verstehe ich es jetzt! ;-)
(Ich habe den einfachen Weg gewählt und vorerst einfach den rechten Rand zu meinem #wrap div hinzugefügt.)
Wenn es um einen Fall geht, in dem ein Browser ihn unterstützt und ein anderer nicht. Ich tendiere dazu, die JavaScript-Option zu wählen. Wenn sie browserübergreifend nicht gut funktioniert, wird sie ohnehin nicht als kritisches Element verwendet, daher sollte die Implementierung in JavaScript ein sicherer Weg sein. Browserübergreifend, aber nicht kritisch.
Cool. Ich wusste nicht, dass man das mit CSS machen kann. Ich werde es vielleicht in Zukunft verwenden können.
Scheint eine erstaunlich einfache Möglichkeit zu sein, Zebra-Streifen für tabellarische Daten zu handhaben... abgesehen davon, dass IE wie immer die Party ruiniert.
Besonders gefällt mir die Methode „erste n Elemente“.
Danke Chris!
So nett – danke, dass Sie dieses Tutorial und den Tester zusammengestellt haben. Ich habe nth-child kürzlich auf einer Website verwendet, um ältere Tweets schrittweise auszublenden.
#tweets li:nth-child(2){opacity:.8;}Nur ein schöner kleiner Look für gute Browser.
Tolle Arbeit, es für uns zu erklären, die wir uns nicht an unsere Schulmathematik erinnern :D
Übrigens heißt es „Pseudo“ und nicht „Pseduo“, wie in Ihrem ersten Satz ^^
Noch ein kurzes kleines Beispiel.
Sagen wir, Sie möchten die Top 3 und die Top 10 auf besondere Weise in Ihrer Top-100-Liste von etwas stylen
# HTML[ol id=ranking]
[li]1. Lorem
[li]2. Isum
[li]3. etc.
[/ol]
# CSS#ranking li { default:style; }
#ranking li:nth-child(odd) { zebra:style; }
#ranking li:nth-child(-n+10) { special: styling; }
#ranking li:nth-child(-n+3) { special: styling even better; }
Sie verwenden das Prinzip der Kaskadierung und Überschreibung von CSS, um alles nach Wunsch zu stylen.
Ziemlich cool, oder?
Das scheint der beste Weg zu sein, diesen Selektor zu verwenden.
Ich kann mir sonst nicht viele Anwendungen dafür vorstellen, außer das Betrachten großer Blöcke desselben Tag-Typs etwas weniger repetitiv/monoton zu machen.
Das ist großartig, so viele Tutorials gehen weit über die Komplexität von nth-child hinaus.
Aber. Habe ich Recht zu sagen, solange ich jQuery in meine Website einbinde, funktioniert nth-child ohne weitere Arbeit?
Beste Grüße
Nein, jQuery „repariert“ nichts, was sich in Ihren CSS-Dateien befindet. Wenn Sie dies auf die sichere Weise für Browser verwenden möchten, die mit jQuery, aber nicht mit CSS3 funktionieren, dann müssen Sie es in jQuery und nicht in CSS tun. Zum Beispiel
Siehe auch
http://api.jquery.com/nth-child-selector/
und
Sie können es auch so machen, dass es Klassen anwendet, nur für IE oder Browser, die dies nicht unterstützen.
Zum Beispiel:
$("tr:nth-child(odd)").addClass("nth-child-odd");
Ich verwende jQuery und CSS3-Selektoren. nth-child ist eine sehr mächtige Funktion.
Danke für Ihr sehr schönes Tutorial.
Ich erstelle heute etwas, wofür das EXTREM hilfreich sein wird. Du bist spitze!
Danke für das Teilen! Ich lerne eine Menge aus Ihren Artikeln!
Wenn Sie alle Elemente innerhalb eines anderen ohne selektive Auswahl greifen möchten, können Sie verwenden
element > :nth-child(blah){}
Zum Beispiel gestalte ich eine Website, die in Zukunft von Leuten aktualisiert wird, die CSS nicht kennen müssen, und damit Bilder und Text innerhalb von Overlays hübsch aussehen, musste ich alles bis auf den Schließen-Button und ein Bild stylen, um bestimmte Ränder zu erhalten. Glücklicherweise waren dies die ersten beiden Elemente in jedem Overlay, daher konnte ich verwenden
div.overlay > :nth-child(n+3){margin:0 10px 5px;}
Danke, dass Sie mich dazu gebracht haben, über die Verwendung von nth-child nachzudenken!
Vielen Dank für diesen Artikel, ich verstehe es jetzt!!
Das sind hervorragende Informationen und ich twitte es sofort auf Twitter, damit andere es wissen. Danke
Das ist so großartiges CSS, ich kann einfach nicht glauben, dass IE es nicht unterstützt. Ich meine, ich verstehe, warum es Ränder und Abstände nicht gleich rendert (um nur einige zu nennen), aber es ist wirklich schrecklich, dass es eine solche Technik nicht unterstützt. Mein Leben könnte viel einfacher sein, wenn ich dies für die Strukturierung von Websites verwenden könnte...
Danke trotzdem :)
Die Testerseite ist nicht so nützlich, wenn man JavScript verwendet, um die Effekte zu erzielen. Jemand könnte denken, dass es in Internet Explorer (mit einfachem CSS) funktioniert.
Es wäre besser, das echte CSS über JavaScript zu alternieren (das ist
setStyle(s)für MooTools, ich kenne die entsprechende Funktion in jQuery nicht, aber es sollte.css(...)oder etwas Ähnliches sein), anstatt JavaScript direkt zu verwenden.Eine progressive Verbesserung (zumindest für das Layout) um das IE-Problem zu umgehen, wäre die Verwendung von :nth-child(1n) zusammen mit den anderen :nth-childs. Auf diese Weise erhält jedes Kindelement den Code, den Sie in Browsern benötigen, die :nth-child unterstützen, und für Browser, die es nicht unterstützen, stellen Sie einfach sicher, dass der Fallback das Layout nicht beeinträchtigt.
Was ist, wenn Sie eine abwechselnde Hintergrundfarbe für eine Gruppe von Zeilen in einer Tabelle haben möchten?
Ich habe eine ganze Seite voller Zeilen und möchte, dass sie im Wechsel fünf an und fünf aus sind (fünf mit einem hellgrauen Hintergrund und fünf mit einem weißen Hintergrund, abwechselnd über die gesamte Seite).
Ich sehe nicht, wie nur Addition und Subtraktion das lösen würden.
Hallo Joshua,
Ich würde jeden 5. als Gruppe auswählen, beginnend mit
ul li:nth-child(10n-5),
ul li:nth-child(10n-6),
ul li:nth-child(10n-7),
ul li:nth-child(10n-8),
ul li:nth-child(10n-9) {
color: #ccc;
}
Sie müssen nur daran denken, dass Sie eigentlich jede 10. Gruppe (5 an + 5 aus) zusammenfassen.
Mein Gott Chris, warum erklärst du so etwas Einfaches auf so komplizierte Weise…. XD
die 2n bedeutet nur, dass Sie Elemente in Stapeln von 2 nehmen, 3n in Stapeln von 3 usw. usw.
die Zahl, die Sie hinzufügen oder subtrahieren, gibt nur an, wo Sie beginnen möchten.
Beispiel: 2 + 3n = „Elemente in Stapeln von 3 nehmen, beginnend beim zweiten“.
Das ist alles, 3 Sätze. Yeehaa!
Ich bin jedoch noch mehr überrascht von den Leuten, die kommentieren, dass dies fortgeschrittene Algebra ist. Hell, wenn einfache Addition fortgeschrittene Mathematik ist, was haben wir dann mit unserem Bildungssystem gemacht... (jetzt gehe ich in die dunkelste Ecke des Raumes und weine für die Zukunft der Menschheit XD)
Normalerweise liebe ich eine alternative Erklärung, aber du klingst hier einfach wie ein Arschloch. Fühlen Sie sich frei, Ihre Erklärung ohne den Tonfall zu wiederholen.
Gibt es eine Möglichkeit, alle Kinder nach dem (z. B.) 5. auszuwählen? Wenn wir also 10 Kinder haben, wählen wir 6-10 aus.
Schauen Sie sich diesen Artikel an: https://css-tricks.de/useful-nth-child-recipies/
Hallo, ich mag diesen Beitrag und viele andere. Ich habe eine Situation, in der ich die Elemente in einer Liste wie diese auswählen möchte.
für 1 2 3 4 – Ich habe den Standardstil verwendet
für 1 2 3 4 – Ich habe li:nth-child(3n-1):hover a{} verwendet
für 1 2 3 4 – Ich habe li:nth-child(3n-3):hover a{} verwendet
Haben Sie Vorschläge, was ich anstelle des Standardstils verwenden könnte, um die erste Gruppe von Elementen auszuwählen?
Es scheint, dass die Farben nicht im Beitrag angekommen sind, also muss ich mich neu formulieren.
für 1, 4 in 1 2 3 4 5 6 – Ich habe den Standardstil verwendet
für 2, 5 in 1 2 3 4 5 6 – Ich habe li:nth-child(3n-1):hover a{} verwendet
für 3, 6 in 1 2 3 4 5 6 – Ich habe li:nth-child(3n-3):hover a{} verwendet
Haben Sie Vorschläge, was ich anstelle des Standardstils verwenden könnte, um die erste Gruppe von Elementen auszuwählen?
Ausgezeichnete Erklärung. Ich schätze die nth-child-Testerseite sehr. Danke.
Hallo Chris,
Vielen Dank für diese tolle Erklärung!
Ausgezeichnetes Beispiel. Jetzt stecke ich in einem Problem fest und hoffte, dies würde mir helfen.
Ich erstelle ein Grid-System basierend auf Ihrem https://css-tricks.de/dont-overthink-it-grids/,
Das Problem ist, dass ich bei einer bestimmten Breite einige divs verschwinden lassen und ihnen eine Breite von 100% geben möchte.
Ich habe das früher über JS gemacht und gezählt, wie viele divs sich in der Zeile befinden, würde dies aber gerne nur über CSS tun.
col = 6 oder 8, alle 50% Breite
col = 5 — nur das 5. zu 100%, alle anderen zu 50% Breite
col = 3 — nur das 3. zu 100%, alle anderen zu 50% Breite
das ist sehr schwer abzustimmen, da 3n die Zeilen mit 6, 8 und 5 durcheinander bringt.
Kann mir da jemand helfen?
Irgendwelche Vorschläge?
Darf ich eine weitere sehr einfache Erklärung versuchen? Lasst die Mathematik weg, Xn+Y bedeutet, jedes X-te Element zu verwenden und diese Auswahl bei Position Y zu beginnen. 6n+3 bedeutet zum Beispiel, jedes 6. Element zu verwenden und bei dem dritten Element zu beginnen.
Tolle Erklärung, danke!
FYI, aktuelle Ereignisse haben mich dazu veranlasst, mich über individuelle Lernstile zu informieren. Es ist eine ziemliche Studie. Im Allgemeinen messen Forscher die Lernpräferenzen über viele Dimensionen hinweg. Das Felder-Silverman-Modell zum Beispiel hat eine visuell-verbale Dimension, die die Fähigkeit des Lernenden zur Beibehaltung von Bildern oder Wörtern widerspiegelt. Während die Allgemeinheit im Allgemeinen Bilder besser verarbeitet, ist dies nicht universell. Ich bin ein visueller Lerner (sorry!). Mein leicht autistischer Partner ist sehr verbal.