Pseudo-Klassen-Selektoren sind CSS-Selektoren, denen ein Doppelpunkt vorangestellt ist. Sie sind wahrscheinlich mit einigen davon sehr vertraut. Wie :hover
a:hover {
/* Yep, hover is a pseudo class */
}
Sie sind in einer Vielzahl von Situationen äußerst nützlich. Einige davon sind CSS3, einige CSS2… es hängt vom jeweiligen ab. Außerhalb von IE haben sie eine großartige Browserunterstützung. In IE, sogar IE8, ist die Unterstützung ziemlich spärlich. Die IE9-Vorschau hat jedoch volle Unterstützung dafür. Die linkbezogenen funktionieren, aber vieles andere nicht. Schauen wir uns jeden einzelnen kurz an. Keine Sorge, es sind nicht allzu viele.
Linkbezogene Pseudo-Klassen-Selektoren
:link – Wahrscheinlich der am meisten verwirrende linkbezogene Pseudo-Selektor. Sind nicht alle <a> Links? Nun, nicht, wenn sie kein href-Attribut haben. Dieser wählt nur diejenigen aus, die eines haben, und ist daher im Wesentlichen dasselbe wie a[href]. Dieser Selektor wird wesentlich nützlicher sein, wenn verlinken von beliebigen Elementen Wirklichkeit wird.
:visited – Wählt Links aus, die vom aktuellen Browser bereits besucht wurden.
:hover – Wenn der Mauszeiger über einen Link fährt, befindet sich dieser Link im Hover-Zustand und dieser wählt ihn aus.
:active – Wählt den Link aus, während er aktiviert wird (angeklickt oder anderweitig aktiviert). Zum Beispiel für den "gedrückten" Zustand eines Button-ähnlichen Links oder umallen Links ein button-ähnlicheres Gefühl zu geben.
Es gibt eine unterhaltsame Technik, um sich alle Link-Pseudo-Klassen-Selektoren zu merken. Schauen Sie sich den ersten Buchstaben jedes an: LVHA … LIEBE HASS.
Eingabe- & linkbezogene Pseudo-Klassen-Selektoren
:focus – Das Definieren von Hover-Stilen für Links ist großartig, aber es hilft denen nicht, die Tastaturnavigation verwendet haben, um zum Link zu gelangen. :focus wählt Links aus, die den aktuellen Fokus der Tastatur haben. Dies ist nicht auf Links beschränkt, sondern kann auch (und sollte wirklich) auf Eingaben und Textbereiche angewendet werden. Manche würden sagen, man solle einen :focus-Stil für alles definieren, das einen :hover-Stil hat.

:target – Die :target-Pseudo-Klasse wird in Verbindung mit IDs verwendet und stimmt überein, wenn das Hashtag in der aktuellen URL mit dieser ID übereinstimmt. Wenn Sie also unter der URL www.ihreseite.de/#home sind, dann ist der Selektor#home:targetwird übereinstimmen. Das kann extrem mächtig sein. Zum Beispiel können Sie einen Bereich mit Tabs erstellen, bei dem die Tabs auf Hashtags verlinken und dann die Panels durch übereinstimmende :target-Selektoren "aktiviert" werden und (zum Beispiel) mithilfe von z-index nach oben geschoben werden.
:enabled – Wählt Eingaben aus, die im Standardzustand aktiviert und zur Verwendung bereit sind.
:disabled – Wählt Eingaben aus, die dasdeaktiviertAttribut haben. Viele Browser machen die Eingabe verblasst grau, das können Sie mit diesem Selektor steuern.

:checked – Wählt Checkboxen aus, die, warten Sie, angekreuzt sind.
:indeterminate – Wählt Radio-Buttons aus, die sich im Fegefeuer-Zustand befinden, weder ausgewählt noch nicht ausgewählt (wie wenn eine Seite mit Radio-Button-Optionen geladen wird, aber kein Standard gesetzt ist).

:required – Wählt Eingaben mit dem required-Attribut aus.:optional – Wählt Eingaben aus, die nicht das required-Attribut haben.
:read-only / :read-write – Wählt Elemente basierend auf einer Kombination von readonly- und disabled-Attributen aus.
Positions-/Nummern-basierte Pseudo-Klassen-Selektoren
:root – Wählt das Element aus, das sich an der Wurzel des Dokuments befindet. Wählt mit ziemlicher Sicherheit das -Element aus, es sei denn, Sie arbeiten speziell in einer seltsamen Umgebung, die auch CSS zulässt. Vielleicht XML.
:first-child – Wählt das erste Element innerhalb eines Elternelements aus.
:last-child – Wählt das letzte Element innerhalb eines Elternelements aus.
:nth-child() – Wählt Elemente basierend auf einem einfachen algebraischen Ausdruck aus (z. B. "2n" oder "4n-1"). Kann Dinge tun wie gerade/ungerade Elemente, "jeden dritten", "die ersten fünf" und ähnliches auswählen. Hier im Detail abgedeckt mit einem Tester-Tool.
:nth-of-type() – Funktioniert wie :nth-child, wird aber an Stellen verwendet, an denen die Elemente auf derselben Ebene unterschiedliche Typen haben. Zum Beispiel, wenn sich innerhalb eines Divs eine Reihe von Absätzen und eine Reihe von Bildern befinden. Sie möchten alle ungeraden Bilder auswählen. :nth-child funktioniert dort nicht, Sie würden div img:nth-of-type(odd)verwenden. Besonders nützlich bei der Arbeit mit Definitionslisten und ihren abwechselnden <dt>- und <dd>-Elementen.
:first-of-type – Wählt das erste Element dieses Typs innerhalb eines beliebigen Elternelements aus. Wenn Sie also zwei Divs haben, die jeweils einen Absatz, ein Bild, einen Absatz, ein Bild enthalten. Danndiv img:first-of-typewürde das erste Bild im ersten Div und das erste Bild im zweiten Div auswählen.
:last-of-type – Dasselbe wie oben, nur würde es das letzte Bild im ersten Div und das letzte Bild im zweiten Div auswählen.
:nth-last-of-type() – Funktioniert wie :nth-of-type, zählt aber von unten nach oben statt von oben.
:nth-last-child() – Funktioniert wie :nth-child, zählt aber von unten nach oben statt von oben.
:only-of-type – Wählt nur aus, wenn das Element das einzige seiner Art innerhalb des aktuellen Elternelements ist.

Relationale Pseudo-Klassen-Selektoren
:not() – Entfernt Elemente aus einer bestehenden Auswahl, die mit dem Selektor innerhalb des Parameters von :not() übereinstimmen. Also zum Beispiel alle Divs *außer* denen mit der Klasse "music" =div:not(.music). Die Spezifikation besagt, dass :not-Selektoren nicht verschachtelt werden können, aber sie können verkettet werden. Einige Browser (Firefox) unterstützen auch durch Kommas getrennte Selektoren als Selektorparameter, obwohl das Verketteln eine weitaus sicherere Wahl wäre. Auch nützlich in Verbindung mit Attributselektoren, z. B.input:not([disabled]).
:empty – Wählt Elemente aus, die keinen Text und keine Kindelemente enthalten. Wie:
Textbezogene Pseudo-Klassen-Selektoren / Elemente
::first-letter – Wählt den ersten Buchstaben des Textes im Element aus. Typische Verwendung: Drop Caps.
::first-line – Wählt die erste Textzeile im Element aus. Typische Verwendung: Die erste Zeile in Kleinschreibung als typografischer Blickfang/Einleitung.
:lang – Dieser Pseudo-Selektor ist in der CSS3-Spezifikation enthalten, wird aber erst ab IE 8+ implementiert. Er passt zu allem, was ein Element mit einem übereinstimmenden lang-Attribut hat oder ein Nachfahre davon ist. Zum Beispiel passt :lang(fr) zu jedem Absatz, auch ohne lang-Attribut, wenn das übergeordnete Body-Element das Attribut lang="fr" hatte.
Kurzer Hinweis
Sie können Pseudo-Selektoren verketteln, genau wie Sie Klassen- und ID-Selektoren verketteln können. Dies ist hier besonders nützlich, während wir uns :first-letter und :first-line ansehen. Wahrscheinlich möchten Sie nicht jeden einzelnen Absatz auf der Seite als Drop Cap gestalten, sondern nur den ersten, also p:first-child:first-letter { }

Inhaltbezogene Pseudo-"Elemente"
::before – Kann Inhalt vor einem bestimmten Element hinzufügen. Zum Beispiel ein öffnendes Zitat vor einem Blockquote oder vielleicht ein vorausgehendes Bild, um einen bestimmten Absatz hervorzuheben.
::after – Kann Inhalt nach einem bestimmten Element hinzufügen. Zum Beispiel ein schließendes Zitat für einen Blockquote. Wird auch häufig für den Clearfix verwendet, bei dem nach dem Element ein leerer Raum hinzugefügt wird, der den Float ohne zusätzlichen HTML-Markup bereinigt.
Pseudo-Elemente vs. Pseudo-Klassen
Die beiden obigen Selektoren werden zu Recht Pseudo-"Elemente" (nicht Selektoren) genannt, da sie kein "reales" Element auswählen, das auf der Seite existiert. Dies gilt für diese beiden sowie für die vorherigen Abschnitte ::first-letter und ::first-line. Macht das Sinn? Wie der erste Buchstabe, den ::first-letter auswählt, ist kein eigenes Element, sondern nur ein Teil eines vorhandenen Elements, daher ein Pseudo-Element.
| Selektorstil | Name | Tut | Spezifität |
|---|---|---|---|
| :: | Pseudo Element | wählt/erstellt tatsächlichen Inhalt aus | 0 0 0 1 |
| : | Pseudo Klasse | wählt Elemente unter bestimmten Bedingungen aus | 0 0 1 0 |
Tag-Qualifizierung
Diese Selektoren können tag-qualifiziert sein, was bedeutet, dass sie nur angewendet werden, wenn *sowohl* das Element (Tag) als auch der Selektor übereinstimmen. Zum Beispiel
p:first-child {
color: red;
}
Das passt nur, wenn das erste Kind eines anderen Elements ein <p> ist. Wenn nicht, passt es nicht.
Veraltet
:contains() – Soweit ich weiß, ist das weg. Die aktuelle CSS3-Spezifikation hat es entfernt. Ich kenne die Geschichte nicht, lassen Sie es mich wissen, wenn Sie es tun. Auf den ersten Blick wirkt es unglaublich nützlich (Objekte basierend auf dem Textinhalt, den sie enthalten, auswählen zu können). Möglicherweise liegt es an Problemen oder daran, dass Inhalt in Selektoren unerwünscht ist. Meine Präferenz wäre, es nach Elementen statt nach Text auswählen zu lassen, wie p:contains(img), aber leider Pech gehabt.
Update: Es gibt jetzt einen :has()-Selektor!
::selection – Ermöglicht die Änderung des Stils von ausgewähltem Text. Es wurde für CSS Selectors Level 3 entworfen, aber entfernt, bevor es den Empfehlungsstatus erreichte. Trotzdem ist es in einigen Browsern implementiert, die wahrscheinlich experimentelle Unterstützung dafür beibehalten werden. Für Firefox können Sie ::-moz-selection verwenden. Weitere Informationen hier.
Update: ::selection ist jetzt vollständig standardisiert, verwenden Sie es ruhig!
jQuery-Nutzung
jQuery kann all diese in seinen Selektoren verwenden, was großartig ist. Noch *großartiger*, jQuery bietet zusätzliche Pseudo-Klassen-Selektoren.
:first – Passt zur ersten Instanz der *bereits ausgewählten* Menge. Dies unterscheidet sich von :nth-child(1), das nur auswählt, wenn der Selektor passt *und* es das erste Kind ist. Mit :first passt der Selektor, dann nimmt er die erste gefundene Instanz, unabhängig von der Position des Kindes.
:eq() – jQuery unterstützt Das tut es jetzt. Dies wählt das X-te Element aus der bereits ausgewählten Menge aus. Es ist auch nullindiziert (0 ist das erste Element), im Gegensatz zu :nth-of-type nicht als Teil seiner Selektor-Engine, aber das ist sehr ähnlich.:nth-child, bei dem das erste Element 1 ist.
:contains('text') – Dies wurde aus CSS entfernt, funktioniert aber in jQuery.
:lt() – Dasselbe wie :nth-child(-n+X), da es die "ersten X Elemente" auswählt
:gt() – Dasselbe wie :nth-child(n+X), da es alles außer den "ersten (X-1) Elementen" auswählt
:even – Dasselbe wie :nth-child(even) oder :nth-child(2n)
:odd – Dasselbe wie :nth-child(odd) oder :nth-child(2n+1)
:has() – Prüft, ob das Element einen Nachfahren eines bestimmten Selektors hat, bevor es passt, wie :has("div.intro").
Es gibt tatsächlich noch eine ganze Menge mehr, und alle sind clever und nützlich (oder zumindest eine Verbesserung der Lesbarkeit). Sehen Sie sich die Selektor-Dokumentation für mehr an.
jQuery kann Ihnen bei Pseudo-Elementen wie ::before und ::after nicht wirklich helfen, aber Sie können in einigen Browsern auf ihre Werte zugreifen. Zum Beispiel, wenn ein Div einen ::before-generierten Inhalt hätte, könnten Sie den Wert wie folgt abrufen:
var div = document.querySelector("div");
var content = window
.getComputedStyle(div, '::before')
.getPropertyValue('content');
Spezifität
Klassen-Selektoren und Pseudo-Klassen-Selektoren haben das gleiche Spezifitätsgewicht. Pseudo-Elemente haben die Spezifität eines Element-Selektors.
li {} /* specificity = 0,0,0,1 */
li:first-child {} /* specificity = 0,0,1,1 */
li:first-line {} /* specificity = 0,0,0,2 */
li.red {} /* specificity = 0,0,1,1 */
Typischerweise werden sie sowieso in Verbindung verwendet oder am Ende in CSS aufgeführt, also hoffentlich wird es nicht zu viele Probleme verursachen...
ul li.friend { margin: 0 0 5px 0; }
ul li:last-child { margin: 0; }
In diesem Fall würde das Nullsetzen des Margins funktionieren (vorausgesetzt, es passt zum gleichen Element), aber nur, weil das Nullsetzen an zweiter Stelle steht (sie haben die gleiche Spezifität). Also… achten Sie darauf.
Faszinierende Zusammenfassung – sehr nützlich, sowohl als Erinnerung an vergessene Dinge als auch als Quelle für Neues.
Ich wette, ich werde :target in naher Zukunft verwenden…
Danke Chris für die Zusammenfassung. Großartige Arbeit, wie immer :-)
Schöne Zusammenfassung, danke =)!
Ich habe :target bisher auch noch nicht benutzt. Werde das zukünftig mal ausprobieren müssen. Sehr nützlicher Beitrag, danke.
Danke! Hast du einen Test für die Browserunterstützung gemacht? Eine Tabelle, die bei der Entscheidung hilft, wann ich die Selektoren verwenden kann, wäre wirklich geschätzt :-)
Ich habe so etwas schon lange gesucht. Danke
Ich wusste gar nicht, dass es so viele davon gibt!
Die linkbasierten Selektoren sind Standard, ich stelle mir vor, jeder weiß, was sie tun, und verwendet sie regelmäßig.
Ich habe mich nie wirklich gezwungen gesehen, viele davon zu verwenden, aber jetzt, wo ich es mir ansehe und verstehe, was sie tun, muss ich vielleicht anfangen, ein paar zu verwenden… Besonders :focus, :enabled & :disabled. Wäre wirklich gut, um meinen Kontaktformularen das gewisse Extra zu verleihen.
Die textbezogenen sind auch ziemlich cool, wird :first-letter von allen Browsern unterstützt?
Danke für die Bereitstellung all dieser, jetzt muss ich nur noch versuchen, mich zu erinnern, was sie alle tun.
Sehr interessante Zusammenfassung. Da ich kein CSS-Genie bin, liebe ich diese Einblicke in das, was möglich ist.
sehr schön! Die Eltern/Kind-Selektoren werden einige knifflige JavaScripts zum Teufel jagen.
Schöne Zusammenfassung in der Tat!
Es gibt viele Pseudo-Klassen, von denen ich noch nichts wusste.
Danke nochmal.
Als Antwort auf meinen ersten Kommentar: http://www.quirksmode.org/css/contents.html
Etwas Pseudo-Liebe!
Ein weiterer sehr nützlicher Artikel, ich schätze die Arbeit, die du investiert hast, sehr, danke Chris
Sehr nützlich! Mach weiter so, Chris!
Hey,
Danke, dass du eine so schöne Zusammenfassung geteilt hast.
Vielleicht sollten Sie den Unterschied zwischen Pseudo-Klassen und Pseudo-Elementen und die Verwendung von doppelten oder einzelnen Doppelpunkten (::) erwähnen
Viele Grüße,
dave
Schön, Chris! :not und :empty Pseudo-Klassen waren mir nicht bewusst. Zu schade, dass beide in IE verfügbar sind. VERDAMMTES IE!
Toller Beitrag. Ich benutze :nth-last-child(N) und :nth-last-of-type(N) nicht oft, muss aber vielleicht anfangen, sie mehr zu benutzen
Gute Zusammenfassung!
Ist die Kompatibilitätsliste für die Browserversionen so einfach wie "sie funktioniert in allem außer IE Version < 9"? Ich habe viele Kunden, die "browser-versionstechnisch" hinterherhinken… leider.
Oh, Sie haben hier einen kleinen Tippfehler
"Sie können Pseudo-Selektoren verketteln, genau wie Sie..."
Großartige Sachen. Pseudo-Klassen sind großartig… das einzige Problem ist die Browserkompatibilität. Danke für die Liste!
„Wird auch häufig für den clearfix verwendet, bei dem ein leerer Raum…“
Der Clearfix HACK ist keine gute Sache. CSS braucht eine offizielle, dokumentierte Möglichkeit, Floats zu bereinigen.
Sicher, der Clearfix HACK wird uns mindestens noch 10 Jahre begleiten, aber das bedeutet nicht, dass wir dieses Problem ignorieren und es nicht mit einem richtigen CSS-Attribut angehen sollten.
Ich mag die Ideen, die Sie über einen Wert für die Overflow-Eigenschaft zum Bereinigen von Floats gepostet haben.
Aber um klar zu sein, der Clearfix ist kein Hack. Es ist gültiges CSS. Erst die Anpassung an IE 6/7 verwendet Hacks.
Okay, da haben Sie Recht. Aber es fühlt sich einfach nicht "richtig" an, all diese Dinge definieren zu müssen, um ein einfaches, sehr gewünschtes Verhalten zu erzielen.
Würden Sie einen Artikel über die Gründe schreiben, warum Elterncontainer zusammenfallen, wenn ihre Kinder gefloatet sind. Ich kann mir kein Szenario mit einem Layout vorstellen, das ich je erstellt habe, bei dem ich *wollte*, dass ein Container zusammenfällt. Ich denke, ich bevorzuge das alte Verhalten von IE, immer um Floats herum zu wickeln. Das ist einfach das, was am sinnvollsten ist 99,99999% der Zeit (in meinen Layouts).
Das ist eine großartige Idee. Es ist seltsam… aber es gibt einen Grund, warum es so funktioniert. Und tatsächlich, wenn es andersherum funktionieren würde, glaube ich, wir würden uns MEHR beschweren.
Ich bin anderer Meinung, aber ich müsste die Szenarien sehen, in denen Sie denken, es wäre ein größeres Problem.
Wenn Sie viele Bilder auf einer Seite mit viel Text haben und jedes Bild mit einem Absatz-Tag versehen ist und aus irgendeinem Grund alle Absätze auf clearfix gesetzt sind, dann würde es nicht gut aussehen, wenn viele der Bilder höher sind als ihre Absätze.
Aber die meiste Zeit in meiner Arbeit, wenn ich ein Bild-Tag verwende, ist es in seinem eigenen p/div/figure mit einer einzeiligen Beschreibung. Wenn diese Figur gefloatet ist, kann sie bei Bedarf neben mehreren Absatzblöcken laufen.
Es hat nichts damit zu tun, ob Sie möchten, dass ein Container zusammenfällt oder nicht. Der Grund, warum der Container zusammenfällt, ist, dass, wenn Sie "float" zu einem Element hinzufügen, es aus dem Dokumentfluss entfernt wird. Um SitePoints CSS-Referenz zum Bereinigen von Floats zu zitieren: "Eine gefloatete Box wird aus dem Fluss genommen, sodass sie die umgebenden Block-Level-Boxen nicht beeinflusst." (was das Standardverhalten ist und erforderlich ist, um Floats korrekt zu machen.)
Richtig. Floats sind wie die halbe Cousine von absoluter Positionierung. Sie sind aus dem Dokumentfluss entfernt… irgendwie.
Das "hochgradig wünschenswerte Verhalten" von Floats ist, dass sie Blockelemente (die nicht gefloatet sind) nicht beeinflussen, aber Inline-Elemente (wie Text) um sie herumfließen.
Deshalb funktioniert das Hinzufügen von "float: left;" zu einem Bild in einem Absatz so, wie Sie es erwarten: Das Bild geht nach links, der Absatz bewegt sich nicht, und der Text fließt um das Bild herum. Perfekt.
Das macht sie jedoch zu zickigen Monstern für komplexe Layouts. Sie sind wahrscheinlich der schlechteste Weg, um komplizierte Layouts zu erstellen… außer jeder andere Weg.
@Lee: Ja, wenn ein Bild links in einem Absatz schwebt und das Bild länger ist als der Absatz, möchten Sie, dass die nächsten Absätze auch um das Bild herum fließen. Ich denke, dafür wurde "float" entwickelt – es ist nur schade, dass wir es für alles andere verwenden müssen, wenn wir Tabellen vermeiden wollen.
Der offizielle Weg ist display: table und display: table-cell etc. Aber raten Sie mal, wer das nicht unterstützt und es somit im realen Leben nutzlos macht. Tipp: Es ist derselbe Browser, der auch nur wenige dieser Pseudoselektoren unterstützt.
Du hast a:focus vergessen, das ich normalerweise anstelle von a:active für die Tabbing-Unterstützung verwende (hervorhebt den aktuellen verlinkten Link).
Sehr schöne Zusammenfassung.
Schade, dass :contains, das einen Selektor (wie die :has()-Methode von jQuery) nimmt, wahrscheinlich nicht kommen wird. Ich denke, jeder Entwickler auf der Welt würde es lieben, nur um a:contains(img) machen zu können.
Ein paar Kleinigkeiten
Für :first-child würde ich es so formulieren: „Wählt das Element aus, nur wenn es das erste Kind seines Elternelements ist.“ Ähnlich für :last-child. Ich interpretiere Ihre aktuelle Beschreibung („Wählt das erste Element seines Typs innerhalb eines Elternelements aus“) als dem Sinn von :first-of-type näher.
:before und :after sind technisch gesehen Pseudo-ELEMENTE, keine Pseudoklassen. Der Unterschied, wie Sie bemerken, ist, dass (a) Sie
müssenInhalt hinzufügen (viele Browser zeigen sie nicht an, wenn kein Inhalt hinzugefügt wurde) und sie können mehr Arten von Stilen akzeptieren (wie clear:both;, weshalb sie für die clearfix-Methode verwendet werden).Wann bekommen wir Elternselektoren? Wenn wir also zum Beispiel eine Eigenschaft für das übergeordnete a-Tag setzen wollen, das ein img-Tag umschließt... was fast immer ein bisschen mühsam ist. Meine neueste Lösung ist, verlinkten Bildern einfach eine Klasse .imglink zu geben, die meine anderen Linkstile überschreibt, damit ich keinen seltsamen Hintergrund oder anderes seltsames Verhalten bekomme, aber es wäre viel einfacher, eine CSS-Regel für img:parent a (oder wie auch immer die Syntax funktionieren würde – a:parent img?) zu setzen. Haben Sie dazu in CSS3 etwas gehört? (oder gibt es das schon, was ich übersehen habe?)
Ich sollte erwähnen, dass ich dem übergeordneten „a“-Tag die Klasse imglink gebe… <a class=“imglink”><img…
Ich habe dieselbe Frage schon woanders gestellt. Ich bekam einmal eine Antwort von jemandem, der behauptete, mit dem Code in Webkit und Firefox vertraut zu sein, und er sagte, dass 2 Probleme, die seine Umsetzung verhinderten, die Geschwindigkeit und die Reihenfolge seien, in der der Browser die CSS anwendet.
Ich kann die Geschwindigkeitsausrede ehrlich gesagt nicht glauben. So ziemlich jede JavaScript-Bibliothek erlaubt es Ihnen, ein Element zu finden und dann den DOM-Baum zu seinen Eltern und Vorfahren hochzusteigen. Wenn jQuery & Prototype das können, warum kann der Browser das nicht noch schneller?
jQuery und Co. führen ihre DOM-Traversierungen nur durch, wenn Sie sie ausdrücklich dazu auffordern. Der Browser muss jedoch bei *jeder dynamischen Seitenaktualisierung* und einigen Benutzerinteraktionen neu berechnen, welche CSS-Regeln zutreffen. Stellen Sie sich vor, Sie hätten
div:ancestor(a:hover) { font-weight: bold }Der Browser müsste jedes Mal, wenn der Benutzer die Maus in oder aus einem A-Tag bewegt, den DOM bis zur Wurzel durchlaufen und dann potenziell einen riesigen Bereich des Dokuments neu aufbauen!
Guter Artikel. Ich habe nicht viele Websites gefunden, die die Pseudoklassen gut erklären. W3schools deckt nicht einmal mehr als die absolut grundlegendsten ab. Um pingelig zu sein, decken Sie aber auch einige Pseudoelement-Selektoren ab, die nicht denselben Namen wie Pseudoklassen haben. :)
Nichtsdestotrotz wurde dieser Artikel als Lesezeichen gespeichert!
Für alle, die gerne die Macht von CSS erkunden, ist dies ein weiterer guter Artikel: http://www.smashingmagazine.com/2009/08/17/taming-advanced-css-selectors/
Ausgezeichneter Artikel Chris.
Und das alles funktioniert in IE6 / IE7? (IE8?)
Großartiger Beitrag! Ich wusste nichts von all den anderen Pseudoselektoren. Besonders der, der es uns ermöglicht, das letzte und erste Element einer unsortierten Liste auszuwählen! Es spart Zeit und Platz, zusätzliche Klassen dafür zu erstellen (wenn und wann benötigt).
Wie immer, sehr schön und einfach erklärt. Ich werde „n00bs“ sowohl an w3schools als auch an css-tricks weiterleiten ;-)
Ich zitiere aus den HTML-Spezifikationen
Zu jeder Zeit ist genau einer der Radio-Buttons in einer Gruppe ausgewählt. Wenn keines der Elemente einer Gruppe von Radio-Buttons `CHECKED` angibt, dann muss der User-Agent zunächst den ersten Radio-Button der Gruppe auswählen.
Wie würde das also die Hinzufügung einer indeterminate Pseudoklasse in CSS rechtfertigen?
Außerdem hat p:empty{display:none;} , was wie eine einfache Lösung schien, um Daten zu entfernen, die ansonsten in einem p-Element angezeigt würden, seine Arbeit zu gut gemacht. In einigen seltsamen Fällen setzte es auch display:none auf p-Elemente, die absolut nicht leer waren.
Wenn Sie sich also fragen, warum etwas verschwunden ist, überspringen Sie dies und beheben Sie es serverseitig ;-)
:root schien auf meiner html5-Seite auch nicht gut zu funktionieren (glücklicherweise spielte das keine Rolle, ich wollte es nur testen)
Ich würde gerne einen Testfall für :empty sehen, das ein Element verschwinden lässt, das nicht leer ist, das wäre eine gute Sache, um sie zu dokumentieren.
Das ist interessant über die Spezifikationen und das „genau eins“-Geschäft. Frage mich, welcher Doctyp… hast du einen Link?
Wo es um das „genau eins“ geht
http://www.w3.org/TR/html401/interact/forms.html#h-17.2.1
Da ich mehr an HTML5 als „Partner“ von CSS3 interessiert bin, habe ich mir dann das Unterschiedsdokument angesehen. Aber ich konnte keinen Unterschied zwischen HTML4 und 5 bei Radio-Buttons finden.
http://dev.w3.org/html5/html4-differences/
Es könnte sein, dass ich einige Specs vermisse, ich kann nicht sagen, dass ich jedes Dokument gelesen habe, das W3 jemals erstellt hat.
Zum anderen Thema;
Es ist eine Weile her, seitdem ich den Fehler gefunden habe. Ich habe ihn gerade neu erstellt, indem ich p:empty{display:hidden;} oben in mein Stylesheet eingefügt habe.
Es scheint, dass ich zu der Zeit keine anderen Browser getestet habe. Wenn ich es getan hätte, wüsste ich, was ich jetzt weiß: Es betrifft nur Webkit.
Screenshot, wie es sein sollte
http://geuze.name/other/how_it_should_be.png
Dann Safari
http://geuze.name/other/bug_safari:empty.png
Dann Chrome(5)
http://geuze.name/other/bug_chrome:empty.png
Der Fehler verschwindet, sobald Sie mit der Maus über das Element/die Elemente fahren (was es immer noch ärgerlich macht, es zu sehen)
Vielleicht ist das verwendete Stylesheet nicht das beste (ich bin mir ziemlich sicher), aber ich sehe keinen Grund, warum es hier fehlschlagen sollte, außer dass es ein (seltener) Fehler in Webkit ist.
Ich meinte p:empty{display:none;}
Ich bin gerade von der Feier des St. Patrick's Day zurückgekommen ;)
Ja, das bedeutet, kein einziger großer Browser ist vollständig HTML4-konform. Die HTML5-Spezifikation hat dies anerkannt: http://dev.w3.org/html5/spec/forms.html#radio-button-group (der große grüne Text, falls Sie ihn übersehen).
Meiner Meinung nach ist das eine schlechte UI. Die beliebteste Option sollte ausgewählt sein. Wenn das Nichtwählen gültig ist, dann ist eine Radio-Gruppe keine gute Wahl, weil der Benutzer die Gruppe nicht einfach in ihren unbestimmten Zustand zurückversetzen kann.
Schön! Papa CSS hat wirklich viele „Kinder“.
Hallo,
Kann jemand den wahren Unterschied zwischen Pseudoklassen und Pseudoelementen erklären?
Beides ist sehr unterschiedlich, aber ich kann sie immer noch nicht unterscheiden.
Und ich habe auf einer Website gelesen, dass es Pseudoselektoren, Pseudoklassen-Selektoren und Pseudoelement-Selektoren gibt. Ich bin so verwirrt!
Die einzigen Pseudoelemente, die ich verwende, sind a:link, a:visited, a:hover. Und ich dachte, sie würden Pseudoklassen genannt!
Kann mir jemand das klarstellen, bitte?
Danke!
Sehr schöner Artikel, Chris!
Ich mag die clearfix-Methode und werde sie wahrscheinlich von nun an implementieren. Danke!
Ich liebe diese Beiträge, die Licht auf untergenutzten und relativ unbekannten Code werfen. Es ist, als würde man eine Tür mit einem staubbedeckten Griff finden…
Ich hoffe nur, auf der anderen Seite gibt es einen Boden ;)
:contains() wird höchstwahrscheinlich als :matches() oder :any() zurückkehren, obwohl es wahrscheinlich nicht in CSS3, sondern wahrscheinlich in CSS4 oder als UA-Erweiterung aufgenommen wird.
Sie können die aktuelle Diskussion in den ww-style Mailinglistenarchiven einsehen.
Benutze in letzter Zeit viel nth-child. Habe nicht daran gedacht, :first-letter und :last-letter zu verwenden, um ein stilisiertes Zitat oder eine Blockquote zu erstellen. Ich wünschte wirklich, CSS3 würde eine „current“-Pseudoklasse für Elemente wie Links in Navigationen bieten :-)
Danke, ich bin ein Junior für CSS, nützlich für mich
Liege ich richtig??
Durch das Studium glaube ich, dass ich tun kann, was gesagt wird!
Tolle Zusammenfassung, Chris, einiges, was ich nicht kannte, also wird das sehr nützlich sein.
Schöne Zusammenfassung.
Cris, wie erwartet – Wunderbarer plus informativer Artikel.
Ich werde sicherlich p:first-child:first-letter {font-size:16px } hinzufügen, um zu sehen, ob es positive Auswirkungen auf meine Leser auf meinem Blog hat.
– Aery
p:first-child:first-letter
Das funktioniert in keinem Browser (FF, Safari, IE, …). Was habe ich falsch gemacht?
Was funktioniert, ist p:first-letter, aber das ist nicht das, was ich will.
Chris, das ist eine großartige Erklärung!
Es wäre toll, wenn es eine Art Tabelle mit diesen gäbe… und vielleicht auch, welche Browser die einzelnen unterstützen? **Weiß jemand, ob es eine gibt?** Auch wenn sie nicht so gründlich ist wie Ihr obiger Artikel?
Es ist immer so interessant und sehr geschätzt, welches Wissen diese Seite bietet! Aber ehrlich gesagt, solange IE nicht mitspielt, kann es in den nächsten, sagen wir, 10 Jahren nicht verwendet werden?
Die notwendigen Fallbacks für den genannten Browser machen die Verwendung all dieser großartigen CSS-Handhabungen fast unnötig.
:target wäre tatsächlich äußerst nützlich und würde die Ladezeiten der Seiten verkürzen. Sie müssten dann nur noch eine JavaScript-Lösung für IE programmieren, während andere Browser nur CSS laden müssten. Auch die Möglichkeit, auf einen Hash zu prüfen, ist ziemlich cool, ohne PHP oder JS zu benötigen.
Danke für den Artikel.
Hallo Chris, toller Artikel. Ich vergesse immer, :focus auf meine Formulare anzuwenden, nur eine dieser Dinge, die ich zur Gewohnheit machen muss!
Kleiner Tippfehler, nach der Überschrift „Quick Note“
„You can chain pseduo…“ sollte lauten
„You can chain pseudo…“
Ein weiterer fantastischer Artikel. Ich mache mir jetzt Notizen zu einigen von ihnen, damit ich sie in meinem nächsten Projekt nicht vergesse. Danke Chris.
Was empfehlen Sie, wenn Sie einem selbstschließenden Element das Attribut einer Seite hinzufügen möchten? (Das macht in XML mehr Sinn.) Ich kann :before oder :after verwenden, aber es gibt nichts, davor oder danach zu sein. Ich hoffe, Sie verstehen, was ich meine.
Chris, großartiger Schreibstil, Mann! Ich kann es kaum erwarten, es im Detail zu durchgehen!
SitePoint CSS Reference (http://reference.sitepoint.com/css/specificity) sagt zur Berechnung der Spezifität
…
Zählen Sie die Klassen-Selektoren (z.B. .test), Attribut-Selektoren (z.B. [type="submit"]) und Pseudo-Klassen (z.B. :hover).
…
Um c zu berechnen, zählen Sie die Anzahl anderer Attribute und Pseudo-Klassen im Selektor.
Ich denke also, die Spezifität eines Pseudoklassen-Selektors ist NICHT geringer als die eines regulären Klassen-Selektors
was ist die Wahrheit?
Ich denke, SitePoint hat Unrecht. Ich habe gerade einen Test gemacht (aktuelles Firefox und Safari) und ein echter Klassen-Selektor (.test) hat einen Pseudoselektor (:nth-child) in einem Spezifitätskampf jedes Mal geschlagen. Ich habe sogar versucht, die Dokumentenreihenfolge zu ändern, falls sie genau gleich waren.
Ich bin darüber verärgert, also habe ich auch getestet (FF3.6.2 und Chrome4.0.280)
Bitte prüfen Sie dies
http://teamtom.net/homokozo/pseudo-class-spec-test/pseudo-class-specificity-test-1a.html
Jedes zweite Element, das durch :nth-child grün gefärbt ist, plus das erste Listenelement, das durch eine Klasse blau gefärbt ist
und dann das
http://teamtom.net/homokozo/pseudo-class-spec-test/pseudo-class-specificity-test-1b.html
Das erste Element wurde ebenfalls grün, da ich die Reihenfolge der Definitionen geändert habe
Das beweist mir, dass li:nth-child(2n-1) und li.first dieselbe Spezifität haben und das letzte gewinnt
Was denkst du?
Du hast Recht, mein Test war fehlerhaft. Bei der Korrektur meines eigenen Tests habe ich festgestellt, dass der zweite Selektor, auch wenn er ein Pseudoselektor war, den echten Klassen-Selektor schlug und damit bewies, dass sie den gleichen Wert haben.
Ich habe den Artikel aktualisiert, um korrekter zu sein. Ich wünschte auch, ich könnte mich erinnern, wo ich diese Tabelle ursprünglich gesehen habe, weil jemand sie falsch hat.
FRAGE?
div id=asidegroup, das linke und rechte Asides enthält, kann auf opacity 0.2 gesetzt werden, dann opacity 1.0 beim Hover… Hovern eines und beide erscheinen. Hier stylen wir einen physischen Div-Container für zwei Objekte an einem physischen Ort, und es funktioniert großartig!
Nun, sagen wir, wir möchten, dass alle über die Seite verteilten Chickadee-Schnappschüsse flatter und zwitschern, wenn wir einen Chickadee anhovern… wie machen wir das? Nehmen wir es nun weiter. Sagen wir, wir möchten, dass alle **mädchen** Chickadee-Schnappschüsse flattern und zwitschern, wenn ein Mädchen angehovert wird, und dasselbe gilt für die Jungen, wenn ein **Junge** natürlich angehovert wird… Hier wollen wir bestimmte Seitenobjekte in einer Stilgruppe isolieren, die physisch isolierte, wahrscheinlich klassenbezogene Objekte enthält (es könnte aber auch eine benannte Gruppe von IDs sein). Wie machen wir das?
Ich habe so etwas auf einer Cornell Ornithology-Seite gesehen, auch auf einer Yellowstone Volcano-Seite, aber das waren Mars Lander-Skripte. Wir wollen Stilgruppierung mit HTML5 und CSS3 erkunden.
Chris, was Sie und TeamTom angehen, ist auf programmatischer Ebene eine Mischung aus sehr unterschiedlichen Textverarbeitungseinheiten. Zum Beispiel, wo :active gelb einfängt, dann :focus' gelb hier, dann bleibt der Hintergrund als Erinnerung an den zuletzt aufgerufenen Link, bis die Seitenoberfläche angeklickt wird – Internet Explorer. Während Chrome unfähig ist, aktive Fokus-Anweisungen zwischen wörtlichen Instanzen beizubehalten, da es auf die primäre, rohe Link-bezogene Fokus-Implementierung zurückgreift. Jedenfalls, so wie aktiv Fokus einprägt, die Fokussierung apart im obersten Zuverlässigkeitssitz platziert (oben auf dieser Seite, lol), gut, Fokus, obwohl weniger aufdringlich, prägt auch konsistent die programmatische Schnittstelle mit der gleichen Zuverlässigkeit wie z.B. Hover ein. Ich bemerke, dass Sie meinen älteren Beitrag hier entfernt haben (raten Sie mal, er wurde nicht von allen richtig verstanden), wo wir Nth of n mit Fokus als „Begrenzer“ herausforderten. In vielerlei Hinsicht ist Fokus zuverlässiger als Hover, obwohl sein öffentliches Profil grob von Leuten wie Google zersplittert wird, die so wenig wie möglich so schnell wie möglich umsetzen wollen. Lassen wir uns nicht blenden, oder? Ich meine, die öffentliche Schnittstelle, die wir hier teilen, ist ein sehr kleiner Teil dessen, was das Internet ist, jede Schnittstelle bietet eine einzigartige Reihe programmatischer Interpolationen. Wo Schnittstellenkommandanten (noch Kommandos) den Takt vorgeben, würde :focus ebenfalls oben auf der Seite sitzen. Ist das zu anspruchsvoll (oder speziell)?
Sie haben einen Fehler in der Beschreibung von last-child.
Sie sagten „…seines Typs…“, aber es sollte „wenn das letzte Element zufällig diesem Typ entspricht“ oder so sein.
und das ist die Definition für nth-last-of-type, nicht für last-child… und toll, jemand hat es vor 4 Jahren bemerkt ¬¬ und es bereits oben kommentiert.