Ce face :is() și :where()
:is() și :where() primesc o listă de selectori și se potrivesc cu orice element care corespunde cel puțin unuia dintre ei. În loc să scrii header a, main a, footer a, scrii :is(header, main, footer) a.
Diferența dintre ele este doar specificitatea:
• :is() ia specificitatea celui mai specific selector din paranteză (:is(#meniu, .link) valorează cât un ID, chiar dacă elementul se potrivește doar cu clasa).
• :where() are mereu specificitate 0, așa că regulile scrise cu el se suprascriu foarte ușor. Este ideal pentru stiluri de bază, resetări și biblioteci.
Ambele folosesc o listă de selectori tolerantă (forgiving): dacă unul dintre selectori nu este valid sau nu este înțeles de browser, este ignorat, iar restul listei funcționează în continuare. La o listă obișnuită separată prin virgulă, un singur selector invalid anulează toată regula.
Valori uzuale
| Valoare | Descriere |
|---|---|
:is(A, B, C) |
Se potrivește cu elementele care corespund lui A, B sau C; specificitatea = cea mai mare din listă. |
:where(A, B, C) |
Aceeași potrivire ca :is(), dar cu specificitate 0. |
:is(...) X |
Folosit ca prefix: X aflat în interiorul oricăruia dintre elementele din listă. |
X:is(...) |
Folosit ca filtru: X care este în același timp și unul dintre selectorii din listă. |
Exemple
Exemplul 1: Titlurile din articol, scrise o singură dată
Fără :is() ar trebui să repeți prefixul .articol pentru fiecare nivel de titlu.
/* În loc de .articol h2, .articol h3, .articol h4 */
.articol :is(h2, h3, h4) {
color: #0f172a;
margin-top: 2rem;
line-height: 1.25;
}
.articol :is(h2, h3, h4):hover {
color: #2563eb;
}
Efect vizual în browser
În articolul „Ghid de vizitare a Iașului”, toate titlurile h2, h3 și h4 sunt bleumarin, cu spațiu de 2rem deasupra; la trecerea cu mouse-ul, titlul peste care stă cursorul devine albastru.
Exemplul 2: Stiluri de bază ușor de suprascris cu :where()
Regula cu :where() are specificitate 0, așa că o simplă clasă o înlocuiește fără !important.
/* Stil implicit pentru listele din conținut */
:where(.continut) :where(ul, ol) {
padding-left: 1.5rem;
color: #334155;
}
/* O clasă simplă câștigă, deși e mai „scurtă” */
.lista-fara-stil {
padding-left: 0;
list-style: none;
}
Efect vizual în browser
Listele din .continut au indentare de 1.5rem și text gri. Lista cu produse (Cafea 18 lei, Ceai 12 lei) care are clasa .lista-fara-stil nu are indentare și nici buline, deoarece regula cu :where() nu are specificitate și pierde în fața clasei.
Greșeli frecvente
- Folosirea lui :is() cu un ID în listă fără să-ți dai seama: :is(#antet, .bara) a are specificitatea unui ID pentru toate linkurile, și devine greu de suprascris.
- Așteptarea ca :where() să „câștige” în cascadă; având specificitate 0, orice regulă cu o clasă sau un element o suprascrie.
- Folosirea pseudo-elementelor în listă (:is(::before, ::after)); pseudo-elementele nu sunt acceptate în :is() și :where().
Comenzi înrudite
:not() (negarea selectorilor): Selectează elementele care NU corespund selectorilor din paranteză, de exemplu toate elementele unei liste, mai puțin ultimul.Pseudo-clase (:hover, :focus, :active, :nth-child): Stilizează un element în funcție de starea sa (interacțiune cu mouse-ul, tastatura) sau poziția structurală în listă.Selectori de bază (element, clasă, id): Mecanismul prin care CSS identifică elementele din HTML cărora le aplică stilurile.