Menu

Pseudo-classi CSS: nth-child, not, first-child, focus

Le pseudo-classi selezionano gli elementi in base alla posizione o allo stato: :nth-child(), :first-child, :not(), :focus, :checked, :has() e altre. Impara la sintassi, la formula an+b con un tester dal vivo e la differenza tra nth-child e nth-of-type.

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

Cos'è una pseudo-classe

Una pseudo-classe è una parola chiave dopo i due punti che seleziona gli elementi in base alla loro posizione nel documento o al loro stato. La attacchi a un selettore normale: li:first-child, input:focus, a:hover.

Le pseudo-classi di stato per i link e il mouse (:hover, :active, :visited) hanno una pagina tutta loro, CSS hover.

:nth-child() e la formula an+b

:nth-child() accetta un numero, una parola chiave o una formula an+b. Il browser prova n = 0, 1, 2, ... e seleziona ogni posizione prodotta dalla formula (le posizioni partono da 1).

FormulaPosizioni selezionateSignificato
33Il terzo figlio
odd o 2n+11, 3, 5, ...Righe dispari
even o 2n2, 4, 6, ...Righe pari
3n3, 6, 9, ...Uno ogni tre
n+44, 5, 6, ...Dal quarto in poi
-n+31, 2, 3I primi tre
3n+11, 4, 7, ...Uno ogni tre, partendo dal primo

Scrivi una formula e guarda quali elementi vengono selezionati:

Prova odd, even, 4, n+7, -n+5 e 2n+3. Una formula non valida non seleziona niente.

La gemella che conta dalla fine è :nth-last-child(): li:nth-last-child(-n+2) seleziona gli ultimi due elementi.

nth-child contro nth-of-type

:nth-child() conta ogni elemento fratello, qualunque sia il suo tag, e solo dopo controlla il resto del selettore. :nth-of-type() conta solo i fratelli con lo stesso tag. La differenza si vede appena i fratelli sono misti:

Le stesse coppie esistono per le estremità: :first-child / :first-of-type, :last-child / :last-of-type, :only-child / :only-of-type.

:not(), :is() e :where()

Pseudo-classeEsempioSeleziona
:not(X)li:not(.done)Gli elementi che non corrispondono a X
:is(X, Y):is(h1, h2, h3) aGli elementi che corrispondono a uno qualsiasi dell'elenco
:where(X, Y):where(ul, ol) liCome :is(), con specificità zero
:has(X)li:has(> input:checked)Gli elementi che contengono una corrispondenza per X

:not() è quella che si usa ogni giorno, per esempio per mettere un separatore tra gli elementi ma non dopo l'ultimo:

Pseudo-classi di stato: focus, checked, disabled, invalid

Pseudo-classeSeleziona
:focusL'elemento che ha il focus da tastiera o da mouse
:focus-visibleCon focus, quando il browser decide che deve comparire un contorno (di solito con il focus da tastiera)
:focus-withinUn elemento che contiene l'elemento con focus
:checkedUna checkbox o un radio selezionati, o un <option> scelto
:disabled / :enabledI controlli dei form (non) disabilitati
:required / :optionalGli input con o senza required
:invalid / :validGli input il cui valore non supera o supera la validazione
:user-invalidNon valido, ma solo dopo che l'utente ci ha interagito
:placeholder-shownUn input che sta mostrando il suo placeholder
:emptyUn elemento senza figli, nemmeno testo
:targetL'elemento il cui id corrisponde al #fragment dell'URL

Clicca nel campo email: la sua etichetta diventa blu grazie a :focus-within. Scrivi qualcosa che non è un'email ed esci dal campo: :user-invalid rende il bordo ambra. Un semplice :invalid avrebbe segnato in ambra il campo obbligatorio vuoto prima ancora che lo toccassi.

Qualunque cosa tu faccia con :focus, mantieni uno stile di focus visibile. Togliere il contorno senza sostituirlo lascia chi usa la tastiera senza modo di vedere dove si trova.

:has(), il selettore del genitore

:has() seleziona un elemento in base a ciò che contiene. È il "selettore del genitore" richiesto da tanto tempo, e funziona nelle versioni attuali di Chrome, Firefox e Safari.

Scegli l'altro piano: l'intera card segue il pulsante radio, senza JavaScript.

Errori comuni

  • Uno spazio prima dei due punti. li :first-child significa "un primo figlio dentro un li". Scrivi li:first-child.
  • Aspettarsi che p:nth-child(1) significhi "il primo p". Significa "il primo figlio, se è un p". Usa :first-of-type per il primo p.
  • Contare da 0. Le posizioni partono da 1: :nth-child(0) non seleziona niente.
  • Togliere i contorni di focus. :focus { outline: none } senza un sostituto rompe la navigazione da tastiera.
  • Confondere : e ::. :before è una vecchia grafia dello pseudo-elemento ::before; le pseudo-classi usano sempre i due punti singoli.

Domande frequenti

Cos'è una pseudo-classe in CSS?

Una parola chiave dopo i due punti che seleziona gli elementi in base allo stato o alla posizione invece che al nome, come a:hover, li:first-child o input:focus. Si aggiunge a un selettore normale, e la maggior parte delle pseudo-classi conta come una classe per la specificità (:where() conta zero).

Come funziona nth-child in CSS?

:nth-child(an+b) seleziona gli elementi la cui posizione tra i fratelli è a×n+b per n = 0, 1, 2 e così via, contando da 1. :nth-child(3) è il terzo figlio, :nth-child(odd) o 2n+1 ogni figlio dispari, e :nth-child(n+4) dal quarto in poi.

Qual è la differenza tra nth-child e nth-of-type?

:nth-child() conta tutti gli elementi fratelli, poi controlla il resto del selettore; :nth-of-type() conta solo i fratelli dello stesso tipo di elemento. In un elenco con un h2 seguito da paragrafi, p:nth-child(1) non seleziona niente mentre p:nth-of-type(1) seleziona il primo paragrafo.

Come si usa :not() in CSS?

Metti tra le parentesi il selettore da escludere: li:not(.done) seleziona ogni elemento della lista senza la classe done. Accetta anche un elenco, input:not([type="checkbox"], [type="radio"]).

Qual è la differenza tra pseudo-classe e pseudo-elemento?

Una pseudo-classe (due punti singoli, :hover) seleziona un intero elemento esistente in un certo stato. Uno pseudo-elemento (due punti doppi, ::before) si riferisce a una parte di un elemento o crea contenuto generato.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA