Skupinové selektory :is() a :where()
Tyto dva selektory (formálně se jedná o pseudotřídy) patří k těm novějším. Stručně řečeno obsahují v sobě skupinu selektorů a vybírají prvky vyhovující libovolnému z nich.
:is()
Uvnitř závorek obsahuje skupinu selektorů a vyhoví mu všechny prvky, které vyhoví libovolnému z nich. Například obarvení všech nadpisů modrou barvou by zajistilo pravidlo:
:is(h1, h2, h3, h4, h5, h6) { color: blue; }
Možná vás právě napadlo, že to je zbytečnost, protože stejného výsledku dosáhneme jednodušším pravidlem:
h1, h2, h3, h4, h5, h6 { color: blue; }
V případě jednoduchých selektorů je to samozřejmě pravda. S jejich rostoucí
složitostí ale roste užitečnost tohoto mechanismu. Řekněme, že bych chtěl
nějak upravit prvky <em>
a <i>
v
nadpisech. Tradičním způsobem bych musel vyjmenovat všechny možné kombinace:
h1 em, h1 i, h2 em, h2 i, ...
Pomocí :is()
to půjde o dost snadněji:
:is(h1, h2, h3, h4, h5, h6) :is(em, i) { ... }
Kdykoli budete psát několik selektorů, které mají společnou část a liší se
jen v některých prvcích nebo třídách, zvažte, zda by vám :is()
neušetřilo práci.
Dá se používat samostatně, jak jste právě viděli, nebo připojit k jinému
selektoru. Například sekce, které mají přiřazenu třídu chyba
nebo
varovani
, by vybral selektor:
section:is(.chyba, .varovani) { ... }
Jsou-li selektory uvnitř :is()
nesourodé, dávejte si pozor na
konkrétnost (aneb specifičnost), podle které se posuzuje,
které pravidlo má přednost. Konkrétnost
:is()
se totiž rovná nejkonkrétnějšímu ze selektorů, které jsou v
něm obsaženy. Proto například při deklaraci:
:is(#banner, p) { color: red; } p { color: blue; }
budou všechny odstavce <p>
na stránce červené. Vyhovují
oběma pravidlům, ale v tom prvním jsou v :is()
s identifikátorem,
takže toto pravidlo má sílu identifikátoru a dostane přednost, i když se uvnitř
:is()
pro jejich výběr použil jiný selektor. Tohle dokáže
překvapit, proto doporučuji zařazovat do jednoho :is()
vždy stejně
konkrétní identifikátory.
:where()
Pseudotřída :where()
funguje úplně stejně jako
:is()
. Jediný rozdíl spočívá v posledních odstavcích, protože
konkrétnost :where()
je vždy nulová, bez ohledu na selektory,
které obsahuje. Proto se hodí pro různé CSS knihovny a frameworky, kde umožňuje
jejich uživatelům snadno „přebít“ knihovní pravidla.
Když otočím pořadí pravidel a vyměním :is()
za
:where()
, budou odstavce pro změnu modré:
p { color: blue; } :where(#banner, p) { color: red; }
Opět se na ně vztahují obě pravidla, ale druhé má nulovou specifičnost, takže vyhraje první z nich.
zpět: selektory v CSS