Mit CSS3 haben wir positionsbezogene Pseudoklassen-Selektoren, die uns helfen, bestimmte Elemente auszuwählen, wenn keine anderen unterscheidenden Merkmale vorhanden sind, außer wo sie sich im DOM in Bezug auf ihre Geschwister befinden.
:first-child
:last-child
:nth-child
:nth-last-child
:first-of-type
:last-of-type
:nth-of-type
:nth-last-of-type
:only-child
:only-of-type
Wir erhalten auch ein paar textspezifische Pseudoelemente, die uns bei unseren typografischen Bedürfnissen helfen.
::first-letter
::first-line
Das ist ein guter Anfang, aber es wäre wirklich nützlich, wenn wir das ganze „:nth“-Konzept auf diese typografischen Selektoren ausweiten könnten. Lassen Sie mich Sie überzeugen.
::nth-line() / ::last-line / ::nth-last-line()
Wir haben bereits ::first-line, also um das Set zu vervollständigen, fügen wir ::nth-line(), ::last-line und ::nth-last-line() hinzu.
Damit könnten wir die ersten beiden Zeilen eines Gedichts auswählen, um sie hervorzuheben.
article.poem p:first-child::nth-line(-n+2) {
font-variant-caps: small-caps;
color: red;
}

Oder vielleicht könnten wir das Ende einer Passage ausblenden.
article.poem p:last-child::nth-last-line(3) {
color: hsla(26, 5%, 25%, 1);
font-size: 70%;
}
article.poem p:last-child::nth-last-line(2) {
color: hsla(26, 5%, 50%, 1);
font-size: 60%;
}
article.poem p:last-child::nth-last-line(1) {
color: hsla(26, 5%, 75%, 1);
font-size: 50%
}

Wenn wir generierte Inhalte auf diesen Zeilen-Pseudoelementen verwenden dürften, könnten wir Zeilennummerierungen erreichen, ohne auf aufdringliche Markups zurückgreifen zu müssen.
pre::nth-line(n)::before {
content: counter(line) ". ";
color: #999;
}

Relevanter Artikel von Adam Prescott.
::nth-word() / ::first-word / ::last-word / ::nth-last-word()
Derzeit haben wir keine wortbasierten Pseudoelemente. Wir haben jedoch word-spacing, was bemerkenswert ist.
Ein Anwendungsfall ist ähnlich wie bei ::first-letter für Drop Caps, nur dass es sich um ein ganzes Wort handelt.
article p::first-word {
float: left;
font-size: 300%;
margin: 0 10px 10px 0;
}

Ähnlich wie beim „Ausblenden“ der obigen Zeilen könnten wir eine Passage Wort für Wort mit ::nth-last-word(n) ausblenden.
::nth-letter() / ::last-letter() / ::nth-last-letter()
Wir haben bereits ::first-letter, das recht häufig genutzt wird, warum also nicht das Set vervollständigen?
Von all diesen „neuen“ Selektoren ist ::nth-letter wahrscheinlich am nützlichsten. Zum Beispiel verpackt Lettering.js Buchstaben in <span></span>-Tags für uns, damit wir einzelne Buchstaben auswählen können. Mit ::nth-letter wäre das völlig unnötig.
Nehmen Sie dieses Beispiel

h1.fancy::nth-letter(n) {
display: inline-block;
padding: 20px 10px;
}
h1.fancy::nth-letter(odd) {
transform: skewY(15deg);
background: url(light-red-pattern.png);
}
h1.fancy::nth-letter(even) {
transform: skewY(-15deg);
background: url(dark-red-pattern.png);
}
h1.fancy::nth-word(n) {
margin-right: 20px;
}
h1.fancy::last-word {
margin-right: 0;
}
Schauen Sie sich alle Beispiele unter Lettering.js an – all diese sind gute Beispiele für die Notwendigkeit davon.
Ein weiteres Beispiel für eine Wort-/Buchstabenkombination ist ein förmlicher „Brief“, wie
Dear Emily,
yadda yadda yadda.
Love, Chris.
Vielleicht wird dieser „Brief“ durch dynamische Inhalte aus einer Datenbank generiert, aber wir wollen die korrekte Großschreibung und den Stil der Eröffnungs- und Schlusszeilen sicherstellen.
.letter p:first-child::nth-word(-n+2)::nth-letter(1),
.letter p:last-child:nth-word(-n+2):nth-letter(1) {
text-transform: uppercase;
}
Das vollständige Set
Wenn wir also all das bekommen, wäre das vollständige Set
:first-child :first-of-type :only-child
:last-child :last-of-type :only-of-type
:nth-child :nth-of-type
:nth-last-child :nth-last-of-type
::first-letter ::first-line ::first-word
::last-letter ::last-line ::last-word
::nth-letter ::nth-line ::nth-word
::nth-last-letter ::nth-last-line ::nth-last-word
Auch hier nur Wunschdenken. Wenn es jemanden gibt, dem ich das vorlegen kann, der etwas dagegen tun kann, werde ich es tun. Und ich werde dies auch mit Feedback, ob positiv oder negativ, auf dem neuesten Stand halten.
Fürs Protokoll, dies ist keine neue Anfrage. Anne van Kesteren forderte es im Jahr 2003.
Tolle Idee, Chris!
Wie wäre es mit „first-sentence, last-sentence, nth-sentence und nth-last-sentence“?
Coole Idee! Aber wie würdest du genau bestimmen, was ein Satz ist? Der gesamte Text bis zu einem Punkt?
Was ist mit
Herr. Pinguin vergaß seine Schuhe in St. Augustine.
Ich habe nicht lange darüber nachgedacht, aber auf den ersten Blick scheint es ziemlich schwierig zu sein, es schlau genug zu machen, um nützlich zu sein.
Ja. . . Ich habe darüber nachgedacht. Man könnte zu bestimmten Zeiten mit einem Punkt gefolgt von einem Leerzeichen, gefolgt von einem Großbuchstaben auskommen. Aber das würde dein Beispiel zu drei Sätzen machen. Vielleicht würde es „.“ als Satzende interpretieren und . als alles andere?
Ups. . . Das hat es wörtlich genommen. Es sollte sein:
oHm. . . Hat immer noch nicht funktioniert. Ich werde diesmal Leerzeichen zwischen die Zeichen setzen: .
Punkte sind der KÖNIG! :D
Enden Sätze nicht auch mit Frage- und Ausrufezeichen?
Nun, die sind etwas einfacher zu handhaben, da man sie wahrscheinlich nicht mitten im Satz antrifft, wie man es bei Punkten tun könnte.
Wie wäre es, wenn der Punkt, das Ausrufezeichen und das Fragezeichen als Satzenden angenommen werden und falls es Sonderfälle mit Punkten innerhalb von Sätzen gibt, diese kodiert werden müssen?
Herr. Pinguin vergaß seine Schuhe in St. Augustine.Nun, das kam nicht gut heraus – es sah aber gut aus in der Vorschau.
Ein Punkt kann mit . kodiert werden
Das war es, was ich früher mit
.sagen wollte.Oder reguläre Ausdrucksselektoren, die es Ihnen ermöglichen, jeden beliebigen Text auszuwählen (definieren Sie Ihren eigenen „Satz“).
Ich liebe dich.
Lasst uns alles :nth() machen!
http://memegenerator.net/cache/instances/400x/10/10783/11042610.jpg
Das war großartig, mir kam hier bei der Arbeit Cola aus der Nase :)
Das ergibt Sinn. Ich würde gerne mehr leistungsstarke Tools wie diese in CSS integriert sehen.
Tolle Ideen, Chris :)
Werden Sie etwas damit tun, wenn Sie genügend Antworten erhalten? Können Sie es der CSS-Arbeitsgruppe zur Prüfung/Aufnahme in die Spezifikation vorlegen?
Nun, Microsoft Word scheint gute Arbeit damit zu leisten. Worterkennung, Fragmente usw. Ich bin sicher, ein Algorithmus könnte erstellt werden, um das ziemlich genau zu bestimmen.
Übrigens ein toller Artikel. Wirklich gute Ideen darin.
Wow, tolle Idee.
Alles, was ich mir zu Weihnachten wünsche, ist ein Elternselektor; x < y.
Aber ja, diese würden uns mehr Kontrolle über die Formatierung geben, also bin ich dafür!
Wenn Sie sich den CSS 4 Spec Draft ansehen, wird der Elternselektor bereits berücksichtigt.
Verdammt! :)
Wie wäre es mit Ungleichheits-d.h. <> Selektoren?
Ich hoffe, zumindest ein Teil davon wird bald implementiert. Allein
::nth-linewäre hervorragend für die Zeilennummerierung. Selbst eine unaufdringliche Lösung ohne präsentationsbezogene Markups erfordert heute noch einen Hauch von JavaScript, um sich mit Zeilen zu verbinden.Ich bin mir ziemlich sicher, dass diese Selektoren (oder solche, die ihrer Funktionalität ähneln) zu CSS4 hinzugefügt werden.
Ich habe mir erlaubt, dies an die CSS-WG-Mailingliste zu posten.
Mal sehen, ob jemand darauf reagiert, insbesondere Fantasai (Elika Etemad), die die Herausgeberin von CSS 4 Selectors ist.
Anstatt einer epischen Menge an Selektoren, warum nicht mehr programmatische Ansätze verwenden
::nth-child()
::nth-line()
::nth-word()
::nth-letter()
Erlauben Sie dann die numerische Angabe für erste, letzte und Muster
::nth-line(0) – erste Zeile
::nth-word(-1) – letztes Wort
::nth-letter(5n) – jeder 5. Buchstabe
Ich unterstütze Sie, mein Herr.
Kann ich diese auf die diesjährige Weihnachtswunschliste setzen?!? Besser noch, lasst uns Chris zum nächsten WC3-Präsidenten wählen! Ernsthaft, dies schließt die Lücke zwischen Druck und Web bei allem, was meine Organisation veröffentlicht. Alles, was traditionelle (und altbewährte) Drucklayouttechniken in neue Medien überträgt, ist besser für alle.
Ich hätte gerne ein :mod-nth-child, bei dem man einen Modulus angeben kann, damit man interessante Dinge mit jedem 3. Kind oder so machen kann.
Würde nth-child(3n) nicht jedes dritte Kind auswählen? Lesen Sie das, falls Sie es noch nicht getan haben: https://css-tricks.de/5452-how-nth-child-works/. Natürlich habe ich es wahrscheinlich völlig falsch verstanden, was Sie wollen!
Das „Fit to Scale“-Beispiel sieht großartig aus!
Sehr nützlich für Blogazin-Maniker! :D
Erster Buchstabe wäre toll!
Wir haben bereits first-letter.
Tolle Tipps. Werde sie bald benutzen.
Danke Chris.
Das waren keine Tipps, sondern nur Wunschdenken. Wenn Sie versuchen, sie zu benutzen, werden sie nicht funktionieren.
Eine Komplikation ist, dass in einigen Sprachen/Schriftsystemen (z. B. Thai) Wörter nicht durch Leerzeichen unterschieden werden, sodass die Definition von „nth word“ nicht trivial ist.
Wie immer ein toller Artikel, Chris!
Ich denke an SitePoints „Erstelle deinen eigenen benutzerdefinierten jQuery-Selektor“ (http://ow.ly/7fdQK) und probiere das aus. Ja, ja, es ist natürlich nicht CSS, wie wir es uns wünschen, aber es könnte ein Anfang sein?
Wenn man an LESS.js denkt, haben sie ihr eigenes „&:“ hinzugefügt, das meiner Meinung nach nur in .less-Dateien existiert. Das muss also bedeuten, dass es möglich ist, den LESS.js-Code mit der gleichen Struktur zu erweitern, die „&:“ möglich gemacht hat, nur mit diesem Problem im Hinterkopf? Könnte ein Weg sein. :)
Mach weiter so, großartige Arbeit! Dein Lynda-Leitfaden zu WordPress hat mir vor einiger Zeit sehr geholfen, danke dafür.
Ich kann nur ein Wort sagen, Chris
SUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPER
Mann, ich kannte fast alles über die neuen Selektoren von CSS3, aber ich hätte nie an diese von Ihnen erwähnten Verwendungen denken können. Auch Ihre neuen Vorschläge sind außergewöhnlich nützlich und praktisch.
Wow, so cool. Ich wusste gerade, dass CSS3 so mächtig ist. Vielen Dank fürs Teilen.
Da sind ein paar wirklich schöne Ideen dabei, Chris. Mein Lieblingsbeispiel ist die Zeilennummerierung für Code, etwas, das normalerweise mühsam zu markieren ist!
Schöne Liste!
Ich werde einige dieser nth-alles-Sachen in meiner eigenen JavaScript-Engine (wjSelect) unterstützen.
Wirklich gut gefällt mir die Idee eines :nth-last-word-ähnlichen Selektors. Ich habe kürzlich einen Effekt wie „Text unten ausblenden in einen Read-More-Anker“ erstellt (anstatt … ). Am Ende habe ich Positionierung und Verläufe verwendet, was in diesem Szenario gut funktionierte, aber nicht alles.
Mein Verhältnis von Koffein zu Schlaf reicht nicht aus, um diese Konzepte vollständig zu entschlüsseln. Aber ich merke, dass es interessant ist.
warte… was habe ich gerade gesagt?
Ich habe kürzlich ähnlich gedacht – sehr gut formuliert, mein Herr!
Verdammt! Ich bezweifle, dass ich darauf gekommen wäre, aber diese Dinge sehen wirklich nützlich aus. Jetzt werde ich die nächsten Stunden mit der Recherche nach Polyfills verbringen.
Gute Liste.
Genial,, das ist nützlich für mich.
nette Beispiele, die Sie erwähnt haben, Chris……….sicherlich hilfreich für uns.
Gut gedacht, Chris… Ich dachte gerade, das wäre eine nette Idee für den Austausch von Schlagzeilen in Blogartikelzusammenfassungen. Tatsächlich müsste man gar keine Schlagzeilen schreiben oder irgendwelche Überschriften- oder Span-Tags in seinem Markup hinzufügen… nur den ersten Satz des Absatzes automatisch im Stil Ihrer Wahl hervorheben mit einem Link zum vollständigen Artikel.
Ausgezeichnet. Woher nehmen Sie die Zeit, sich diese großartigen Verbesserungen gegenüber dem aktuellen Stand auszudenken? Ich kann nicht einmal mit dem mithalten, was bereits da ist, geschweige denn es auf neues Terrain ausdehnen.
Was ist der Unterschied zwischen
:afterund::after/ Ihr Beitrag (dieser hier) legt nahe, dass einige Selektoren einen einzelnen Doppelpunkt verwenden und andere einen doppelten Doppelpunkt. Wenn ja, wie weiß man, welchen man wofür verwenden soll?@aaron
Es gibt in CSS Pseudoklassen und Pseudoelemente. In CSS2 gibt es keinen Unterschied zwischen diesen Typen, aber in CSS3 gibt es einen Unterschied.
Um es logischer zu machen, haben die Entwickler von CSS eine Regel hinzugefügt, dass Pseudoelemente einen doppelten Doppelpunkt und Pseudoklassen einen einzelnen Doppelpunkt haben.
Zum Beispiel ist ein Element ::first-letter. Und eine Klasse ist ::first-child.
Man sollte es so sehen
Mit ::first-letter greifen Sie den ersten Buchstaben und legen einen Span darum.
HINWEIS: Dies geschieht nicht im Browser.
Ein Span ist ein Element, also Pseudoelemente.
Mit :first-child hat man mehr als ein Kind.
Mit first-child gibt man dem ersten Kind eine Klasse. Also ist dies eine Pseudoklasse.
Sind dann nicht auch
::afterund::beforePseudoelemente? Verwenden wir nicht normalerweise:afterund:before? Und ich dachte, Pseudoelemente bedeuten *falsche* Elemente, Elemente, die wir durch CSS erstellen. Im Grunde kann ich es so betrachten: Ich erstelle ein neues Element, das nur den ersten Buchstaben des Absatzes enthält, und formatiere dieses neue Element. Aber wenn ich:first-childverwende, wähle ich ein Element aus, das *bereits* im HTML vorhanden ist.Und was ist der Unterschied zwischen DOM und HTML? Was ist die vollständige Form von DOM?
Hallo Leute, was haltet ihr vom AXR-Projekt? Hier eine kleine Slideshare-Präsentation: http://goo.gl/8O6gK
Mein Instinkt ist der eines Vampirs, der Knoblauch gegenübersteht (Halloween).. Es sieht irgendwie aufregend aus, weil man sich noch weiter von Bildern etc. lösen kann als bisher. Obwohl einige Dinge auf den ersten Blick komplizierter als HTML/CSS erschienen, als sie als „einfacher“ präsentiert wurden.
Wir würden uns freuen, weitere Meinungen zu hören, Jonathan.
Ich liebe :nth. Aber das liegt daran, dass es mir wichtig ist. Die meisten Endbenutzer werden nicht die Denkweise haben, dass die Nutzung dieser Feinheiten (die ein gewisses Maß an Abstraktion und Vorstellungskraft erfordern, um sie nützlich zu implementieren) wirkliche Vorteile bringt, daher weiß ich nicht, wie hoch sie auf der Prioritätenliste stehen werden.
Nehmen Sie z. B. http://www.nthdegree.com/ – bitte sagen Sie mir, dass das ein sehr subtiler Scherz ist… meine Augen waren glasiger als ein handgebrannter Raku-Topf. Ich quietsche vor Aufregung bei der Erwartung, was sie mit ::nth-last-letter machen werden :)
„nicht nicht?“ Das sollte „weiß nicht“ heißen – sehen Sie, ein Grammatikprüfer steht viel weiter oben auf der Liste :)
Wunderbare Ideen – und ich bin mit Alex Mellor einer Meinung bezüglich des Wertes eines Elternselektors.
Ich mag das Potenzial von ::first-word.
Für mich ist das wie eine Sprache aus der Hölle, ich verstehe nichts haha
Chris, danke für deine Arbeit daran.
Ich habe gerade bemerkt, dass es auch `p:last-child::nth-last-child(3)` im zweiten Beispiel gibt. Sollte dies nicht `p:last-child::nth-last-line(3)` sein? Oder verfehle ich den Punkt?
Ja, das war falsch, jetzt korrigiert.
Danke! Das ist großartig!
Sehr coole Vorschläge, die der Spezifikation hinzugefügt werden sollten. Außerdem würde ::nth-line als Inline-Pseudoelement das einfachere „Multi-Line Padded Text“ ermöglichen. Doppelter Gewinn!
Ps. Diese gefälschten Kommentare sind sehr nervig. Könnte ein Captcha das Problem lösen?
::nth-child()
::nth-line()
::nth-word()
::nth-letter()
last-line
last-child
last-word
Keine der obigen funktioniert bei mir. Kann mir jemand helfen zu verstehen, wie man das benutzt?
Der gesamte Artikel handelt von Dingen, die noch nicht funktionieren. Wenn Sie die Funktionalität wirklich benötigen, schauen Sie sich jQuery-Plugins an.
Mit all diesen Kommentaren denken offensichtlich viele Leute dasselbe.
Hoffen wir, dass zumindest einige dieser Ideen in CSS4 aufgenommen werden.
Verdammt – ich dachte tatsächlich, diese wären echt und habe versucht, sie zu verwenden, bis ich richtig gelesen habe, dass es sich nur um Entwürfe möglicher Ideen für Implementierungen handelt.
Das ist großartig. Verdammt großartig. Danke fürs Veröffentlichen, da ich mich gefragt habe, ob es einen globalen CSS-Befehl zur Unterscheidung der Textfarbe gibt.
Während wir sehnsüchtig Selektoren wünschen, wie wäre es mit
Manchmal möchte man vielleicht ein ::character(‘@’) anders einfärben, oder keine Kursivschrift auf ein | verwenden oder eine andere Schriftart für Ziffern verwenden, alle Instanzen Ihres Firmennamens rot ::word(‚Apple‘) machen, alle Schimpfwörter display: none oder was auch immer!
Ich *liebe* die Möglichkeit, Teilbereiche von Textknoteninhalt abzugleichen.