To powinno być proste, ale mam problem ze znalezieniem odpowiednich terminów.
Powiedzmy, że mam to:
<div class="a c">Foo</div>
<div class="b c">Bar</div>
W CSS, jak mogę utworzyć selektor, który pasuje do czegoś, co pasuje do „(.a lub .b) i .c”?
Wiem, że mógłbym to zrobić:
.a.c,.b.c {
/* CSS stuff */
}
Ale zakładając, że będę musiał dużo wykonywać tego rodzaju logiki, z różnymi kombinacjami logicznymi, czy istnieje lepsza składnia?
html
css
css-selectors
Josh
źródło
źródło
Odpowiedzi:
Nie.
or
Operator CSS (,
) nie zezwala na grupowanie. Jest to zasadniczo operator logiczny o najniższym priorytecie w selektorach, więc musisz użyć.a.c,.b.c
.źródło
Jeszcze nie, ale istnieje eksperymentalna
:matches()
funkcja pseudoklasy, która właśnie to robi:Więcej informacji na ten temat można znaleźć tutaj i tutaj . Obecnie większość przeglądarek obsługuje jego początkową wersję
:any()
, która działa w ten sam sposób, ale zostanie zastąpiona przez:matches()
. Musimy tylko trochę poczekać, zanim użyjemy tego wszędzie (na pewno będę).źródło
:-moz-any()
i:-webkit-any()
pojawił się na długo przed tym, jak Mozilla zasugerował ją dla Selectors 4 (prowadząc do obecnego wcielenia jako:matches()
).Uncaught DOMException: Failed to execute 'querySelector' on 'Document': ':any(.a .b)' is not a valid selector.
błąd? 🤔Jeśli masz to:
I chcesz tylko wybrać elementy, które mają
.x
i (.a
lub.b
), możesz napisać:ale jest to wygodne tylko wtedy, gdy masz trzy „podklasy” i chcesz wybrać dwie z nich.
Wybór tylko jednej podklasy (na przykład
.a
):.a.x
Wybór dwóch podklas (na przykład
.a
i.b
):.x:not(.c)
Wybór wszystkich trzech podklas:
.x
źródło
a or b or c or d
jest taka sama, jaknot(not(a) and not(b) and not(c) and not(d))
tak „lub” jest w rzeczywistości tylko funkcją wygodną. Teoretycznie we wszystkich przypadkach powinno być możliwe obejście się bez niego . W przypadku OP(.a or .b) and .c
->:not(:not(.a):not(.b)).c
:not(:not([data-status="ACT"]):not([data-status="ISS"]):not([data-status="COR"]))[data-month="08"]
. Kod nie jest jeszcze wystarczająco czysty, aby można go było zobaczyć publicznie, w przeciwnym razie opublikowałbym go. Testowałem na Chrome, Safari i low-endowym telefonie z Androidem.Nie. Standardowy CSS nie zapewnia tego, czego szukasz.
Możesz jednak zajrzeć do LESS i SASS .
Są to dwa projekty, których celem jest rozszerzenie domyślnej składni CSS poprzez wprowadzenie dodatkowych funkcji, w tym zmiennych, zagnieżdżonych reguł i innych ulepszeń.
Pozwalają napisać znacznie bardziej ustrukturyzowany kod CSS i prawie na pewno każdy z nich rozwiąże Twój konkretny przypadek użycia.
Oczywiście żadna z przeglądarek nie obsługuje swojej rozszerzonej składni (zwłaszcza, że oba projekty mają inną składnię i funkcje), ale dostarczają "kompilator", który konwertuje twój kod LESS lub SASS na standardowy CSS, który możesz następnie wdrożyć w swojej witrynie.
źródło