Znak plus ( +
) dotyczy następnego rodzeństwa.
Czy istnieje odpowiednik dla poprzedniego rodzeństwa?
css
css-selectors
Jourkey
źródło
źródło
Odpowiedzi:
Nie, nie ma selektora „poprzedniego rodzeństwa”.
Powiązana uwaga
~
dotyczy generalnego następcy (co oznacza, że element pojawia się po tym, ale niekoniecznie natychmiast po nim) i jest selektorem CSS3.+
jest dla następnego rodzeństwa i jest CSS2.1.Zobacz Kombinator sąsiedniego rodzeństwa z Selektorów Poziom 3 i 5.7 Selektor sąsiedniego rodzeństwa z Kaskadowych Arkuszy Stylów Poziom 2 Wersja 1 (CSS 2.1) Specyfikacja .
źródło
Znalazłem sposób na stylizację wszystkich poprzednich rodzeństw (przeciwnie do
~
), które mogą działać w zależności od potrzeb.Załóżmy, że masz listę linków, a po najechaniu na nią wszystkie poprzednie powinny zmienić kolor na czerwony. Możesz to zrobić w następujący sposób:
źródło
float:right
). Wymagało to zawinięcia białych znaków między jednostkami / słowami i wypełnienia zamiast marginesów, ale działa idealnie inaczej!Poziom selektorów 4 wprowadza
:has()
(wcześniej wskaźnik przedmiotu!
), który pozwoli ci wybrać poprzednie rodzeństwo za pomocą:… Ale w chwili pisania tego tekstu jest pewien dystans do najnowocześniejszej obsługi przeglądarki.
źródło
:has()
pseudoklasy.Rozważ
order
właściwość układów flex i grid.Skoncentruję się na Flexbox w poniższych przykładach, ale te same koncepcje dotyczą Grid.
Dzięki Flexbox można symulować poprzedni selektor rodzeństwa.
W szczególności
order
właściwość flex może przenosić elementy po ekranie.Oto przykład:
KROKI
Zrób
ul
elastyczny pojemnik.Odwróć kolejność rodzeństwa w narzutu.
Użyj selektora rodzeństwa, aby wybrać element A (
~
lub+
zrobi to).Użyj
order
właściwości flex, aby przywrócić kolejność rodzeństwa na ekranie wizualnym.... i voilà! Urodził się poprzedni selektor rodzeństwa (lub przynajmniej symulował).
Oto pełny kod:
Ze specyfikacji Flexbox:
Wartość początkowa
order
dla wszystkich elementów elastycznych wynosi 0.Zobacz także
order
specyfikację układu siatki CSS .Przykłady „poprzednich selektorów rodzeństwa” utworzonych za pomocą
order
właściwości flex .jsFiddle
Dodatkowa uwaga - dwie przestarzałe wierzenia na temat CSS
Flexbox burzy dawne przekonania na temat CSS.
Jednym z takich przekonań jest to, że poprzedni selektor rodzeństwa nie jest możliwy w CSS .
Powiedzenie, że ta wiara jest powszechna, byłoby niedopowiedzeniem. Oto próbka powiązanych pytań dotyczących samego przepełnienia stosu:
Jak opisano powyżej, przekonanie to nie jest do końca prawdziwe. Poprzedni selektor rodzeństwa można symulować w CSS za pomocą
order
właściwości flex .z-index
MitInnym wieloletnim przekonaniem jest to, że
z-index
działa tylko na pozycjonowanych elementach.W rzeczywistości najnowsza wersja specyfikacji - wersja robocza edytora W3C - nadal potwierdza to:
W rzeczywistości jednak informacje te są przestarzałe i niedokładne.
Elementy będące elementami elastycznymi lub elementami siatki mogą tworzyć konteksty stosu, nawet jeśli
position
sąstatic
.Oto demonstracja
z-index
pracy nad nie pozycjonowanymi elementami flex: https://jsfiddle.net/m0wddwxs/źródło
order
Nieruchomość nie jest rozwiązaniem, ponieważ jest on przeznaczony wyłącznie do zmiany wizualne porządku, więc to nie nie przywrócić oryginalną semantyczną rozkaz, że jesteś zmuszony do zmian w HTML dla tego obejścia do pracy.z-index
zadziała, nawet gdy „omg, nie maposition
określonego!”, Specyfikacja wspomina o kontekście kontekstu stosu , co jest ładnie wyjaśnione w tym artykule na temat MDNfloat: right
(lub jakimkolwiek innym sposobem odwrócenia kolejności, z którychflex/order
ma niewiele (najmniej?) Skutków ubocznych). Wymieszałem dwa skrzypce: demonstrującfloat: right
podejście i demonstrującdirection: rtl
Miałem to samo pytanie, ale potem miałem moment „duh”. Zamiast pisać
pisać
Oczywiście pasuje to do „x” zamiast „y”, ale odpowiada „czy istnieje dopasowanie?” pytanie, a proste przejście do DOM może sprawić, że trafisz do właściwego elementu bardziej efektywnie niż zapętlenie w javascript.
Zdaję sobie sprawę, że pierwotne pytanie było pytaniem CSS, więc ta odpowiedź jest prawdopodobnie zupełnie nieistotna, ale inni użytkownicy Javascript mogą natknąć się na to pytanie, tak jak ja.
źródło
y ~ x
rozwiązać mój problemy ~ x
nie odpowiada na pytanie „czy istnieje dopasowanie?” pytanie, ponieważ dwa podane tutaj selektory oznaczają zupełnie inne rzeczy. Na przykłady ~ x
w poddrzewie nie ma możliwości wyprodukowania dopasowania<root><x/><y/></root>
. Jeśli pytanie brzmi „czy istniejesz?” wtedy selektor jest po prostuy
. Jeśli pytanie brzmi „czy istniejesz, biorąc pod uwagę rodzeństwo x w dowolnej pozycji?” wtedy potrzebujesz obu selektorów. (Chociaż może po prostu wkurzam się w tym momencie ...)Dwie sztuczki . Zasadniczo odwracanie kolejności HTML żądanych elementów w HTML i używanie operatora
~
Next rodzeństwa :float-right
+ odwrotna kolejność elementów HTMLNadrzędny z
direction: rtl;
+ odwrotną kolejnością elementów wewnętrznychźródło
Możesz użyć dwóch selektorów osi :
!
i?
Istnieją dwa kolejne selektory rodzeństwa w konwencjonalnym CSS:
+
jest natychmiastowym selektorem rodzeństwa~
jest dowolnym kolejnym selektorem rodzeństwaW konwencjonalnym CSS nie ma wcześniejszego selektora rodzeństwa .
Jednak w bibliotece postprocesora ax CSS znajdują się 2 poprzednie selektory rodzeństwa :
?
jest bezpośrednim poprzednim selektorem rodzeństwa (przeciwnie do+
)!
to jakikolwiek poprzedni selektor rodzeństwa (przeciwny do~
)Przykład roboczy:
W poniższym przykładzie:
.any-subsequent:hover ~ div
wybiera kolejnediv
.immediate-subsequent:hover + div
wybiera natychmiastowe kolejnediv
.any-previous:hover ! div
wybiera dowolne poprzedniediv
.immediate-previous:hover ? div
wybiera bezpośredni poprzednidiv
źródło
Kolejne rozwiązanie typu flexbox
Możesz użyć odwrotnej kolejności elementów w HTML. Następnie oprócz używania
order
jak w odpowiedzi Michael_B możesz użyćflex-direction: row-reverse;
lub wflex-direction: column-reverse;
zależności od układu.Próbka robocza:
źródło
W tej chwili nie ma oficjalnego sposobu, aby to zrobić, ale możesz to zrobić dzięki małej sztuczce! Pamiętaj, że jest eksperymentalny i ma pewne ograniczenia ... (sprawdź ten link, jeśli martwisz się kompatybilnością nawigatora)
Możesz użyć selektora CSS3: wywoływana pseudo klasa
nth-child()
Ograniczenia
źródło
:nth-child(-n+4)
jest to pseudo-klasa, którą należy zastosować do selektora, aby działała poprawnie. Jeśli nie jesteś przekonany, spróbuj poeksperymentować za pomocą widelca mojej skrzypce, a zobaczysz, że to nie wok*
selektora, ale jest to okropnie zła praktyka.li#someListItem
i chciałem, aby węzeł (węzły) znajdował się tuż przed nim (tak interpretuję „poprzednie”) - nie widzę, w jaki sposób podane informacje mogą pomóc mi wyrazić to za pomocą CSS. Po prostu wybierasz pierwsze n rodzeństwa i zakładam, że znam n. W oparciu o tę logikę dowolny selektor może wykonać lewę i wybrać elementy, których potrzebuję (takie jak: not ()).Jeśli znasz dokładną pozycję
:nth-child()
, zadziałałoby oparte na wykluczeniu wszystkie kolejne rodzeństwo.Który wybrałby wszystkie
li
s przed 3. (np. 1. i 2.). Ale moim zdaniem wygląda to brzydko i ma bardzo ciasną obudowę.Możesz także wybrać n-te dziecko od prawej do lewej:
Co robi to samo.
źródło
Nie. Nie jest to możliwe za pośrednictwem CSS. „Kaskada” bierze sobie do serca ;-).
Jeśli jednak możesz dodać JavaScript do swojej strony, odrobina jQuery może doprowadzić cię do ostatecznego celu.
Możesz użyć jQuery's,
find
aby wykonać „spojrzenie do przodu” na docelowym elemencie / klasie / id, a następnie cofnąć się, aby wybrać swój cel.Następnie używasz jQuery, aby ponownie napisać DOM (CSS) dla swojego elementu.
W oparciu o tę odpowiedź Mike'a Branta następujący fragment kodu jQuery może pomóc.
To najpierw wybiera wszystkie
<ul>
s, które następują bezpośrednio po<p>
.Następnie „cofa się”, aby wybrać wszystkie poprzednie
<p>
s z tego zestawu<ul>
.W efekcie jQuery zostało wybrane „poprzednie rodzeństwo”.
Teraz użyj
.css
funkcji, aby przekazać nowe wartości CSS dla tego elementu.W moim przypadku szukałem sposobu, aby wybrać DIV z identyfikatorem
#full-width
, ale TYLKO, jeśli miał (pośrednio) potomka DIV z klasą.companies
.Miałem kontrolę nad całym HTMLem
.companies
, ale nie mogłem zmienić żadnego HTMLa powyżej.Kaskada idzie tylko w jednym kierunku: w dół.
W ten sposób mogłem wybrać WSZYSTKIE
#full-width
.Lub mogłem wybrać,
.companies
że tylko po#full-width
.Ale mogę nie zaznaczyć tylko
#full-width
y, który przystąpił.companies
.I znowu nie byłem w stanie dodać
.companies
wyżej w HTML. Ta część HTML została napisana zewnętrznie i otoczyła nasz kod.Ale dzięki jQuery mogę wybrać wymagane
#full-width
s, a następnie przypisać odpowiedni styl:Znajduje to wszystko
#full-width .companies
i wybiera tylko te.companies
, podobne do tego, w jaki sposób selektory są używane do kierowania określonych elementów w standardzie w CSS.Następnie używa
.parents
„cofania się” i wybierania WSZYSTKICH elementów nadrzędnych.companies
,ale filtruje te wyniki, aby zachować tylko
#fill-width
elementy, tak że ostateczniewybiera
#full-width
element tylko, jeśli ma.companies
potomek klasy.Na koniec przypisuje nową
width
wartość CSS ( ) do wynikowego elementu.Dokumenty referencyjne jQuery:
$ () lub jQuery () : element DOM.
. find : pobierz potomki każdego elementu w bieżącym zestawie dopasowanych elementów, przefiltrowane przez selektor, obiekt jQuery lub element.
. rodzice : Uzyskaj bezpośrednio poprzedzające rodzeństwo każdego elementu w zestawie dopasowanych elementów. Jeśli selektor jest dostępny, pobiera poprzednie rodzeństwo tylko wtedy, gdy pasuje do tego selektora (filtruje wyniki, aby uwzględnić tylko wymienione elementy / selektory).
. css : Ustaw jedną lub więcej właściwości CSS dla zestawu dopasowanych elementów.
źródło
previousElementSibling
).previousElementSibling()
dla bardziej zaznajomionych z natywnymi funkcjami DOM JS DOM może zapewnić inną ścieżkę do przodu inną niż CSS.+
selektora (nieistniejącego), o który konkretnie poprosił PO. Rozważ tę odpowiedź jako „hack” JS. Ma na celu zaoszczędzić komuś czas, który spędziłem na znalezieniu rozwiązania.Niestety nie ma „poprzedniego” selektora rodzeństwa, ale prawdopodobnie nadal możesz uzyskać ten sam efekt, używając pozycjonowania (np. Przesuń w prawo). To zależy od tego, co próbujesz zrobić.
W moim przypadku chciałem przede wszystkim 5-gwiazdkowego systemu oceny CSS. Musiałbym pokolorować (lub zamienić ikonę) poprzednich gwiazd. Po przesunięciu każdego elementu w prawo uzyskuję zasadniczo ten sam efekt (dlatego html dla gwiazd musi być napisany „wstecz”).
Używam FontAwesome w tym przykładzie i przełączam się między Unicode fa-star-o i fa-star http://fortawesome.github.io/Font-Awesome/
CSS:
HTML: (40)
JSFiddle: http://jsfiddle.net/andrewleyva/88j0105g/
źródło
+
lub~
selektory wydają mi się najczystsze.W zależności od dokładnego celu istnieje sposób, aby osiągnąć użyteczność selektora rodzica bez użycia jednego (nawet gdyby taki istniał) ...
Powiedzmy, że mamy:
Co możemy zrobić, aby blok Skarpetki (w tym kolory skarpet) wyróżniał się wizualnie za pomocą odstępów?
Co byłoby fajne, ale nie istnieje:
Co istnieje:
Powoduje to ustawienie wszystkich linków zakotwiczonych na marginesie 15 pikseli na górze i resetuje go z powrotem do 0 dla tych bez elementów UL (lub innych znaczników) wewnątrz LI.
źródło
Potrzebowałem rozwiązania, aby wybrać poprzednie rodzeństwo tr. Wymyśliłem to rozwiązanie przy użyciu komponentów React i Styled. To nie jest moje dokładne rozwiązanie (pochodzi z pamięci, kilka godzin później). Wiem, że w funkcji setHighlighterRow występuje usterka.
OnMouseOver wiersz ustawi indeks wiersza na stan i ponownie wyśle poprzedni wiersz z nowym kolorem tła
źródło
Miałem podobny problem i odkryłem, że wszystkie problemy tego rodzaju można rozwiązać w następujący sposób:
i w ten sposób będziesz mógł stylizować swoje obecne, poprzednie elementy (wszystkie elementy zastąpione obecnymi i następnymi) i swoje następne.
przykład:
Mam nadzieję, że to komuś pomoże.
źródło