Mam kilka elementów o nazwie klasy red
, ale nie mogę wybrać pierwszego elementu za class="red"
pomocą następującej reguły CSS:
.red:first-child {
border: 5px solid red;
}
<p class="red"></p>
<div class="red"></div>
Co jest nie tak w tym selektorze i jak go naprawić?
Dzięki komentarzom zorientowałem się, że element musi być pierwszym dzieckiem jego rodzica, aby zostać wybranym, co nie jest moim przypadkiem. Mam następującą strukturę i ta reguła zawodzi, jak wspomniano w komentarzach:
.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>
Jak mogę skierować pierwsze dziecko z klasą red
?
css
css-selectors
Rajat
źródło
źródło
:first-of-type
to działa.Odpowiedzi:
Jest to jeden z najbardziej znanych przykładów nieporozumień autorów dotyczących sposobu
:first-child
działania. Wprowadzony w CSS2 The:first-child
pseudoklasa oznacza pierwszego dziecka jego rodzica . Otóż to. Istnieje bardzo powszechne nieporozumienie, że wybiera on dowolny element potomny, który jako pierwszy spełnia warunki określone przez resztę selektora złożonego. Ze względu na pracę w sposób selektorów (patrz tutaj o wyjaśnienie), że nie jest po prostu nieprawda.Poziom selektorów 3 wprowadza
:first-of-type
pseudoklasę , która reprezentuje pierwszy element wśród rodzeństwa tego typu elementu. Ta odpowiedź wyjaśnia ilustracją różnicę między:first-child
i:first-of-type
. Jednak, podobnie jak w przypadku:first-child
, nie uwzględnia żadnych innych warunków ani atrybutów. W HTML typ elementu jest reprezentowany przez nazwę znacznika. W pytaniu tym typem jestp
.Niestety, nie ma podobnej
:first-of-class
pseudoklasy do dopasowania pierwszego elementu potomnego danej klasy. Jednym z obejść tego problemu, które opracowaliśmy wspólnie z Leą Verou (choć całkowicie niezależnie), jest zastosowanie pożądanych stylów do wszystkich elementów w tej klasie:... następnie „cofnij” style elementów z klasą następującą po pierwszej , używając ogólnego kombinatora rodzeństwa
~
w nadrzędnej regule:Teraz tylko pierwszy element z
class="red"
będzie miał obramowanie.Oto przykład zastosowania reguł:
Nie stosuje się żadnych zasad; żadna ramka nie jest renderowana.
Ten element nie ma klasy
red
, więc został pominięty.Stosowana jest tylko pierwsza reguła; renderowana jest czerwona ramka.
Ten element ma klasę
red
, ale nie jest poprzedzony żadnymi elementami z klasąred
w jej rodzicu. Zatem druga zasada nie jest stosowana, tylko pierwsza, a element zachowuje swoją granicę.Obie zasady są stosowane; żadna ramka nie jest renderowana.
Ten element ma klasę
red
. Poprzedza go także co najmniej jeden inny element z klasąred
. W ten sposób stosowane są obie reguły, a drugaborder
deklaracja zastępuje pierwszą, a tym samym „cofając” ją, że tak powiem.Jako bonus, mimo że został wprowadzony w Selectors 3, ogólny kombinator rodzeństwa jest w rzeczywistości dość dobrze obsługiwany przez IE7 i nowsze, w przeciwieństwie
:first-of-type
do tych,:nth-of-type()
które są obsługiwane tylko przez IE9. Jeśli potrzebujesz dobrego wsparcia przeglądarki, masz szczęście.W rzeczywistości fakt, że kombinator rodzeństwa jest jedynym ważnym elementem tej techniki i ma tak niesamowite wsparcie przeglądarki, czyni tę technikę bardzo wszechstronną - możesz ją dostosować do filtrowania elementów innymi rzeczami, poza selektorami klas:
Możesz użyć tego do obejścia
:first-of-type
w IE7 i IE8, po prostu podając selektor typu zamiast selektora klasy (ponownie, więcej o jego niewłaściwym użyciu tutaj w dalszej części):Możesz filtrować według selektorów atrybutów lub innych prostych selektorów zamiast klas.
Możesz także łączyć tę nadrzędną technikę z pseudoelementami, nawet jeśli pseudoelementy technicznie nie są prostymi selektorami.
Pamiętaj, że aby to zadziałało, musisz wcześniej wiedzieć, jakie będą domyślne style dla pozostałych elementów rodzeństwa, abyś mógł zastąpić pierwszą regułę. Dodatkowo, ponieważ wiąże się to z nadpisywaniem reguł w CSS, nie można osiągnąć tego samego za pomocą jednego selektora do użycia z Selectors API lub lokalizatorami Selenium CSS.
Warto wspomnieć, że Selektory 4 wprowadzają rozszerzenie
:nth-child()
notacji (pierwotnie zupełnie nowa pseudoklasa zwana:nth-match()
), które pozwoli ci użyć czegoś:nth-child(1 of .red)
w miejsce czegoś hipotetycznego.red:first-of-class
. Ponieważ jest to stosunkowo nowa propozycja, nie ma wystarczającej liczby interoperacyjnych implementacji, aby można ją było zastosować w zakładach produkcyjnych. Mam nadzieję, że wkrótce się to zmieni. Tymczasem zaproponowane przeze mnie obejście powinno działać w większości przypadków.Należy pamiętać, że ta odpowiedź zakłada, że pytanie szuka każdego pierwszego elementu potomnego, który ma daną klasę. Nie ma ani pseudoklasy, ani nawet ogólnego rozwiązania CSS dla n-tego dopasowania złożonego selektora w całym dokumencie - to, czy rozwiązanie istnieje, zależy w dużej mierze od struktury dokumentu. jQuery zapewnia
:eq()
,:first
,:last
i więcej do tego celu, ale znowu pamiętać, że działają one bardzo różnie od:nth-child()
et al . Korzystając z interfejsu API Selektorów, możesz użyć pierwszego,document.querySelector()
aby uzyskać pierwsze dopasowanie:Lub użyj
document.querySelectorAll()
z indeksem, aby wybrać dowolne określone dopasowanie:Chociaż
.red:nth-of-type(1)
rozwiązanie w pierwotnie zaakceptowanej odpowiedzi Philipa Daubmeiera działa (pierwotnie napisane przez Martyn, ale od tego czasu usunięte), nie zachowuje się tak, jak byś tego oczekiwał.Na przykład, jeśli chcesz tylko wybrać
p
w oryginalnym znaczniku:... wtedy nie możesz użyć
.red:first-of-type
(odpowiednika.red:nth-of-type(1)
), ponieważ każdy element jest pierwszym (i jedynym) jednym z jego typów (p
idiv
odpowiednio), więc oba zostaną dopasowane przez selektor.Gdy pierwszy element pewnej klasy jest również pierwszym tego typu , pseudoklasa będzie działać, ale dzieje się tak tylko przez przypadek . To zachowanie zostało wykazane w odpowiedzi Filipa. Gdy tylko włożysz element tego samego typu przed tym elementem, selektor zawiedzie. Biorąc zaktualizowany znacznik:
Zastosowanie reguły z
.red:first-of-type
będzie działać, ale gdy dodasz innąp
bez klasy:... selektor natychmiast zawiedzie, ponieważ pierwszy
.red
element jest teraz drugimp
elementem.źródło
:last-of-class
? Wybierz ostatni element klasy.general sibling selector ~
działa jak a:not(:first-of-*)
dla określonego typu, zakładam, że powinien on zastosować regułę do każdego pasującego elementu, ale jest stosowany tylko przy pierwszym dopasowaniu, nawet jeśli istnieją 3 lub więcej możliwych dopasowań.:nth-child(1 of .foo)
przedłużenie został już wdrożony na Safari 9.1+. (Nie sprawdziłem jednak):first-child
Selektor jest przeznaczony, jak sama nazwa mówi, aby wybrać pierwsze dziecko znacznika macierzystego. Dzieci muszą być osadzone w tym samym znaczniku nadrzędnym. Twój dokładny przykład zadziała (właśnie wypróbowałem tutaj ):Może umieściłeś tagi w różnych tagach nadrzędnych? Czy Twoje tagi klasy są
red
naprawdę pierwszymi tagami nadrzędnymi?Zauważ też, że nie dotyczy to tylko pierwszego takiego znacznika w całym dokumencie, ale za każdym razem, gdy jest zawijany nowy rodzic, na przykład:
first
i wtedythird
będzie czerwony.Aktualizacja:
Nie wiem, dlaczego Martyn usunął swoją odpowiedź, ale miał rozwiązanie,
:nth-of-type
selektor:Kredyty dla Martyn . Więcej informacji na przykład tutaj . Pamiętaj, że jest to selektor CSS 3, dlatego nie wszystkie przeglądarki go rozpoznają (np. IE8 lub starszy).
źródło
:nth-of-type
cierpi na niewielki problem polegający na tym, że w ogóle nie działa w żadnej obecnej wersji IE..red:nth-of-type(1)
wybierze dowolny element, który (a) jest pierwszym dzieckiem tego typu elementu, a (b) ma klasę „czerwoną”. Więc jeśli w przykładzie pierwszy <p> nie miałby klasy „czerwonej”, nie zostałby wybrany. Alternatywnie, jeśli oba <span> i pierwszy <p> miały klasę „czerwoną”, obie byłyby wybrane. jsfiddle.net/fvAxn:first-of-type
jest równoważne:nth-of-type(1)
, więc oczywiście też działa. Może również zawieść w ten sam sposób z tego samego powodu, który został podany w mojej odpowiedzi.:nth-of-type
oznacza „element / tag”, gdy mówi „typ”. Więc bierze pod uwagę tylko element, a nie rzeczy takie jak klasy.Poprawna odpowiedź to:
Część I: Jeśli element jest pierwszy od swojego rodzica i ma klasę „czerwoną”, powinien uzyskać granicę.
Część II: Jeżeli element „.red” nie jest pierwszy względem elementu nadrzędnego, ale natychmiast podąża za elementem bez klasy „.red”, zasługuje również na honor tej granicy.
Fiddle lub tak się nie stało.
Odpowiedź Philipa Daubmeiera, mimo że została zaakceptowana, jest nieprawidłowa - patrz załączone skrzypce.
Odpowiedź BoltClock działałaby, ale niepotrzebnie definiuje i zastępuje style
(szczególnie problem, w którym inaczej dziedziczy inną granicę - nie chcesz deklarować innej granicy: brak)
EDYCJA: W przypadku, gdy kilkakrotnie „czerwony” następuje po kolorze innym niż czerwony, każda „pierwsza” czerwień otrzyma ramkę. Aby temu zapobiec, trzeba użyć odpowiedzi BoltClock. Zobacz skrzypce
źródło
.red
podążanie za:not(.red)
nie zawsze czyni go pierwszym.red
wśród rodzeństwa. A jeśli granica musi zostać odziedziczona, wystarczy po prostu zadeklarowaćborder: inherit
zamiastborder: none
w regule zastępowania.first-child
nalast-child
, ale po przetestowaniu widzę, że to nie zawsze załatwia sprawę .możesz użyć
first-of-type
lubnth-of-type(1)
źródło
<p></p>
między pierwszymspan
a pierwszymp
elementemred
. Spójrz na to JSFiddle .Powyższe odpowiedzi są zbyt złożone.
Spowoduje to wybranie pierwszego typu klasy. Źródło MDN
źródło
first-type
przemianowano nafirst-of-type
<span>
, a kilka ma klasęhighlight
..highlight:first-of-type
Selektor będzie wybrać pierwszą instancję „typ” z wybranej klasy, w tym przykładzie pierwszym<span>
, a nie pierwsza instancja klasyhighlight
. Tylko jeśli ta pierwsza instancja zakresu ma również wyróżnienie klasy, styl zostanie zaimplementowany. ( codepen.io/andrewRmillar/pen/poJKJdJ )Aby dopasować selektor, element musi mieć nazwę klasy
red
i musi być pierwszym dzieckiem swojego rodzica.źródło
Ponieważ pozostałe odpowiedzi obejmować co złego z nią, postaram drugą połowę, jak to naprawić. Niestety nie wiem, czy masz tutaj rozwiązanie oparte wyłącznie na CSS , a przynajmniej nie o tym myślę . Istnieją jednak inne opcje ....
Przypisuj
first
klasę do elementu podczas jego generowania, w następujący sposób:CSS:
Ten CSS dopasowuje tylko elementy do obu
first
ired
klas.Alternatywnie, wykonaj to samo w JavaScript, na przykład oto jQuery, którego byś użył do tego, używając tego samego CSS jak powyżej:
źródło
:first-of-class
, sugerowałbym również dodanie dodatkowej klasy do pierwszego elementu. Na razie wydaje się najłatwiejszym rozwiązaniem.Mam to w moim projekcie.
źródło
Zgodnie z zaktualizowanym problemem
Co powiesz na
Spowoduje to wybranie klasy domu , następnie rozpiętość elementu i wreszcie wszystkie elementy .red które zostaną umieszczone bezpośrednio za elementami rozpiętości.
Odniesienie: http://www.w3schools.com/cssref/css_selectors.asp
źródło
Możesz użyć n-tego typu (1), ale upewnij się, że witryna nie musi obsługiwać IE7 itp. Jeśli tak jest, użyj jQuery, aby dodać klasę ciała, a następnie znajdź element za pośrednictwem klasy treści IE7, a następnie nazwę elementu, a następnie dodaj w stylu n-tego dziecka.
źródło
Możesz zmienić kod na taki, aby działał
To spełni twoje zadanie
Oto odniesienie CSS od SnoopCode na ten temat.
źródło
Używam poniżej CSS, aby mieć obraz tła dla listy ul li
źródło
Spróbuj tego :
źródło
Z jakiegoś powodu żadna z powyższych odpowiedzi nie dotyczyła przypadku prawdziwego pierwszego i jedynego pierwszego dziecka rodzica.
Wszystkie powyższe odpowiedzi zakończą się niepowodzeniem, jeśli chcesz zastosować styl tylko do elementu podrzędnego pierwszej klasy w tym kodzie.
źródło
:first-child
pseudoklasy jest mylące, ponieważ dodawanie go.class_name
przed zmianą nie zmienia sposobu jego działania, a jedynie powoduje, że działa on jak filtr. Jeśli masz div,<div class="class_name">First content that need to be styled</div>
to selektor nie pasuje, ponieważ nie jest to pierwsze dziecko.Wypróbuj to proste i skuteczne
źródło
Uważam, że przy użyciu względnego selektora
+
do wybierania elementów umieszczonych bezpośrednio po nim działa tutaj najlepiej (jak mało sugerowało wcześniej).W tym przypadku można również użyć tego selektora
ale jest to selektor elementów, a nie klasa.
Tutaj masz ładną listę selektorów CSS: https://kolosek.com/css-selectors/
źródło
Wypróbuj to rozwiązanie:
Link CodePen
źródło