Menu

Pseudo-elementi CSS ::before e ::after con esempi

::before e ::after inseriscono contenuto generato come primo e ultimo figlio di un elemento, direttamente dal CSS. Impara la proprietà content, perché serve un content vuoto, come posizionarli, i tooltip con attr(), i contatori e dove non funzionano.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

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 contentRisultato
"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-quoteLe virgolette della lingua dell'elemento
none o normalNessuno 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. Aggiungi content: "".
  • Dare dimensioni a uno pseudo-elemento inline. width e height non fanno nulla finché non imposti display: block, inline-block o position: absolute.
  • Ordine sbagliato con uno stato. a:hover::after funziona; a::after:hover no.
  • Posizione assoluta senza un genitore posizionato. Lo pseudo-elemento si allinea allora a qualche antenato lontano. Aggiungi position: relative all'elemento.
  • Mettere contenuti veri nel CSS. Il testo in content non 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.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA