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ść content | Wynik |
|---|---|
"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-quote | Cudzysłowy dla języka elementu |
none albo normal | Brak 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. Dodajcontent: "". - Nadawanie rozmiaru liniowemu pseudoelementowi.
widthiheightnic nie robią, dopóki nie ustawiszdisplay: block,inline-blockalboposition: absolute. - Zła kolejność ze stanem.
a:hover::afterdziała;a::after:hovernie. - 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
contentnie 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.