10.8. Pseudoklasa :target
Wprowadzenie: Stylizowanie celu linku wewnętrznego
Linki wewnętrzne na stronie często prowadzą do konkretnych sekcji lub elementów, używając identyfikatora fragmentu (znaku #
i ID elementu) w adresie URL, np. index.html#sekcja2
.
Pseudoklasa :target
pozwala wybrać i ostylować element, którego ID **odpowiada aktualnemu identyfikatorowi fragmentu w adresie URL** strony.
Gdy użytkownik kliknie link prowadzący do #jakis-id
, element z id="jakis-id"
staje się celem (target) i pasuje do selektora :target
.
Jak działa :target
?
Kiedy adres URL strony zawiera identyfikator fragmentu (np. www.example.com/page.html#info
), przeglądarka:
- Przewija stronę tak, aby element z pasującym ID (
id="info"
) znalazł się u góry okna (lub jak najbliżej). - Nadaje temu elementowi stan
:target
.
Jeśli adres URL nie zawiera identyfikatora fragmentu lub żaden element na stronie nie ma ID pasującego do fragmentu, żaden element nie będzie pasował do :target
.
<nav>
<a href="#section1">Do Sekcji 1</a> |
<a href="#section2">Do Sekcji 2</a> |
<a href="#">Usuń target</a> <!-- Link do # usuwa stan :target -->
</nav>
<div style="height: 500px; border: 1px dashed lightgray; margin-top: 20px; padding: 10px;">
Przewiń w dół...
</div>
<section id="section1" class="target-section">
<h2>Sekcja 1</h2>
<p>To jest treść sekcji 1.</p>
</section>
<section id="section2" class="target-section">
<h2>Sekcja 2</h2>
<p>To jest treść sekcji 2.</p>
</section>
.target-section {
padding: 20px;
margin-bottom: 20px;
border: 2px solid #ccc;
background-color: #f9f9f9;
transition: background-color 0.5s ease; /* Płynne przejście dla tła */
}
/* Styl dla sekcji, która jest aktualnym celem (:target) */
.target-section:target {
background-color: lightyellow;
border-color: orange;
}
/* Można też stylizować konkretny element, gdy jest celem */
#section1:target h2 {
color: darkorange;
}
Wypróbuj: Kliknij linki "Do Sekcji 1" i "Do Sekcji 2". Zauważ, jak zmienia się adres URL (dodawany jest #section1
lub #section2
) i jak odpowiednia sekcja zmienia tło i kolor ramki. Kliknięcie "Usuń target" (lub linku bez #
) przywróci domyślny styl.
Praktyczne zastosowania :target
- Podświetlanie aktywnej sekcji: Jak w przykładzie powyżej, można wizualnie wyróżnić sekcję, do której użytkownik właśnie przeszedł.
- Tworzenie prostych zakładek/akordeonów bez JavaScript: Można pokazywać/ukrywać treść w zależności od tego, który link został kliknięty.
- Wyświetlanie modalnych okienek (lightboxów): Kliknięcie linku może ustawić
:target
na ukrytym elemencie (np.div
z oknem modalnym), a reguła CSS dla:target
może zmienić jegodisplay
nablock
lubflex
, aby go pokazać.
Przykład: Prosty akordeon z :target
<div class="accordion">
<div class="accordion-item">
<a href="#item1" class="accordion-title">Pytanie 1</a>
<div id="item1" class="accordion-content">
<p>Odpowiedź na pytanie 1...</p>
<a href="#">Zamknij</a>
</div>
</div>
<div class="accordion-item">
<a href="#item2" class="accordion-title">Pytanie 2</a>
<div id="item2" class="accordion-content">
<p>Odpowiedź na pytanie 2...</p>
<a href="#">Zamknij</a>
</div>
</div>
</div>
.accordion-content {
display: none; /* Domyślnie ukryj treść */
padding: 10px;
border: 1px solid #ccc;
margin-top: -1px; /* Aby ramki się ładnie łączyły */
}
.accordion-title {
display: block;
padding: 10px;
background-color: #eee;
border: 1px solid #ccc;
text-decoration: none;
color: black;
}
.accordion-title:hover {
background-color: #ddd;
}
/* Pokaż treść, gdy jej ID jest celem (:target) */
.accordion-content:target {
display: block;
}
W tym przykładzie, kliknięcie tytułu (linku) rozwija odpowiednią treść, ponieważ nadaje jej stan :target
, co zmienia jej display
z none
na block
. Kliknięcie "Zamknij" (link do #
) usuwa stan :target
i zwija treść.
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Stwórz dwie sekcje div
z unikalnymi ID (np. box1
, box2
) oraz dwa linki prowadzące do tych ID. Użyj :target
, aby nadać żółte tło sekcji, która jest aktualnie celem linku.
Rozwiązanie:
HTML:
<a href="#box1">Do Box 1</a> | <a href="#box2">Do Box 2</a>
<div id="box1" class="target-box">Box 1</div>
<div id="box2" class="target-box">Box 2</div>
CSS:
.target-box {
padding: 20px;
margin: 10px;
border: 1px solid gray;
}
.target-box:target { /* Styl dla aktywnego celu */
background-color: yellow;
}
Efekt: Kliknięcie linku "Do Box 1" nada żółte tło pierwszemu divowi, a kliknięcie "Do Box 2" - drugiemu.
Zadanie 2 (do samodzielnego wykonania)
Rozwiń przykład akordeonu z tej lekcji. Dodaj styl, który zmieni wygląd (np. kolor tła lub ikonkę) tytułu (.accordion-title
), gdy odpowiadająca mu treść (.accordion-content
) jest rozwinięta (jest :target
). Może być potrzebny selektor rodzeństwa.
Zadanie 3 (do samodzielnego wykonania)
Stwórz prosty "lightbox" dla obrazka. Umieść obrazek wewnątrz ukrytego diva z ID. Stwórz link miniaturki, który prowadzi do ID tego diva. Użyj :target
, aby pokazać diva (np. ustawiając position: fixed
, tło i display: block
), gdy link zostanie kliknięty.
FAQ - Najczęściej zadawane pytania
Czy :target
działa tylko z linkami <a>
?
Stan :target
jest ustawiany na elemencie na podstawie identyfikatora fragmentu w adresie URL strony, niezależnie od tego, jak użytkownik tam trafił. Najczęściej jest to wynik kliknięcia linku <a href="#id">
, ale może to być również wynik przekierowania, ręcznego wpisania adresu z fragmentem, lub działania JavaScript.
Co się stanie, jeśli na stronie jest wiele elementów z tym samym ID?
Posiadanie wielu elementów z tym samym ID jest niepoprawne w HTML. Przeglądarki zazwyczaj wybiorą tylko pierwszy napotkany element z danym ID jako cel dla :target
i przewijania. Należy zawsze używać unikalnych ID.
Czy mogę użyć :target
do stylizowania samego linku, który został kliknięty?
Nie bezpośrednio. :target
stylizuje element, którego ID pasuje do fragmentu URL. Nie ma wbudowanej pseudoklasy CSS, która oznaczałaby link prowadzący do aktualnego :target
. Taką funkcjonalność trzeba by zaimplementować za pomocą JavaScript.
Jakie są ograniczenia używania :target
do tworzenia interakcji (np. akordeonów)?
Główne ograniczenia to: zmiana adresu URL (dodanie #id
), co wpływa na historię przeglądarki (przycisk Wstecz), oraz fakt, że tylko jeden element może być :target
naraz. W przypadku akordeonu, otwarcie jednego elementu automatycznie zamyka poprzedni (co może być zaletą lub wadą). Bardziej złożone interakcje często wymagają JavaScript.