Menu

Pseudoelementy ::before i ::after w CSS z przykładami

::before i ::after wstawiają generowaną treść jako pierwsze i ostatnie dziecko elementu, prosto z CSS. Poznaj właściwość content, dowiedz się, dlaczego pusty content jest wymagany, jak je pozycjonować, jak robić podpowiedzi z attr(), liczniki i gdzie one nie działają.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Co robią ::before i ::after

::before wstawia pudełko jako pierwsze dziecko elementu, a ::after jako ostatnie dziecko. Zawartość pudełka ustala właściwość content. Do HTML nic nie jest dodawane: przeglądarka generuje to z CSS.

HTML zawiera tylko 9 i Tests pass. Znak dolara, etykieta "/ month" i znaczek zaznaczenia pochodzą z CSS. Dziedziczą style elementu (czcionkę, kolor), chyba że je nadpiszesz, tak jak w przykładach powyżej.

Składnia

selector::before {
  content: "text";   /* required */
  /* any other styles */
}

selector::after {
  content: "";       /* empty string: a box with no text */
}
Wartość contentWynik
"text"Tekst. Użyj "\A" dla złamania linii (z white-space: pre), "\2192" dla znaku Unicode (→)
""Puste pudełko na kształty i dekoracje
attr(data-label)Wartość atrybutu elementu
counter(step)Wartość licznika CSS
open-quote / close-quoteCudzysłowy dla języka elementu
none albo normalBrak pseudoelementu (normal to wartość domyślna)

content jest obowiązkowe. Bez niego ::before i ::after nigdy nie powstają, bez względu na to, ile innych właściwości im nadasz.

Kształty dekoracyjne z content: ""

Z content: "" pseudoelement jest pustym pudełkiem, któremu możesz nadać rozmiar i kolor. Domyślnie jest liniowy, a pudełko liniowe ignoruje width i height, więc nadaj mu display: block, inline-block albo position: absolute:

Pozycjonowanie pseudoelementu

Dla dekoracji, która leży na elemencie albo wokół niego, użyj position: absolute na pseudoelemencie i position: relative na samym elemencie, żeby przesunięcia liczyły się od elementu:

Zwróć uwagę na kolejność przy łączeniu z pseudoklasą: najpierw stan, potem pseudoelement, .link:hover::after, nigdy .link::after:hover.

Odczytywanie atrybutów przez attr(): podpowiedź

attr() wstawia wartość atrybutu do content, więc jedna reguła może pokazać inny tekst na każdym elemencie:

Podpowiedź widoczna tylko po najechaniu kursorem jest niewidoczna dla osób korzystających z klawiatury i ekranu dotykowego. Ważne informacje umieść na stronie albo pokazuj je także przy :focus, dodając do elementu tabindex="0".

Numerowanie licznikami

Liczniki CSS razem z ::before numerują elementy bez wpisywania numerów:

Dodaj albo usuń krok, a numery same się zaktualizują.

Gdzie ::before i ::after nie działają

Pseudoelementy są wstawiane do wnętrza elementu, między jego znaczniki. Elementy, które nie mają na nie wnętrza, nie mogą ich pokazać:

  • <img>, <video>, <iframe> (elementy zastępowane)
  • <input>, <select>, <textarea> (kontrolki formularzy) oraz <br>

Niektóre przeglądarki rysują je na polu wyboru albo uszkodzonym obrazie, ale nie jest to spójne. Dodaj pseudoelement do opakowania: <span class="field"><input></span> i ostyluj .field::after.

Częste błędy

  • Brak content. Najczęstszy powód, dla którego nic się nie pokazuje. Dodaj content: "".
  • Nadawanie rozmiaru liniowemu pseudoelementowi. width i height nic nie robią, dopóki nie ustawisz display: block, inline-block albo position: absolute.
  • Zła kolejność ze stanem. a:hover::after działa; a::after:hover nie.
  • Pozycja absolutna bez pozycjonowanego rodzica. Pseudoelement wyrównuje się wtedy do jakiegoś odległego przodka. Dodaj do elementu position: relative.
  • Prawdziwa treść w CSS. Tekstu z content nie da się zaznaczyć ani skopiować. Informacje trzymaj w HTML.

Najczęściej zadawane pytania

Co robi ::before w CSS?

Tworzy pseudoelement, który jest pierwszym dzieckiem wybranego elementu i zawiera to, co podaje właściwość content. ::after robi to samo jako ostatnie dziecko. Żaden z nich nie istnieje w HTML, więc przydają się do ikon, etykiet i dekoracji.

Dlaczego mój ::before albo ::after się nie wyświetla?

Najczęstszy powód to brak właściwości content: bez niej pseudoelement nie powstaje. Dla pustego pudełka dekoracyjnego użyj content: "". Inne przyczyny: liniowy pseudoelement z szerokością i wysokością (nadaj mu display: block albo inline-block) albo element taki jak <img> czy <input>, który nie może ich zawierać.

Czym różni się :before od ::before?

Działaniem niczym. ::before z dwoma dwukropkami to aktualna składnia oznaczająca pseudoelementy; :before z jednym dwukropkiem to starszy zapis z CSS2, który przeglądarki nadal akceptują dla before, after, first-line i first-letter.

Czy mogę użyć ::before na img albo input?

Nie w sposób niezawodny. Pseudoelementy są wstawiane do wnętrza treści elementu, a elementy zastępowane, takie jak <img>, i kontrolki formularzy, takie jak <input>, nie mają na nie miejsca. Otocz element znacznikiem <span> albo <div> i dodaj pseudoelement do tego opakowania.

Czy czytniki ekranu odczytują treść z CSS ::before?

Zazwyczaj tak: tekst z content zwykle trafia do dostępnej nazwy, ale nie da się go zaznaczyć ani skopiować. Prawdziwe informacje trzymaj w HTML, a pseudoelementów używaj do dekoracji i drobnych wskazówek wizualnych.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ