Selektory

V pravidlech tabulek kaskádových stylů (stylesheets) popisují prvky, třídy, identifikátory objektů a jejich vzájemné kombinace, na něž se definovaný styl má aplikovat.


Základní selektory

Nejjednoduššími selektory jsou selektory typu a univerzální selektor.

Selektor typu: X {…}

X je libovolná HTML značka. Tento selektor se páruje s každou instancí daného prvku na stránce.

H1 { color: red }
znamená, že uvedený styl se bude aplikovat na všechny prvky typu <H1> na stránce; všechny titulky úrovně 1 budou červené.

Univerzální selektor: * {…}

Značí se symbolem * a páruje se všemi prvky. To znamená, že styl uvedený se selektorem * se bude aplikovat na všechny prvky, u nichž je to možné.

* { line-height: 140%;}
znamená, že všechny texty na stránce budou mít výšku řádky (proklad) 140 % základní výšky – nezáleží na tom, zda budou uvnitř značky<P>, <DIV>, uvnitř tabulky <TABLE> či budou mít definovánu nějakou třídu nebo identifikátor.
Styl každého selektoru může být následně předefinován užitím kaskádování (viz dále).

Selektory s atributy

U každého selektoru je možné specifikovat i atributy, jež jsou uvedeny u dané HTML značky. Styl se pak aplikuje pouze na ty instance daného prvku, které mají uvedeny atributy tak, jak je určeno v selektoru.

Selektor s kontrolou existence atributu: X[atr] {…}

Tento selektor páruje pouze s těmi prvky X na stránce, které mají uveden atribut atr, bez ohledu na to, jakou má hodnotu.

H1[title] {…}
se bude aplikovat pouze na ty prvky <H1>, které mají definován atribut title <br>
– na prvek <H1>Titulek</H1> se styl aplikovat nebude, ale na prvek <H1 title=“xxx“>Titulek</H1> ano.

Selektor s atributem dané hodnoty: X[atr=hodn] {…}

Páruje pouze s prvky, jejichž atribut atr je přesně roven hodnotě hodn.

TABLE[width=“100″] {…}
se bude aplikovat pouze na ty prvky typu <TABLE>, které mají uveden atribut právě width=“100″
– na jiné prvky se styl aplikovat nebude. Atribut musí být roven hodnotě přesně, takže ani tabulky s atributem width=“100%“ se s tímto selektorem nespárují.

Selektor s atributem obsahujícím hodnotu: X[atr~=hodn] {…}

Páruje pouze s prvky, hodnotou jejichž atributu atr je mezerami oddělený seznam „slov“ a jedno z nich je přesně rovno hodn.

A[rel~=copyleft] {…}
vyhoví takový prvek <A>, jež má v atributu rel uvedeno mezi jinými hodnotu copyleft
– například <A rel=“copyright copyleft copyeditor“ …>.
Atributy u selektorů je možné kombinovat – příklad: pravidlo TABLE[width=100][title] {…} uspěje pouze u těch prvků typu tabulka, které mají uvedeno width=“100″ a mají definován atribut title.

Selektory tříd a ID

Selektor třídy: X.jméno_třídy {…}

Pravidlu vyhoví ty instance prvků, jejichž třída (class) je právě jméno_třídy. Tento typ selektoru byl zaveden pouze pro zjednodušení, neboť přesně odpovídá zápisu X[class=jméno_třídy] {…}. V případě selektoru *.třída není nutné univerzální selektor * uvádět, jako selektor postačí .třída.

H1.nadpis {…}
páruje se všemi prvky <H1>, které mají uveden atribut class=“nadpis“; pravidlu .nadpis {…} – což je totéž jako *.nadpis {…} – pak vyhoví všechny prvky na stránce, které mají class=“nadpis“.

Selektor ID: X#ident {…}

Styl se použije pouze u prvku, jehož ID je ident. Opět, pokud není specifikována konkrétní HTML značka, není nutné uvádět *#ident, ale postačí #ident.

H1#nazev {…}
vyhoví pouze ten titulek <H1>, jehož ID=“nazev“. Pravidlu #nazev {…} pak vyhoví všechny prvky na stránce, které mají definováno ID=“nazev“.
Selektory ID mají vyšší prioritu než selektory s atributem – např. #nazev je z hlediska kaskádování specifičtější než [ID=nazev].

Kombinování selektorů

Selektory je možné vytvářet vzájemným kombinováním jednodušších selektorů a vytvářet tak specifičtější popis v závislosti na vzájemných vztazích prvků a na struktuře dokumentu. Selektory se vzájemně kombinují pomocí spojek , +>, z nichž každá má jiný význam.

Seskupování selektorů: X, Y {…}

Selektory, které mají stejné vlastnosti, lze definovat jednoduchým způsobem společně. Namísto jednoduchého selektoru lze uvést seznam několika selektorů oddělených čárkou; definovaný styl se poté aplikuje jednotlivě na všechny selektory uvedené v seznamu.

chceme-li nastavit pro titulky všech úrovní stejnou (např. červenou) barvu, můžeme je definovat jednotlivě H1 {color:red} H2 {color:red} atd. Pro zjednodušení je ale také můžeme seskupit do jediného selektoru s jednou společnou definici: H1, H2, H3, H4 {color:red}.

Oba zápisy jsou ekvivalentní, jak je ale vidět, seskupení selektorů je snazší a přehlednější.

Při procházení kaskády stylů (viz dále) se tento zápis nepovažuje za jeden selektor, ale rozdělí se na samostatné selektory se shodnou definicí. Na ostatní kombinace selektorů pomocí spojek +> již ale pohlíží jako na jediný selektor.

Selektor následníka: X Y {…}

CSS umožňuje návrhářům, aby odlišili HTML prvky podle toho, na jakém místě, v jakém kontextu dokumentu se vyskytují. Oddělíme-li v definici dva selektory X a Y mezerou (resp. whitespace), znamená to, že pravidlo X Y {…} se bude aplikovat na všechny prvky typu Y, které jsou následníky prvku X (prvek X je předchůdcem prvku Y).

Jednoduše řečeno, pravidlo se páruje s těmi prvky Y, které jsou obsaženy kdekoli uvnitř nějakého prvku X.

chceme-li odlišit způsob zvýraznění <STRONG> v titulku <H1> od zvýraznění v ostatním textu, můžeme použít kontextový selektor – např. H1 STRONG { color:red }.
Všechny prvky <STRONG>, které jsou uvnitř nějakého prvku <H1> budou zobrazeny červeně – např. tento: <H1>Toto je <TRONG>důležitý</STRONG> titulek</H1>.

Selektor potomka: X > Y {…}

Obdobné jako v předchozím případě – pravidlo se ale aplikuje pouze tehdy, je-li Y potomkem (child) X, neboli X je rodič (parent) Y. Rozdíl mezi potomkem a následníkem je v tom, že Y je potomek X (a tedy X je rodič Y), právě když Y je obsaženo přímo uvnitř prvku X. Zatímco Y je následník X i tehdy, je-li Y ještě obsaženo v nějakém prvku Z, který je potomkem X (každý potomek je i následníkem, obráceně již to nemusí platit).

Např. ve struktuře <H1>Toto je <A href=“xxx“><B>důležitý</B> odkaz</A> v titulku</H1> je A potomek H1 a B je potomek A. B již není potomek H1, ale je stále jeho následník.
BODY > P {…}
se bude aplikovat na ty odstavce <P>, které jsou (přímým) potomkem prvku <BODY>; na prvky <P>, které jsou ještě obsaženy v dalším prvku se již vztahovat nebude. Např. v konstrukci <BODY><P>…</P><DIV><P>…</P></DIV></BODY> se toto pravidlo bude aplikovat pouze na první odstavec; druhý odstavec již není potomkem <BODY> (je uzavřen v <DIV>), je pouze jeho následníkem (pravidlo BODY P {…} by se ale již vztahovalo i na něj).
Přístup k formátování prvního potomka v posloupnosti dokumentu umožňuje pseudo-třída :first-child – viz dále.

Selektor sousedního sourozence: X + Y {…}

Pravidlo se aplikuje na prvky Y, pokud X a Y mají stejného rodiče (jsou sourozenci) a Y následuje přímo po X. Tento selektor umožňuje specifikovat styl pro sousedící prvky na stejné úrovni ve stromu dokumentu.

H1 + H2 {margin: -10px;}
se bude aplikovat na titulky <H2>, které následují přímo za titulkem <H1>. Tento selektor poskytuje možnost přesněji specifikovat vztahy mezi sousedícími prvky, které jsou jinak upravovány automaticky během formátování a vykreslování dokumentu (např. margin).

Pseudo-třídy a pseudo-prvky

Na rozdíl od všech ostatních selektorů, které vycházejí z informací uvedených ve zdrojovém dokumentu, přinášejí pseudo-třídy a pseudo-prvky možnost formátovat informace nad rámec zdrojového dokumentu. Pseudo-třídy pro formátování zpřístupňují informace, které nelze zjistit ze struktury dokumentu (s jednou výjimkou), dynamické změny a výsledky interakce dokumentu s uživatelem.

Pseudo-prvky (pseudo-elementy) umožňují specifikovat některé prvky jemněji, než jsou uvedeny ve struktuře dokumentu (např. první znak či první řádek prvku); a dovolují dokonce přidávat text, který ve zdrojovém dokumentu vůbec není.

Pseudo-třída: X:first-child

Toto je ona jediná výjimka – selektor :first-child vychází ze struktury dokumentu. Páruje se s prvním potomkem daného prvku.

zatímco DIV > P {…} se bude aplikovat na všechny <P>, které jsou potomky nějakého prvku <DIV>,
DIV > P:first-child {…} pak pouze na ty <P>, které jsou prvním potomkem nějakého <DIV>.

Pseudo-třídy odkazů: A:link a A:visited

Prohlížeče obvykle odlišují odkazy, které již uživatel navštívil a které dosud nikoli. Tyto pseudo-třídy umožňují jejich implicitní formátování. A:link vyhovují ty odkazy <A>, které uživatel dosud nenavštívil, A:visited pak ty, které již navštívil. S těmito psedo-třídami je možné použít i specifičtější selektory (s atributy, třídy atd.) – např. definujeme pravidla A[href=“http://www.mujserver.cz“]:visited {color:red} a A.mujllink:visited {color:red}; oběma vyhoví např. prvek <A href=“http://www.mujserver.cz“ class=“mujlink“>Můj server</A>.

Definovaný styl se bude aplikovat tehdy, pokud uživatel již s prohlížečem navštívil adresu „http://www.mujserver.cz“ a odkaz bude zobrazen červeně. A není nutné uvádět, :link {color:blue} způsobí, že všechny dosud nenavštívené odkazy budou zobrazeny modře.

Dynamické pseudo-třídy: X:hover, X:active a X:focus

Interaktivní prohlížeče mohou odlišovat zobrazení prvků podle akcí uživatele. Klienty, které nepodporují interaktivní media, tyto pseudo-třídy nemusí podporovat. Pseudo-třída :hover se aplikuje tehdy, ukáže-li uživatel na daný prvek, ale neaktivujej jej (např. nad něj najede kurzorem myši); :active pak tehdy, je-li prvek aktivován (např. v čase mezi stiskem a puštěním tlačítka myši); a :focus tehdy, je-li prvek zvýrazněn (např. formulářové prvky při zadávání textu, prvky akceptující události klávesnice atd.).

Tyto pseudo-třídy se vzájemně nevylučují – prvky mohou současně vyhovovat i více z nich.

A:focus:hover {…}
bude splněno tehdy, bude-li mít prvek focus a současně na něj uživatel „ukáže“.

Je potřeba pamatovat na pořadí pravidel s ohledem na kaskádování. Např. máme-li definici A:link {color:blue} A:visited {color:black} A:hover {color:red} A:active {color:orange}, musí být A:hover uvedeno až za A:link a A:visited, protože pravidla kaskádování by jinak překryla vlastnost color v A:hover.

Obdobně, protože A:active následuje až za A:hover, color:orange se aplikuje jen tehdy, je-li prvek současně aktivován a je na něj „ukázáno“ (hover).

Jazyková pseudo-třída: X:lang()

Tyto selektory lze použít, pokud dokument specifikuje jazyk, který prvky na stránce používají. V případě HTML4 to může být kombinací informací z hlavičky protokolu (HTTP), z informací uvedených v <META> značkách v záhlaví dokumentu a z atributů lang=“…“. Pseudo-třídě :lang(C) vyhovují prvky v jazyce C, kde C je kód jazyka podle specifikace HTML4 a RFC 1766.

HTML:lang[cs] {quotes: ‚„‘ ‚“‘} HTML:lang[en] {quotes: ‚“‘ ‚”‘} HTML:lang[fr] {quotes: ‚« ‚ ‚ »‘}
specifikují, jak se zobrazí úvozovky v citacích podle toho, v jakém jazyce daný prvek bude – „citace“ v případě češtiny, “citace” v případě angličtiny a « citace » v případě francouzštiny.

Pseudo-prvky: X:first-line a X:first-letter

Pseudo-prvek :first-line aplikuje daný styl na první řádek textu daného bloku, podle toho, jak prohlížeč text zformátuje. Pokud se text zalomí jinak (při změně velikosti okna, při změně velikosti textu atd.) a změní se tedy i místo zalomení prvního řádku, bude text nově zformátován a :first-line se bude znovu aplikovat na nově vzniklý první řádek bloku.

Obdobně pseudo-prvek :first-letter se aplikuje na první znak textu. Tomuto pseudo-prvku je možné i definovat i vlastnost float, čímž je možné vytvářet např. zapuštěné iniciály. Klienty by v případě, že text začíná interpunkcí, měly zahrnout do :first-letter i toto interpunční znaménko a vykreslit tak odlišně dva znaky – např. u textu <P>“Text“</P> se jako P:first-letter vykreslí „T, tedy písmeno T i s úvozovkou, která mu předchází.

P:first-line { text-transform: uppercase;}
zobrazí první řádek každého odstavce verzálkami; pravidlo P.perex:first-letter { float:left; font-size: 300%; font-weight: bold } způsobí, že se první znak odstavce, který má class=“perex“, se vykreslí jako zapuštěná iniciála (obtékaný box), trojnásobné velikosti a tučně.
U těchto pseudo-prvků je možné použít pouze některé ze všech dostupných vlastností CSS. Jejich přesný seznam je uveden ve specifikaci CSS.

Pseudo-prvky: X:before a X:after

Tyto pseudo-prvky se používají ke vložení generovaného obsahu před a za daný prvek. Generovanému obsahu se budeme věnovat v samostané kapitole později.

P.poznamka:before { content: „Pozn.: “ } způsobí, že na začátek každého odstavce třídy poznamka se vloží text „Pozn.: „, obdobně
P.poznamka:after { content: “ konec poznámky“;} vloží text na konec odstavce.
H1:before { content: counter(chapno, upper-roman) „. „;} bude daným způsobem číslovat titulky <H1>.