::before
Tworzy wirtualny element na początku zawartości elementu. Służy do ikon, ozdobników i etykiet bez dodatkowego HTML.
Przykład
#.alert {
display: flex;
align-items: center;
gap: 10px;
}
.alert::before {
content: "!";
flex-shrink: 0;
display: grid;
place-items: center;
width: 24px;
height: 24px;
border-radius: 50%;
background: #f59e0b;
color: #0c0c10;
font-weight: 800;
}<p class="alert stage" style="margin: 0;">Paliwo odnowi się jutro o północy.</p>Definicja i zastosowanie
#Pseudoelement ::before wstawia do elementu nowe, pierwsze dziecko, którego nie ma w HTML. Nie powstaje przed elementem, tylko w jego środku, przed całą resztą treści. Domyślnie jest elementem liniowym (inline), ale możesz nadać mu dowolny display, rozmiar, tło i pozycję.
Warunkiem jego istnienia jest właściwość content. Bez niej pseudoelement w ogóle nie powstanie, dlatego nawet czysto dekoracyjny kształt potrzebuje content: "". W content możesz wstawić tekst, symbol, wartość atrybutu (attr(data-label)) albo licznik.
Zwykle nie zadziała w elementach, które nie mają własnej zawartości, takich jak <img>, <input> czy <br>, bo nie ma w nich miejsca na dodatkowe dziecko. Starszy zapis z jednym dwukropkiem (:before) nadal działa, ale dwa dwukropki odróżniają pseudoelementy od pseudoklas.
Treść z content bywa odczytywana przez czytniki ekranu, ale nie da się jej zaznaczyć ani skopiować. Używaj jej do dekoracji, a ważne informacje zostaw w HTML.
Składnia
#selektor::before { content: …; }Typowe zastosowania
#- Symbol przed tekstem. Spacja w cudzysłowie oddziela go od treści.
- Treść pobrana z atrybutu
data-levelelementu. Zmienisz atrybut w HTML, zmieni się etykieta. - Pusta treść i własne wymiary dają kropkę statusu. Bez
content: ""kropka by nie powstała. - Pozycjonowany pseudoelement rysuje pasek przy lewej krawędzi, niezależnie od długości tekstu.
Typowe zastosowania w praktyce
#content: "★ "
.demo::before { content: "★ "; color: #fbbf24; }content: attr(data-level)
data-level elementu. Zmienisz atrybut w HTML, zmieni się etykieta..demo::before {
content: attr(data-level);
margin-right: 8px;
padding: 2px 6px;
border-radius: 6px;
background: #7c3aed;
font-size: 12px;
font-weight: 700;
}display: inline-block
content: "" kropka by nie powstała..demo::before {
content: "";
display: inline-block;
width: 10px;
height: 10px;
margin-right: 8px;
border-radius: 50%;
background: #10b981;
}position: absolute
.demo { position: relative; padding-left: 14px; }
.demo::before {
content: "";
position: absolute;
inset: 0 auto 0 0;
width: 4px;
border-radius: 4px;
background: #a78bfa;
}Obsługa przeglądarek
#Szeroko dostępne
Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#- Każdy pseudoelement potrzebuje
content. Jeśli coś się nie pokazuje, najpierw sprawdź, czy ta deklaracja jest na miejscu. - Pozycjonując
::beforeabsolutnie, nadaj rodzicowiposition: relative. Inaczej pseudoelement ustawi się względem innego przodka. - Do własnych punktorów list wygodniejszy bywa
::markeralbolist-style-type.::beforezostaw na ozdobniki, których lista nie przewiduje.
Powiązane hasła
#- ::afterTworzy wirtualny element na końcu zawartości elementu. Idealny do strzałek, znaczków, podkreśleń i nakładek.
- contentWstawia treść generowaną w pseudoelementach ::before i ::after.
- ::markerStylizuje znacznik elementu listy: kropkę w liście ul albo numer w liście ol.
- ::first-letterStylizuje pierwszą literę pierwszego wiersza w bloku tekstu. Klasyczny sposób na inicjał na początku artykułu.
- positionWybiera sposób pozycjonowania elementu: w przepływie, względnie, absolutnie, na stałe lub przyklejony.
Widzisz błąd albo brakuje przykładu? Napisz do nas.