Kurs HTML

10.1. Selektory potomków (spacja) i dzieci (>)

Strona główna > Kurs CSS > Rozdział 10: Zaawansowane Selektory CSS > Selektory potomków (spacja) i dzieci (>)

Wprowadzenie: Wybieranie elementów na podstawie relacji

Podstawowe selektory (typu, klasy, ID) pozwalają wybierać pojedyncze elementy. Jednak często chcemy stylizować elementy w zależności od tego, gdzie znajdują się w strukturze dokumentu HTML (drzewie DOM) względem innych elementów.

Selektory potomków i dzieci pozwalają wybierać elementy, które są zagnieżdżone wewnątrz innych elementów.

Selektor potomka (spacja)

Selektor potomka, zapisywany jako **spacja** między dwoma selektorami (np. div p), wybiera wszystkie elementy pasujące do drugiego selektora (p), które są **potomkami** (na dowolnym poziomie zagnieżdżenia) elementu pasującego do pierwszego selektora (div).

Potomek to element znajdujący się wewnątrz innego elementu, niezależnie od tego, ile poziomów zagnieżdżenia ich dzieli.

<div class="container">
  <p>Paragraf 1 (bezpośrednie dziecko diva)</p>
  <section>
    <p>Paragraf 2 (wnuk diva)</p>
  </section>
  <p>Paragraf 3 (bezpośrednie dziecko diva)</p>
</div>
<p>Paragraf 4 (poza divem)</p>
/* Wybierz wszystkie paragrafy (p), które są potomkami diva */
div p {
  color: blue;
}

/* Wybierz wszystkie paragrafy (p), które są potomkami elementu */
/* z klasą .container */
.container p {
    font-weight: bold;
}

W powyższym przykładzie:

  • Reguła div p nada niebieski kolor Paragrafom 1, 2 i 3, ponieważ wszystkie znajdują się wewnątrz elementu div. Paragraf 4 nie zostanie wybrany.
  • Reguła .container p pogrubi tekst Paragrafów 1, 2 i 3.

Można łączyć więcej selektorów potomków, np. body .main-content article p wybierze paragrafy będące potomkami elementu article, który jest potomkiem elementu z klasą .main-content, który jest potomkiem body.

Selektor dziecka (>)

Selektor dziecka, zapisywany jako znak większości (>) między dwoma selektorami (np. div > p), wybiera wszystkie elementy pasujące do drugiego selektora (p), które są **bezpośrednimi dziećmi** elementu pasującego do pierwszego selektora (div).

Bezpośrednie dziecko to element zagnieżdżony dokładnie jeden poziom niżej w drzewie DOM.

<!-- Użyjemy tego samego HTML co poprzednio -->
<div class="container">
  <p>Paragraf 1 (bezpośrednie dziecko diva)</p>
  <section>
    <p>Paragraf 2 (wnuk diva)</p>
  </section>
  <p>Paragraf 3 (bezpośrednie dziecko diva)</p>
</div>
<p>Paragraf 4 (poza divem)</p>
/* Wybierz wszystkie paragrafy (p), które są BEZPOŚREDNIMI DZIEĆMI diva */
div > p {
  text-decoration: underline;
}

/* Wybierz wszystkie paragrafy (p), które są BEZPOŚREDNIMI DZIEĆMI */
/* elementu z klasą .container */
.container > p {
    background-color: lightyellow;
}

W powyższym przykładzie:

  • Reguła div > p podkreśli tylko Paragrafy 1 i 3, ponieważ tylko one są bezpośrednimi dziećmi elementu div. Paragraf 2 (wnuk) i Paragraf 4 (poza divem) nie zostaną wybrane.
  • Reguła .container > p nada żółte tło Paragrafom 1 i 3.

Selektor dziecka jest bardziej precyzyjny niż selektor potomka i jest przydatny, gdy chcemy stylizować tylko elementy na pierwszym poziomie zagnieżdżenia, unikając wpływu na głębiej zagnieżdżone elementy tego samego typu.

Łączenie selektorów

Selektory potomków i dzieci można dowolnie łączyć z innymi selektorami (klasami, ID, atrybutami, pseudoklasami itp.) oraz ze sobą nawzajem, aby tworzyć bardzo precyzyjne ścieżki wyboru elementów.

/* Wybierz linki (a) będące dziećmi elementów listy (li), */
/* które są potomkami elementu nawigacji (nav) z ID #main-menu */
nav#main-menu li > a {
  color: navy;
  text-decoration: none;
}

/* Wybierz elementy span z klasą .highlight, które są potomkami */
/* paragrafu (p) będącego dzieckiem diva z klasą .article-content */
div.article-content > p span.highlight {
  background-color: yellow;
}

Zadania praktyczne

Zadanie 1 (z rozwiązaniem)

Stwórz strukturę HTML z listą nienumerowaną (ul) wewnątrz elementu nav. Wewnątrz listy umieść elementy li, a w nich linki a. Użyj selektora potomka, aby nadać wszystkim linkom wewnątrz nav zielony kolor.

Rozwiązanie:

HTML:

<nav class="main-nav">
  <ul>
    <li><a href="#">Strona główna</a></li>
    <li><a href="#">O nas</a>
      <ul> <!-- Zagnieżdżona lista -->
        <li><a href="#">Zespół</a></li>
      </ul>
    </li>
    <li><a href="#">Kontakt</a></li>
  </ul>
</nav>

CSS:

nav a { /* Wybiera WSZYSTKIE linki będące potomkami nav */
  color: green;
}

Efekt: Wszystkie linki (Strona główna, O nas, Zespół, Kontakt) będą miały zielony kolor.

Zadanie 2 (do samodzielnego wykonania)

Zmodyfikuj Zadanie 1. Użyj selektora dziecka (>), aby nadać czerwony kolor tylko linkom, które są **bezpośrednimi dziećmi** elementów li, które z kolei są **bezpośrednimi dziećmi** głównej listy ul wewnątrz nav. Link "Zespół" nie powinien zmienić koloru.

Zadanie 3 (do samodzielnego wykonania)

Stwórz strukturę z elementem article, wewnątrz którego znajdują się paragrafy p. W niektórych paragrafach umieść elementy strong. Użyj selektora potomka, aby pogrubiony tekst (strong) wewnątrz paragrafów w artykule miał dodatkowo podkreślenie.

FAQ - Najczęściej zadawane pytania

Jaka jest różnica w wydajności między selektorem potomka a dziecka?

Historycznie, selektor dziecka (>) był uważany za nieco bardziej wydajny, ponieważ przeglądarka musi sprawdzić tylko bezpośrednie dzieci, a nie przeszukiwać całego poddrzewa. Jednak w nowoczesnych przeglądarkach różnice te są zazwyczaj pomijalne dla większości zastosowań. Ważniejsze jest użycie selektora, który precyzyjnie oddaje zamierzony cel.

Czy spacja zawsze oznacza selektor potomka?

Tak, w kontekście selektorów CSS, spacja między dwoma prostymi selektorami (lub ich kombinacjami) zawsze oznacza relację potomka.

Czy mogę użyć * (selektora uniwersalnego) z tymi selektorami?

Tak. Na przykład div > * wybierze wszystkie bezpośrednie dzieci elementu div, niezależnie od ich typu. .container * wybierze wszystkie elementy (na dowolnym poziomie zagnieżdżenia) wewnątrz elementu z klasą .container.

Kiedy używać selektora potomka, a kiedy dziecka?

Użyj selektora potomka (spacja), gdy chcesz zastosować styl do wszystkich wystąpień danego elementu wewnątrz innego, niezależnie od głębokości zagnieżdżenia (np. wszystkie linki w nawigacji). Użyj selektora dziecka (>), gdy chcesz ograniczyć styl tylko do elementów na pierwszym poziomie zagnieżdżenia, aby uniknąć niezamierzonego wpływu na głębsze struktury (np. tylko elementy li pierwszego poziomu menu).