Kurs HTML

11.1. Wprowadzenie do pseudoelementów (różnica vs pseudoklasy, składnia ::)

Strona główna > Kurs CSS > Rozdział 11: Pseudoelementy > Wprowadzenie do pseudoelementów (różnica vs pseudoklasy, składnia ::)

Czym są pseudoelementy?

Pseudoelementy w CSS to specjalne słowa kluczowe, które pozwalają stylizować **określone części** elementu, a nie cały element w danym stanie (jak pseudoklasy).

Można je traktować jak "wirtualne" elementy dodawane przez CSS do drzewa dokumentu, które nie istnieją w kodzie HTML, ale można je stylizować. Pozwalają one na bardziej precyzyjne i kreatywne formatowanie treści.

Przykłady zastosowań:

  • Dodawanie dekoracyjnej treści przed lub po elemencie (np. ikonki, cudzysłowy).
  • Stylizowanie pierwszej litery lub pierwszej linii akapitu.
  • Formatowanie znaczników listy (punktory, numeracja).
  • Zmiana wyglądu zaznaczonego przez użytkownika tekstu.

Różnica między pseudoklasami a pseudoelementami

Choć nazwy są podobne, pseudoklasy i pseudoelementy pełnią różne funkcje:

  • Pseudoklasy (np. :hover, :first-child, :checked): Wybierają **całe elementy**, które znajdują się w określonym **stanie** lub spełniają określone **kryterium strukturalne**. Odpowiadają na pytanie "W jakim stanie jest element?" lub "Który to element?".
  • Pseudoelementy (np. ::before, ::first-letter, ::marker): Wybierają i pozwalają stylizować **określoną część** elementu lub dodają wirtualną treść. Odpowiadają na pytanie "Którą część elementu stylizujemy?".

Kluczowa różnica tkwi w tym, że pseudoklasy wybierają istniejące elementy w specyficznych warunkach, podczas gdy pseudoelementy działają jakby tworzyły nowe, wirtualne elementy lub wybierały fragmenty istniejących.

Składnia: Pojedynczy vs Podwójny Dwukropek (: vs ::)

W starszych wersjach CSS (CSS1 i CSS2), zarówno pseudoklasy, jak i pseudoelementy używały składni z **pojedynczym dwukropkiem** (np. :hover, :before, :first-letter).

Aby wyraźnie odróżnić pseudoklasy od pseudoelementów, specyfikacja CSS3 wprowadziła składnię z **podwójnym dwukropkiem (::)** dla pseudoelementów (np. ::before, ::first-letter).

Zalecana praktyka:

  • Używaj **pojedynczego dwukropka (:)** dla **pseudoklas**.
  • Używaj **podwójnego dwukropka (::)** dla **pseudoelementów**.

Przeglądarki zazwyczaj obsługują również starszą składnię z pojedynczym dwukropkiem dla pseudoelementów (:before, :after, :first-line, :first-letter) ze względu na kompatybilność wsteczną. Jednak dla nowych pseudoelementów wprowadzonych w CSS3 i późniejszych (np. ::marker, ::placeholder) wymagana jest składnia z podwójnym dwukropkiem.

Stosowanie podwójnego dwukropka dla wszystkich pseudoelementów poprawia czytelność kodu i jasno komunikuje intencje.

/* Pseudoklasa - pojedynczy dwukropek */
a:hover {
  color: red;
}

li:first-child {
  font-weight: bold;
}

/* Pseudoelement - zalecany podwójny dwukropek */
p::first-line {
  text-transform: uppercase;
}

li::marker {
  color: blue;
}

/* Pseudoelement - składnia z pojedynczym dwukropkiem (działa, ale mniej zalecana) */
p:first-letter {
  font-size: 2em;
}

div:before {
    content: ">> ";
}

Gdzie umieszczać pseudoelementy w selektorze?

Pseudoelement musi znajdować się **na samym końcu** selektora. Nie można do niego dołączyć kolejnej pseudoklasy ani innego selektora.

/* POPRAWNIE: */
/* Stylizuj ::before dla elementu p z klasą .intro */
p.intro::before {
  content: "Wstęp: ";
}

/* Stylizuj ::first-letter dla elementu p, który jest :first-child */
p:first-child::first-letter {
  color: green;
}

/* BŁĘDNIE: */
/* Nie można dodać pseudoklasy PO pseudoelemencie */
/* p::first-letter:hover { ... } */ /* NIEPOPRAWNE */

/* Nie można dodać selektora PO pseudoelemencie */
/* div::before span { ... } */ /* NIEPOPRAWNE */

FAQ - Najczęściej zadawane pytania

Czy mogę używać wielu pseudoelementów dla jednego elementu?

Nie można zastosować wielu pseudoelementów jednocześnie do tej samej części elementu. Można jednak użyć różnych pseudoelementów dla różnych części tego samego elementu, np. p::first-line { ... } i p::first-letter { ... }. Można również użyć ::before i ::after dla tego samego elementu.

Dlaczego wprowadzono składnię ::?

Głównym powodem było jednoznaczne odróżnienie pseudoklas (opisujących stan elementu) od pseudoelementów (opisujących część elementu lub dodających wirtualną treść). Ułatwia to czytanie i zrozumienie kodu CSS oraz pozwala na spójne wprowadzanie nowych pseudoelementów w przyszłości bez ryzyka kolizji nazw z pseudoklasami.

Czy zawsze muszę używać :: dla pseudoelementów?

Dla pseudoelementów wprowadzonych w CSS3 i nowszych (np. ::marker, ::placeholder, ::selection) składnia :: jest wymagana. Dla starszych (::before, ::after, ::first-line, ::first-letter) przeglądarki zazwyczaj akceptują obie formy (: i ::) dla kompatybilności. Jednak zaleca się konsekwentne używanie :: dla wszystkich pseudoelementów.

Jakie właściwości CSS mogę stosować do pseudoelementów?

Zakres właściwości, które można stosować, zależy od konkretnego pseudoelementu. Na przykład, dla ::before i ::after można używać większości właściwości (w tym content, display, color, background, font, wymiary, pozycjonowanie). Dla ::first-letter można używać głównie właściwości typograficznych i związanych z modelem pudełkowym (margin, padding, border). Dla ::marker zakres jest bardziej ograniczony (głównie content, color, font).