Kurs HTML

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 jak font-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).