Selektor :not()
Oficiálně představuje :not() pseudotřídu a jistě jste si
domysleli, že znamená negaci. V jeho závorkách je obsažen další selektor a
vyhoví mu prvky, které nevyhovují tomuto selektoru. Například selektoru
p:not(.chyba) vyhoví všechny prvky <p>, které
nemají přiřazenu třídu chyba.
Původně mohl obsahovat jen jeden selektor s dost omezeným sortimentem
konstrukcí, ovšem specifikace
Selectors Level 4 tato
omezení uvolnila. Nyní může obsahovat čárkami oddělovaný seznam selektorů a
vybere takové prvky, na které se nevztahuje žádný z nich. Stejně se chová,
pokud použijete několik :not().
Podívejte se na příklad.
Pokud použijete :not() velmi obecně, snadno se může stát, že
vybere víc prvků, než byste čekali. Například selektor
:not(.třída) vybere všechny prvky, kterým není přiřazena daná
třída. Mohou zahrnovat potomky a/nebo rodiče prvků s uvedenou třídou a výsledek
vás může překvapit. Třeba v tomto příkladu to vypadá,
že pravidlo se selektorem :not(.raz) vůbec nefunguje, protože
odstavec s třídou raz je obarven, jako by ji neměl. Ve skutečnosti
svou barvu zdědí od rodiče, který třídu nemá.
Proto doporučuji používat :not() jako doplněk konkrétního
selektoru, abyste minimalizovali pravděpodobnost vzniku podobných překvapení.
Selektor uvnitř :not() je nezávislý na selektoru před
dvojtečkou. Funguje to tak, že selektor před dvojtečkou vybere prvky, které mu
vyhovují. (Pokud před dvojtečkou žádný selektor není, bere se to jako
* a vybere tedy všechny prvky v dokumentu.) Selektor(y) uvnitř
závorek vybere z dokumentu prvky, které mu nevyhovují. Pravidlo se pak uplatní
na prvky, které jsou v obou těchto výběrech. Proto například:
code:not(h2 code) {
color: #070;
}
obarví zeleně prvky <code>, které nejsou uvnitř nadpisů
<h2>. Selektor před dvojtečkou vybere ze stránky všechny
prvky <code>. :not() vybere všechny prvky na
stránce kromě prvků <code>, které jsou potomky
<h2>. Pouze prvky <code>, které nejsou
uvnitř <h2> jsou v obou těchto skupinách.
V kombinaci s dalšími pokročilými selektory lze dosahovat zajímavých výsledků. Například pravidlo:
ul:not(:has(>li:nth-of-type(4))) {
...
}
bude uplatněno na seznamy s odrážkami <ul>, které mají
nanejvýš 3 položky (neobsahují čtvrté dítě typu <li>).
Ilustruje je další příklad.
A když přidáme navíc požadavek, aby existovala 3. položka, uplatní se pravidlo na seznamy, které mají právě 3 položky (existuje v nich třetí, ale neexistuje čtvrtá):
ul:has(>li:nth-of-type(3)):not(:has(>li:nth-of-type(4))) {
...
}
zpět: selektory v CSS