10.1. 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 elementudiv
. 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 elementudiv
. 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).