Cosa fanno ::before e ::after
::before inserisce un box come primo figlio di un elemento e ::after come ultimo figlio. Cosa contiene il box lo decide la proprietà content. Nell'HTML non viene aggiunto nulla: il browser lo genera dal CSS.
L'HTML contiene solo 9 e Tests pass. Il simbolo del dollaro, l'etichetta "/ month" e il segno di spunta vengono tutti dal CSS. Ereditano gli stili dell'elemento (font, colore) a meno che tu non li sovrascriva, come fanno gli esempi qui sopra.
Sintassi
selector::before {
content: "text"; /* required */
/* any other styles */
}
selector::after {
content: ""; /* empty string: a box with no text */
}
Valore di content | Risultato |
|---|---|
"text" | Una stringa. Usa "\A" per andare a capo (con white-space: pre), "\2192" per un carattere Unicode (→) |
"" | Un box vuoto, per forme e decorazioni |
attr(data-label) | Il valore di un attributo dell'elemento |
counter(step) | Il valore di un contatore CSS |
open-quote / close-quote | Le virgolette della lingua dell'elemento |
none o normal | Nessuno pseudo-elemento (normal è il valore predefinito) |
content è obbligatorio. Senza, ::before e ::after non vengono mai creati, per quante altre proprietà tu gli dia.
Forme decorative con content: ""
Con content: "", lo pseudo-elemento è un box vuoto a cui puoi dare dimensioni e colore. Per impostazione predefinita è inline, e un box inline ignora width e height, quindi dagli display: block, inline-block o position: absolute:
Posizionare uno pseudo-elemento
Per una decorazione che sta sopra o attorno all'elemento, usa position: absolute sullo pseudo-elemento e position: relative sull'elemento stesso, così gli spostamenti si misurano a partire dall'elemento:
Fai attenzione all'ordine quando lo combini con una pseudo-classe: prima viene lo stato, poi lo pseudo-elemento, .link:hover::after, mai .link::after:hover.
Leggere attributi con attr(): un tooltip
attr() porta il valore di un attributo dentro content, così una sola regola può mostrare un testo diverso su ogni elemento:
Un tooltip che compare solo all'hover è invisibile per chi usa la tastiera o il touch. Per qualsiasi cosa importante, metti il testo nella pagina, oppure mostralo anche in :focus con tabindex="0" sull'elemento.
Numerare con i contatori
I contatori CSS e ::before numerano gli elementi senza scrivere i numeri a mano:
Aggiungi o togli un passaggio e i numeri si aggiornano da soli.
Dove ::before e ::after non funzionano
Gli pseudo-elementi vengono inseriti dentro l'elemento, tra i suoi tag. Gli elementi che non hanno un interno per ospitarli non possono mostrarli:
<img>,<video>,<iframe>(elementi sostituiti)<input>,<select>,<textarea>(controlli dei moduli), e<br>
Alcuni browser li disegnano su una checkbox o su un'immagine non caricata, ma non in modo coerente. Metti invece lo pseudo-elemento su un contenitore: <span class="field"><input></span> e dai stile a .field::after.
Errori comuni
- Niente
content. È il motivo più frequente per cui non si vede nulla. Aggiungicontent: "". - Dare dimensioni a uno pseudo-elemento inline.
widtheheightnon fanno nulla finché non impostidisplay: block,inline-blockoposition: absolute. - Ordine sbagliato con uno stato.
a:hover::afterfunziona;a::after:hoverno. - Posizione assoluta senza un genitore posizionato. Lo pseudo-elemento si allinea allora a qualche antenato lontano. Aggiungi
position: relativeall'elemento. - Mettere contenuti veri nel CSS. Il testo in
contentnon si può selezionare né copiare. Tieni le informazioni nell'HTML.
Domande frequenti
Cosa fa ::before in CSS?
Crea uno pseudo-elemento che è il primo figlio dell'elemento selezionato, riempito con ciò che indica la proprietà content. ::after fa lo stesso come ultimo figlio. Nessuno dei due esiste nell'HTML, quindi sono comodi per icone, etichette e decorazioni.
Perché il mio ::before o ::after non si vede?
Il motivo più comune è la mancanza della proprietà content: senza, lo pseudo-elemento non viene generato. Usa content: "" per un box decorativo vuoto. Altre cause: uno pseudo-elemento inline con larghezza e altezza (dagli display: block o inline-block), oppure un elemento come <img> o <input> che non può contenerli.
Che differenza c'è tra :before e ::before?
Nessuna nel comportamento. ::before con due due punti è la sintassi attuale che distingue gli pseudo-elementi; :before con un solo due punti è la vecchia grafia CSS2 che i browser accettano ancora per before, after, first-line e first-letter.
Posso usare ::before su un img o un input?
Non in modo affidabile. Gli pseudo-elementi vengono inseriti dentro il contenuto dell'elemento, e gli elementi sostituiti come <img> e i controlli dei moduli come <input> non hanno un box di contenuto per ospitarli. Racchiudi l'elemento in uno <span> o in un <div> e metti lo pseudo-elemento sul contenitore.
Gli screen reader leggono il contenuto di ::before in CSS?
In genere sì: il testo in content di solito entra nel nome accessibile, ma non si può selezionare né copiare. Tieni le informazioni vere nell'HTML e usa gli pseudo-elementi per decorazioni e piccoli indizi visivi.