Pokročilé vztahy mezi prvky
Selektory v CSS umožňují vyjádřit i některé rafinovanější vztahy mezi prvky. Tyto selektory trpěly slabší podporou v klientech, ovšem moderní generace webových prohlížečů je umí. V současnosti není důvod se jich obávat.
Dítě (>)
Trochu se podobá selektoru potomka. Tentokrát ovšem požaduje, aby druhý z uvedených prvků byl dítětem (čili přímým potomkem, bez jakýchkoli prvků v hierarchii mezi nimi) prvního. Zapisuje se pomocí znaku „>“ mezi příslušnými prvky. Například
h1 > em { color: red; }
bude uplatněno na <em>
v nadpisu:
<h1>Příkaz <em>delete</em></h1>
nikoli však na
<h1>Příkaz <a id="delete"><em>delete</em></a></h1>
kde vadí <a>
nacházející se v hierarchii mezi nimi.
Následník (+, ~)
Zapíšete-li v selektoru mezi dvojici prvků „+“, požadujete, aby druhý byl následníkem prvního. To znamená, že oba mají stejného rodiče a ve zdrojovém kódu se nacházejí bezprostředně za sebou. Pravidlo se vztahuje jen na druhý prvek.
Například pravidlu
h2 + p { color: gray; }
vyhoví jen takové <p>
, jež následuje ihned za nadpisem
<h2>
. Například první ze dvou odstavců v tomto kódu bude
šedý:
<h2>Instalace</h2> <p>V této části popíšeme instalaci programu.</p> <p>Program ke své činnosti využívá...</p>
Existuje také volnější verze tohoto selektoru, zapisovaná znakem „vlnka“ (~). Platí pro všechny sourozence prvního prvku, kteří se ve zdrojovém kódu nacházejí za ním. Například toto pravidlo
h2 ~ p { color: blue; }
obarví všechny odstavce následující za <h2>
modře. Mohou
mezi ně být vloženy i jiné prvky (např. <h3>
nebo
<ul>
), ale pokud se kdekoli před ním ve zdrojovém kódu nachází
<h2>
se stejným rodičem, bude odstavec modrý.
Obsahuje (:has())
Většina selektorů, které se zabývají vztahy mezi prvky, se ohlíží směrem zpět k předkům nebo předchůdcům prvku, kterého se týkají. Lze nastavit vlastnosti prvku, který se vyskytuje uvnitř jiného, následuje za jiným a podobně. Velmi dlouho trvalo, než se v CSS objevil selektor, který se dívá na potomky.
Jedná se o selektor :has(potomci)
. Vyhoví mu prvek, pro který
existuje alespoň jeden prvek vyhovující vnořenému selektoru potomci.
Řekněme, že máte na stránce bloky a chcete barevným pozadím odlišit ty z nich,
které v sobě obsahují obrázek:
.blok { background-color: #eee; } .blok:has(img) { background-color: #f2d399; }
Druhému selektoru vyhoví takové prvky s třídou blok
, které v
sobě obsahují prvek <img>
, libovolně hluboko vnořený. Pokud byste
chtěli, aby vyhověly jen ty bloky, kde obrázek je dítětem, tedy přímým potomkem
bloku, bylo by třeba druhý selektor upravit na:
.blok:has(>img) { background-color: #f2d399; }
Selektor uvnitř :has()
se vyhodnocuje v kontextu prvku, který
vyhověl selektoru, k němuž je připojen. V našem příkladu se tedy hledá mezi
potomky jednotlivých prvků, které mají přiřazenu třídu blok
.
Uvnitř :has()
může být několik selektorů, oddělujte je čárkami.
Bude splněn, pokud alespoň pro jeden existuje vyhovující prvek. Stejně se
chová, když k prvku připojíte několik :has()
. Obarvení bloku,
který obsahuje alespoň jeden nadpis <h2>
nebo
<h3>
, by zajistila některá z těchto deklarací:
.blok:has(h2, h3) { background-color: #f2d399; } .blok:has(h2):has(h3) { background-color: #f2d399; }
Selektory uvnitř :has()
jsou mírně omezeny. Nelze v nich
používat další :has()
, ani
pseudoprvky. Většinu selektorových konstrukcí
ale používat můžete. Běžným požadavkem například může být odstranit okraj pod
nadpisem <h2>
, pokud je bezprostředně následován nadpisem
<h3>
:
h2:has(+ h3) { margin-bottom: 0; }
Nebo řekněme, že seznam s odrážkami <ul>
má vypadat
jinak, pokud obsahuje alespoň 5 odrážek (tedy existuje v něm
páté dítě typu <li>
):
ul:has(>li:nth-of-type(5)) { ... }
zpět: selektory v CSS