☰ menu
Pavel Satrapa

Pořadí v CSS selektorech

Existuje skupina pokročilých selektorů umožňujících ovlivňovat prvky v závislosti na jejich pořadí. Je důležité mít na paměti, že pořadí se počítá vždy v rámci sourozenců se stejným rodičem. Kdykoli zabalíte skupinu prvků do jiného (např. <atricle>, <div> nebo <ul>), začíná se uvnitř vždy počítat od jedničky.

first-child, last-child

Začněme zlehka. Těmto selektorům prvek vyhoví, pokud je první (resp. poslední) mezi svými sourozenci. Můžete je samozřejmě kombinovat s názvem prvku, čili :first-child vyhoví kterýkoli první prvek, zatímco p:first-child je ten první prvek, který je zároveň prvkem <p>.

Podívejme se na příklad. Mějme tuto CSS definici:

p:first-child {
    color: green;
}

a tento HTML kód (vynechávám obal, ponechávám jen obsah prvku <body>):

<h1>Stránka</h1>

<p>Nebude zelený, protože není první.
Před ním je h1.</p>

<blockquote>
  <p>Tenhle bude zelený.</p>

  <p>Tenhle už ne, není první mezi sourozenci.</p>
</blockquote>

<ul>
  <li>Nebude zelený, není p.</li>
  <li>A tenhle není ani p, ani první.</li>
</ul>

nth-child, nth-last-child

Nejen první a poslední si zaslouží pozornost. Pomocí nth-child lze ovlivnit prvek na libovolné pozici, stačí ji zapsat číslem do závorek za název selektrou. nth-last-child funguje stejně, ale počítá od konce. Čili předchozí dva selektory jsou vlastně zbytečné, protože first-child je totéž co nth-child(1), zatímco last-child je ekvivalentem nth-last-child(1).

Pokud byste chtěli z nějakého důvodu mít třetí položku v seznamech šedou, zařídilo by to pravidlo

li:nth-child(3) {
    color: gray;
}

A pokud by se to mělo týkat jen seznamů s odrážkami:

ul > li:nth-child(3) {
    color: gray;
}

Tím ovšem selektor nth-child zdaleka nevystřílel prach. Místo čísla můžete totiž uvést klíčové slovo odd nebo even a ovlivnit všechny liché nebo sudé prvky. Jednou z oblíbených aplikací je rozlišení řádků v tabulkách. Pokud vám čáry mezi buňkami tabulky připadají příliš hrubé, můžete každému druhému řádky tabulky nastavit lehce odlišné pozadí. Řekněme, že stránka má bílé pozadí a sudým řádkům přiřadíme světle šedé (takhle to vypadá):

tr:nth-child(even) {
    background-color: #eee;
}

Jízda ovšem pokračuje, protože sudé/liché řádky se dají zobecnit. Číslo řádku lze zapsat v podobě obecného vzorce Xn+Y, kde X a Y budou přirozená čísla. Například nth-child(3n+1) bude platit pro první, čtvrtý, sedmý, desátý... prvek, zkrátka každý, jehož pořadové číslo se dá vyjádřit jako násobek trojky plus 1.

Je zřejmé, že klíčová slova pro sudé/liché řádky jsou opět nadbytečná (ale praktická a výmluvná). Místo odd lze psát nth-child(2n+1) a even má stejný význam jako nth-child(2n).

Vzorce v pořadových číslech vám umožňují trochu si zařádit. Zajímavou variantou je, pokud je Y větší než X. Znamená to, že s opakováním se začne až od určité hodnoty. Například

tr:nth-child(2n+10) {
    background-color: #eee;
}

přiřadí světle šedé pozadí sudým řádkům tabulky, ale až od desátého dál.

Vše uvedené platí i pro nth-last-child, jen v opačném směru.

nth-of-type, nth-last-of-type

Varianta předchozích selektorů, ovšem do pořadí se započítávají jen prvky uvedeného typu. Selektoru h2:nth-child(2) vyhoví takový prvek <h2>, který je zároveň druhý v pořadí potomků svého rodiče. Naproti tomu h2:nth-of-type(2) vyhoví druhý mazi prvky <h2> stejného rodiče.

Řekněme, že prvke <body> má následující obsah:

<h1>Instalace</h1>

<h2>Požadavky</h2>

<p>Program ke své činnosti potřebuje...</p>

<h2>Postup instalace</h2>

<p>Instalaci zahajte...</p>

Pravidlo

h2:nth-child(2) {
    color: red;
}

obarví červeně nadpis „Požadavky“, který je druhým prvkem na stránce a zároveň se jedná o prvek <h2>. Pravidlo

h2:nth-of-type(2) {
    color: red;
}

obarví červeně nadpis „Postup instalace“, který je druhý mezi prvky typu <h2>. Pokud by za úvodním nadpisem následoval odstavec textu a teprve po něm nadpis „Požadavky“, neobarvilo by první pravidlo nic, protože druhý prvek v pořadí je typu <p>. Na činnosti druhého pravidla by se nic nezměnilo, druhým prvkem typu <h2> nadále zůstává „Postup instalace“.

nth-last-of-type opět dělá totéž, ovšem pozpátku směrem od konce dokumentu.