11.5. Pseudoelement ::marker
Wprowadzenie: Stylizowanie znaczników listy
Listy nienumerowane (<ul>
) i numerowane (<ol>
) domyślnie wyświetlają znaczniki (punktory lub numery) przed każdym elementem listy (<li>
). Przez długi czas stylizowanie tych znaczników było ograniczone (głównie za pomocą list-style-type
, list-style-image
i list-style-position
).
Pseudoelement ::marker
został wprowadzony, aby umożliwić **bezpośrednie stylizowanie** tych znaczników, dając znacznie większą kontrolę nad ich wyglądem.
::marker
wybiera "pudełko" zawierające punktor lub numer elementu listy <li>
(a także elementów z display: list-item
).
Jak działa ::marker
?
Pseudoelement ::marker
jest generowany automatycznie dla każdego elementu <li>
(lub elementu z display: list-item
). Możemy go wybrać i zastosować do niego określone właściwości CSS.
<ul class="styled-markers">
<li>Element pierwszy</li>
<li>Element drugi</li>
<li>Element trzeci</li>
</ul>
<ol class="styled-markers">
<li>Pozycja 1</li>
<li>Pozycja 2</li>
<li>Pozycja 3</li>
</ol>
/* Stylizuj znaczniki (punktory i numery) dla wszystkich li w .styled-markers */
.styled-markers li::marker {
color: red; /* Zmień kolor znacznika */
font-size: 1.2em; /* Powiększ znacznik */
font-weight: bold; /* Pogrub znacznik */
}
/* Można też użyć bardziej specyficznych selektorów */
ul.styled-markers li::marker {
/* Styl tylko dla punktorów w ul */
}
ol.styled-markers li::marker {
/* Styl tylko dla numerów w ol */
}
W powyższym przykładzie, zarówno punktory listy ul
, jak i numery listy ol
będą czerwone, pogrubione i nieco większe niż domyślnie.
Dozwolone właściwości CSS dla ::marker
Zakres właściwości CSS, które można bezpiecznie stosować do ::marker
, jest obecnie **ograniczony**, choć specyfikacja ewoluuje. Najczęściej wspierane i używane właściwości to:
- Czcionka:
font
(i jego składowe jakfont-size
,font-weight
,font-family
). - Kolor:
color
. - Odstępy tekstu:
word-spacing
,letter-spacing
. - Kierunek tekstu:
direction
,unicode-bidi
. content
: Pozwala **zastąpić** domyślny punktor/numer własną treścią (np. symbolem, emoji, tekstem).- Niektóre właściwości animacji i przejść (
transition
,animation
).
Właściwości takie jak background
, padding
, border
, margin
, display
, position
, width
, height
zazwyczaj **nie działają** lub mają nieprzewidywalne efekty na ::marker
. Jeśli potrzebujesz bardziej zaawansowanego stylizowania (np. tła dla punktora), często nadal konieczne jest użycie techniki z ::before
i ukryciem domyślnego markera (list-style: none;
).
Zmiana treści znacznika za pomocą content
Jedną z najciekawszych możliwości ::marker
jest użycie właściwości content
do całkowitej zmiany wyglądu znacznika.
<ul class="custom-markers">
<li>Zadanie 1</li>
<li>Zadanie 2</li>
<li>Zadanie 3</li>
</ul>
<ol class="custom-markers-ol">
<li>Krok pierwszy</li>
<li>Krok drugi</li>
</ol>
/* Zastąp domyślne punktory strzałkami */
.custom-markers li::marker {
content: "→ "; /* Strzałka i spacja */
color: green;
}
/* Zastąp domyślne numery tekstem "Krok X." */
/* Wymaga użycia liczników CSS */
.custom-markers-ol {
list-style: none; /* Ukryj domyślną numerację */
counter-reset: step-counter; /* Zainicjuj licznik */
}
.custom-markers-ol li {
counter-increment: step-counter; /* Zwiększ licznik dla każdego li */
}
.custom-markers-ol li::marker {
content: "Krok " counter(step-counter) ". "; /* Użyj licznika w content */
color: darkblue;
font-weight: bold;
}
W pierwszym przykładzie, punktory listy ul
zostaną zastąpione zielonymi strzałkami.
W drugim przykładzie, używamy liczników CSS (counter-reset
, counter-increment
) i funkcji counter()
wewnątrz content
pseudoelementu ::marker
, aby stworzyć niestandardową numerację "Krok 1.", "Krok 2." itd.
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Stwórz listę nienumerowaną ul
. Użyj ::marker
, aby zmienić kolor i rozmiar domyślnych punktorów.
Rozwiązanie:
HTML:
<ul class="task1-list">
<li>Punkt A</li>
<li>Punkt B</li>
<li>Punkt C</li>
</ul>
CSS:
.task1-list li::marker {
color: purple; /* Fioletowy kolor */
font-size: 1.5em; /* Większy rozmiar */
}
Efekt: Punktory listy będą fioletowe i powiększone.
Zadanie 2 (do samodzielnego wykonania)
Stwórz listę numerowaną ol
. Użyj ::marker
i właściwości content
, aby zastąpić domyślne numery (1, 2, 3) innymi symbolami, np. gwiazdkami (*
).
Zadanie 3 (do samodzielnego wykonania)
Stwórz listę ul
. Użyj ::marker
i właściwości content
, aby dodać emoji (np. ✅) jako punktor dla każdego elementu listy.
FAQ - Najczęściej zadawane pytania
Jakie właściwości CSS na pewno działają z ::marker
?
Najbezpieczniej jest ograniczyć się do właściwości color
, content
oraz właściwości font-*
(jak font-size
, font-weight
). Wsparcie dla innych właściwości, jak background
czy padding
, jest nadal eksperymentalne lub nieistniejące w wielu przeglądarkach.
Czy ::marker
działa na elementach innych niż li
?
Tak, ::marker
działa na każdym elemencie, który ma ustawioną właściwość display: list-item;
. Domyślnie mają ją elementy li
, ale można ją nadać innym elementom, np. div
, aby również generowały znacznik.
Czy mogę użyć obrazka jako markera za pomocą ::marker
?
Chociaż można próbować użyć content: url('image.png');
, kontrola nad rozmiarem i pozycjonowaniem takiego obrazka jest bardzo ograniczona. W praktyce, jeśli chcesz użyć obrazka jako punktora, nadal bardziej niezawodną metodą jest użycie list-style-image
na elemencie li
lub technika z ::before
i background-image
.
Jak wyśrodkować marker względem tekstu?
Bezpośrednia kontrola nad pozycjonowaniem markera za pomocą ::marker
jest ograniczona. Właściwość list-style-position
(inside
/outside
) na elemencie li
nadal odgrywa rolę. Precyzyjne wyrównanie często wymaga bardziej zaawansowanych technik, np. z użyciem Flexboxa lub Grida na samym elemencie li
i jego pseudoelemencie ::before
(po ukryciu domyślnego markera).