Ich habe eine Reihe von Elementen mit einem Klassennamen red
, aber ich kann das erste Element nicht mit class="red"
der folgenden CSS-Regel auswählen :
.red:first-child {
border: 5px solid red;
}
<p class="red"></p>
<div class="red"></div>
Was ist an diesem Selektor falsch und wie korrigiere ich ihn?
Dank der Kommentare habe ich herausgefunden, dass das Element das erste Kind seines Elternteils sein muss, um ausgewählt zu werden, was bei mir nicht der Fall ist. Ich habe die folgende Struktur und diese Regel schlägt fehl, wie in den Kommentaren erwähnt:
.home .red:first-child {
border: 1px solid red;
}
<div class="home">
<span>blah</span>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
Wie kann ich das erste Kind mit Klasse ansprechen red
?
css
css-selectors
Rajat
quelle
quelle
:first-of-type
es .Antworten:
Dies ist eines der bekanntesten Beispiele für Autoren, die falsch verstehen, wie es
:first-child
funktioniert. Eingeführt in CSS2 , die:first-child
darstellt , pseudo-Klasse das erste Kind seiner Eltern . Das ist es. Es gibt ein sehr häufiges Missverständnis, dass es jedes untergeordnete Element aufgreift, das als erstes den Bedingungen entspricht, die vom Rest des zusammengesetzten Selektors angegeben werden. Aufgrund der Arbeit Selektoren Art und Weise (siehe hier für eine Erklärung), die einfach nicht wahr ist.Selektorebene 3 führt eine
:first-of-type
Pseudoklasse ein , die das erste Element unter den Geschwistern seines Elementtyps darstellt. Diese Antwort erklärt anhand von Abbildungen den Unterschied zwischen:first-child
und:first-of-type
. Wie:first-child
bei werden jedoch keine anderen Bedingungen oder Attribute berücksichtigt. In HTML wird der Elementtyp durch den Tag-Namen dargestellt. In der Frage ist dieser Typp
.Leider gibt es keine ähnliche
:first-of-class
Pseudoklasse zum Abgleichen des ersten untergeordneten Elements einer bestimmten Klasse. Eine Problemumgehung , die Lea Verou und ich uns dafür ausgedacht haben (wenn auch völlig unabhängig), besteht darin, zuerst Ihre gewünschten Stile auf alle Ihre Elemente mit dieser Klasse anzuwenden :... dann "rückgängig machen" Sie die Stile für Elemente mit der Klasse, die nach der ersten kommen , unter Verwendung des allgemeinen Geschwisterkombinators
~
in einer übergeordneten Regel:Jetzt hat nur das erste Element mit
class="red"
einen Rand.Hier ist eine Illustration, wie die Regeln angewendet werden:
Es werden keine Regeln angewendet. Es wird kein Rand gerendert.
Dieses Element hat keine Klasse
red
, daher wird es übersprungen.Es wird nur die erste Regel angewendet. Ein roter Rand wird gerendert.
Dieses Element hat die Klasse
red
, aber es werden keine Elemente mit der Klassered
im übergeordneten Element vorangestellt . Somit wird nicht die zweite Regel angewendet, sondern nur die erste, und das Element behält seinen Rand.Beide Regeln werden angewendet; Es wird kein Rand gerendert.
Dieses Element hat die Klasse
red
. Es wird auch mindestens ein weiteres Element mit der Klasse vorangestelltred
. Somit werden beide Regeln angewendet, und die zweiteborder
Deklaration überschreibt die erste, wodurch sie sozusagen "rückgängig gemacht" wird.Als Bonus wird der allgemeine Geschwisterkombinator, obwohl er in Selectors 3 eingeführt wurde, von IE7 und neueren Versionen im Gegensatz zu
:first-of-type
und ziemlich gut unterstützt:nth-of-type()
die nur weiter mit dem IE9 unterstützt werden. Wenn Sie gute Browserunterstützung benötigen, haben Sie Glück.Die Tatsache, dass der Geschwisterkombinator die einzige wichtige Komponente in dieser Technik ist und eine so erstaunliche Browserunterstützung bietet, macht diese Technik sehr vielseitig - Sie können sie neben den Klassenselektoren auch zum Filtern von Elementen durch andere Dinge anpassen:
Sie können dies verwenden, um
:first-of-type
in IE7 und IE8 zu umgehen, indem Sie einfach einen Typ-Selektor anstelle eines Klassen-Selektors angeben (mehr zu seiner falschen Verwendung hier in einem späteren Abschnitt):Sie können anstelle von Klassen nach Attributselektoren oder anderen einfachen Selektoren filtern .
Sie können diese übergeordnete Technik auch mit Pseudoelementen kombinieren , obwohl Pseudoelemente technisch gesehen keine einfachen Selektoren sind.
Beachten Sie, dass Sie im Voraus wissen müssen, welche Standardstile für Ihre anderen Geschwisterelemente verwendet werden, damit Sie die erste Regel überschreiben können. Da dies das Überschreiben von Regeln in CSS beinhaltet, können Sie mit einem einzelnen Selektor zur Verwendung mit der Selectors-API oder Selenium nicht dasselbe erreichen den CSS-Locators von .
Es ist erwähnenswert, dass Selectors 4 eine Erweiterung der
:nth-child()
Notation einführt (ursprünglich eine völlig neue Pseudoklasse namens:nth-match()
), mit der Sie so etwas wie:nth-child(1 of .red)
anstelle einer Hypothese verwenden können.red:first-of-class
. Da es sich um einen relativ neuen Vorschlag handelt, gibt es noch nicht genügend interoperable Implementierungen, um ihn in Produktionsstätten verwenden zu können. Hoffentlich ändert sich das bald. In der Zwischenzeit sollte die von mir vorgeschlagene Problemumgehung in den meisten Fällen funktionieren.Beachten Sie, dass diese Antwort davon ausgeht, dass die Frage nach jedem ersten untergeordneten Element sucht, das eine bestimmte Klasse hat. Es gibt weder eine Pseudoklasse noch eine generische CSS-Lösung für die n-te Übereinstimmung eines komplexen Selektors im gesamten Dokument - ob eine Lösung vorhanden ist, hängt stark von der Dokumentstruktur ab. jQuery bietet
:eq()
,:first
,:last
und zu diesem Zweck, aber beachten Sie wieder , dass sie funktionieren ganz anders:nth-child()
et al . Mit der Selectors-API können Sie entwederdocument.querySelector()
die allererste Übereinstimmung erzielen:Oder verwenden Sie
document.querySelectorAll()
einen Indexer, um eine bestimmte Übereinstimmung auszuwählen:Obwohl die
.red:nth-of-type(1)
Lösung in der ursprünglich akzeptierten Antwort von Philip Daubmeier funktioniert (die ursprünglich von Martyn geschrieben, aber seitdem gelöscht wurde), verhält sie sich nicht so, wie Sie es erwarten würden.Wenn Sie beispielsweise nur das
p
in Ihrem ursprünglichen Markup auswählen möchten:... dann zu verwenden , kann man nicht
.red:first-of-type
(entspricht.red:nth-of-type(1)
), da jedes Element der ersten (und einzigen) einer ihrer Art (istp
unddiv
jeweils), so dass beide werden durch den Selektor angepasst werden.Wenn das erste Element einer bestimmten Klasse auch das erste seiner Art ist , funktioniert die Pseudoklasse, dies geschieht jedoch nur durch Zufall . Dieses Verhalten wird in Philipps Antwort demonstriert. Sobald Sie ein Element des gleichen Typs vor diesem Element einfügen, schlägt die Auswahl fehl. Nehmen Sie das aktualisierte Markup:
Das Anwenden einer Regel mit
.red:first-of-type
funktioniert, aber sobald Sie eine anderep
ohne die Klasse hinzufügen :... der Selektor schlägt sofort fehl, da das erste
.red
Element jetzt das zweitep
Element ist.quelle
:last-of-class
? Wählen Sie das letzte Element einer Klasse aus.general sibling selector ~
funktioniert:not(:first-of-*)
für einen bestimmten Typ Ich gehe davon aus, dass es die Regel auf jedes übereinstimmende Element anwenden sollte, aber es wird nur für die erste Übereinstimmung angewendet, selbst wenn es 3 oder mehr mögliche Übereinstimmungen gibt.:nth-child(1 of .foo)
Erweiterung bereits auf Safari 9.1+ implementiert. (Ich habe es aber nicht überprüft)Der
:first-child
Selektor soll, wie der Name schon sagt, das erste untergeordnete Element eines übergeordneten Tags auswählen. Die Kinder müssen in dasselbe übergeordnete Tag eingebettet sein. Ihr genaues Beispiel wird funktionieren (habe es gerade hier ausprobiert ):Vielleicht haben Sie Ihre Tags in verschiedenen übergeordneten Tags verschachtelt? Sind Ihre Klassen-Tags
red
wirklich die ersten Tags unter dem übergeordneten Element?Beachten Sie auch, dass dies nicht nur für das erste derartige Tag im gesamten Dokument gilt, sondern jedes Mal, wenn ein neues übergeordnetes Element darum gewickelt wird, wie z.
first
undthird
wird dann rot sein.Aktualisieren:
Ich weiß nicht, warum Martyn seine Antwort gelöscht hat, aber er hatte die Lösung, den
:nth-of-type
Selektor:Dank an Martyn . Weitere Infos zum Beispiel hier . Beachten Sie, dass dies ein CSS 3-Selektor ist, daher werden ihn nicht alle Browser erkennen (z. B. IE8 oder älter).
quelle
:nth-of-type
das leichte Problem hat, in keiner aktuellen Version von IE überhaupt zu funktionieren..red:nth-of-type(1)
jedes Element aus, das (a) das erste untergeordnete Element seines Elementtyps ist und (b) die Klasse "rot" hat. Wenn also im Beispiel das erste <p> keine Klasse "rot" hätte, würde es nicht ausgewählt. Wenn alternativ der <span> und der erste <p> beide die Klasse "rot" hätten, würden beide ausgewählt. jsfiddle.net/fvAxn:first-of-type
ist gleichbedeutend mit:nth-of-type(1)
, also funktioniert es natürlich auch. Es kann auch aus dem gleichen Grund, den ich in meiner Antwort angegeben habe, auf die gleiche Weise scheitern.:nth-of-type
bedeutet "Element / Tag", wenn es "Typ" sagt. Es wird also nur das Element berücksichtigt, nicht Dinge wie Klassen.Die richtige Antwort ist:
Teil I: Wenn das Element das erste übergeordnete Element ist und die Klasse "rot" hat, erhält es einen Rand.
Teil II: Wenn das Element ".red" nicht das erste Element seines Elternteils ist, sondern unmittelbar einem Element ohne Klasse ".red" folgt, verdient es auch die Ehre dieser Grenze.
Geige oder es ist nicht passiert.
Die Antwort von Philip Daubmeier ist zwar akzeptiert, aber nicht korrekt - siehe beigefügte Geige.
Die Antwort von BoltClock würde funktionieren, definiert aber unnötig Stile und überschreibt sie
(insbesondere ein Problem, bei dem es sonst einen anderen Rand erben würde - Sie möchten keinen anderen zum Rand deklarieren: keinen).
BEARBEITEN: Für den Fall, dass Sie mehrmals "Rot" nach Nicht-Rot haben, erhält jedes "erste" Rot den Rand. Um dies zu verhindern, müsste man die Antwort von BoltClock verwenden. Siehe Geige
quelle
.red
folgt a:not(.red)
macht es nicht immer zum ersten.red
unter seinen Geschwistern. Und wenn die Grenze vererbt werden muss, ist es einfach eine Frage der Deklarationborder: inherit
stattborder: none
der Überschreibungsregel.first-child
zulast-child
, aber ich sehe nach dem Testen, dass dies nicht immer den Trick macht.Sie könnten
first-of-type
oder verwendennth-of-type(1)
quelle
<p></p>
zwischen demspan
und Ihrem erstenp
Element mitred
Klasse haben. Schau dir diese JSFiddle an .Die obigen Antworten sind zu komplex.
Dadurch wird der erste Klassentyp ausgewählt. MDN-Quelle
quelle
first-type
wurde umbenannt infirst-of-type
<span>
, und einige haben die Klassehighlight
. Der.highlight:first-of-type
Selektor wählt die erste Instanz des "Typs" mit der ausgewählten Klasse aus, in diesem Beispiel die erste<span>
und nicht die erste Instanz der Klassehighlight
. Nur wenn diese erste Instanz von span auch das Klassenhighlight enthält, wird der Stil implementiert. ( codepen.io/andrewRmillar/pen/poJKJdJ )Um mit Ihrem Selektor übereinzustimmen, muss das Element den Klassennamen haben
red
und das erste untergeordnete Element seines übergeordneten Elements sein.quelle
Da die anderen Antworten abdecken, was daran falsch ist, werde ich die andere Hälfte versuchen, wie man es behebt. Leider weiß ich nicht, dass Sie hier nur eine CSS- Lösung haben, zumindest nicht, an die ich denken kann . Es gibt aber noch einige andere Möglichkeiten ....
Weisen
first
Sie dem Element beim Generieren eine Klasse zu:CSS:
Dieses CSS vergleicht nur Elemente mit beiden
first
undred
Klassen.Alternativ können Sie dasselbe in JavaScript tun. Beispiel: Mit welcher jQuery würden Sie dies tun, indem Sie dasselbe CSS wie oben verwenden:
quelle
:first-of-class
, würde ich auch vorschlagen, dem ersten Element eine zusätzliche Klasse hinzuzufügen. Scheint die einfachste Lösung für jetzt.Ich habe diesen in meinem Projekt.
quelle
Entsprechend Ihrem aktualisierten Problem
wie wäre es mit
Diese wählt Klasse nach Hause , dann das Element Spannweite und schließlich alle .red Elemente , die unmittelbar nach Spannweite Elemente platziert werden.
Referenz: http://www.w3schools.com/cssref/css_selectors.asp
quelle
Sie könnten nth-of-type (1) verwenden, aber stellen Sie sicher, dass die Site IE7 usw. nicht unterstützen muss. Wenn dies der Fall ist, verwenden Sie jQuery, um eine Körperklasse hinzuzufügen, und suchen Sie das Element über die IE7-Körperklasse, dann den Elementnamen und fügen Sie es hinzu im n-ten Kind Styling dazu.
quelle
Sie können Ihren Code in so etwas ändern, damit er funktioniert
Dies erledigt den Job für Sie
Hier ist eine CSS-Referenz von SnoopCode dazu .
quelle
Ich benutze unten CSS, um ein Hintergrundbild für die Liste ul li zu haben
quelle
Versuche dies :
quelle
Aus irgendeinem Grund schien keine der obigen Antworten den Fall des wirklichen ersten und einzigen ersten Kindes des Elternteils anzusprechen .
Alle oben genannten Antworten schlagen fehl, wenn Sie den Stil nur auf das Kind der ersten Klasse in diesem Code anwenden möchten.
quelle
:first-child
Pseudoklasse irreführend, da sie vor dem Hinzufügen.class_name
nichts an der Funktionsweise ändert und lediglich als Filter fungiert. Wenn Sie zuvor ein Div haben, stimmt<div class="class_name">First content that need to be styled</div>
Ihr Selektor nicht überein, da es nicht das eigentliche erste Kind ist.Versuchen Sie dies einfach und effektiv
quelle
Ich glaube, dass mit relativen Selektor
+
zur Auswahl von Elementen, die unmittelbar danach platziert werden, hier am besten funktioniert (wie nur wenige zuvor vorgeschlagen haben).In diesem Fall kann dieser Selektor auch verwendet werden
Dies ist jedoch die Elementauswahl, nicht die Klasse eins.
Hier haben Sie eine schöne Liste von CSS-Selektoren: https://kolosek.com/css-selectors/
quelle
Versuchen Sie diese Lösung:
CodePen-Link
quelle