The CSS Podcast - 015: Pseudo-classi
Supponiamo che tu abbia un modulo di registrazione per email e che tu voglia che il campo del modulo email abbia un bordo rosso se contiene un indirizzo email non valido.
E come potete farlo?
Puoi utilizzare un':invalid
pseudoclasse CSS,
che è una delle molte pseudoclassi fornite dal browser.
Una pseudo-classe ti consente di applicare stili in base alle modifiche dello stato e a fattori esterni. Ciò significa che il tuo design può reagire all'input dell'utente, ad esempio un indirizzo email non valido. Questi argomenti sono trattati nel modulo Selettori, che li illustrerà in maggiore dettaglio.
A differenza degli pseudo-elementi, sui quali puoi saperne di più nel modulo precedente, le pseudo-classi si basano su stati specifici in cui un elemento potrebbe trovarsi, piuttosto che applicare stili in generale a parti dell'elemento.
Stati interattivi
Le seguenti pseudo-classi vengono applicate a causa di un'interazione di un utente con la tua pagina.
:hover
Se un utente ha un dispositivo di puntamento come un mouse o un trackpad e lo posiziona sopra un elemento, puoi collegarti a questo stato con :hover
per applicare gli stili.
Si tratta di un modo utile per indicare che è possibile interagire con un elemento.
:active
Questo stato viene attivato quando si interagisce attivamente con un elemento, ad esempio un clic, prima che il clic venga rilasciato. Se viene utilizzato un dispositivo di puntamento come un mouse, questo stato si verifica quando il clic inizia e non è stato ancora rilasciato.
:focus
, :focus-within
e :focus-visible
Se un elemento può ricevere lo stato attivo, ad esempio un <button>
, puoi reagire a questo stato con la pseudoclasse :focus
.
Puoi anche reagire se un elemento secondario del tuo elemento riceve lo stato attivo con
:focus-within
.
Gli elementi attivabili, come i pulsanti, mostrano un anello di attivazione quando sono attivi, anche quando viene fatto clic. In questo tipo di situazione, uno sviluppatore applicherà il seguente CSS:
button:focus {
outline: none;
}
Questo CSS rimuove l'anello di attivazione predefinito del browser quando un elemento riceve l'attenzione,
che presenta un problema di accessibilità per gli utenti che navigano in una pagina web con una tastiera.
Se non è presente uno stile di stato attivo,
non sarà possibile tenere traccia della posizione corrente dello stato attivo quando si utilizza il tasto Tab.
Con :focus-visible
puoi presentare uno stile di stato attivo quando un elemento lo riceve tramite la tastiera,
utilizzando al contempo la regola outline: none
per impedirlo quando un dispositivo di puntamento interagisce con l'elemento.
button:focus {
outline: none;
}
button:focus-visible {
outline: 1px solid black;
}
:target
L'pseudo-classe :target
selezionata seleziona un elemento che ha un id
corrispondente a un frammento di URL.
Supponiamo che tu abbia il seguente codice HTML:
<article id="content">
…
</article>
Puoi associare stili a questo elemento quando l'URL contiene #content
.
#content:target {
background: yellow;
}
Questo è utile per evidenziare aree a cui potrebbe essere stato fatto un link specifico, come i contenuti principali di un sito web, tramite un link di passaggio.
Stati storici
:link
L'pseudo-classe :link
può essere applicata a qualsiasi elemento <a>
con un valore href
che non è stato ancora visitato.
:visited
Puoi applicare uno stile a un link già visitato dall'utente utilizzando la pseudo-classe :visited
.
Si tratta dello stato opposto a :link
, ma hai meno proprietà CSS da utilizzare per motivi di sicurezza.
Puoi applicare stili solo a color
, background-color
,
border-color
, outline-color
e al colore di fill
e stroke
SVG.
L'ordine è importante
Se definisci uno stile :visited
,
puoi sostituirlo con una pseudo-classe link con una specificità almeno uguale.
Per questo motivo,
è consigliabile utilizzare la regola LVHA per applicare stili ai link con pseudoclassi in un ordine specifico:
:link
, :visited
, :hover
, :active
.
a:link {}
a:visited {}
a:hover {}
a:active {}
Stati del modulo
Le seguenti pseudoclassi possono selezionare gli elementi dei moduli nei vari stati in cui potrebbero trovarsi durante l'interazione con questi elementi.
:disabled
e :enabled
Se un elemento del modulo, come un <button>
, è disabilitato dal browser, puoi collegarti a questo stato con la pseudo-classe :disabled
.
L'pseudo-classe :enabled
è disponibile per lo stato opposto, anche se per impostazione predefinita gli elementi del modulo sono :enabled
, pertanto potresti non utilizzare questa pseudo-classe.
:checked
e :indeterminate
L'pseudo-classe :checked
è disponibile quando un elemento di modulo di supporto, come una casella di controllo o un pulsante di opzione, è selezionato.
Lo stato :checked
è uno stato binario(true o false), ma le caselle di controllo hanno uno stato intermedio quando non sono selezionate o deselezionate.
Questo è noto come stato
:indeterminate
.
Un esempio di questo stato è un controllo "Seleziona tutto" che seleziona tutte le caselle di controllo di un gruppo. Se l'utente deseleziona una di queste caselle di controllo, la casella di controllo principale non rappresenterà più la selezione di "tutti", pertanto deve essere impostata su uno stato indefinito.
L'elemento <progress>
ha anche uno stato indefinito a cui è possibile applicare uno stile.
Un caso d'uso comune è dare un aspetto a strisce per indicare che non è noto quanto altro è necessario.
:placeholder-shown
Se un campo del modulo ha un attributo placeholder
e nessun valore,
la pseudoclasse :placeholder-shown
può essere utilizzata per associare stili a questo stato.
Non appena il campo contiene contenuti,
indipendentemente dal fatto che sia presente o meno un placeholder
,
questo stato non verrà più applicato.
Stati di convalida
Puoi rispondere alla convalida dei moduli HTML con pseudoclassi come
:valid
,
:invalid
e
:in-range
.
Le pseudoclassi :valid
e :invalid
sono utili per contesti come un campo email che ha un pattern
che deve essere abbinato per essere un campo valido.
Questo stato del valore valido può essere mostrato all'utente,
aiutandolo a capire che può passare in sicurezza al campo successivo.
La pseudo-classe :in-range
è disponibile se un input ha min
e max
, come un input numerico e il valore rientra in questi limiti.
Con i moduli HTML,
puoi determinare che un campo è obbligatorio con l'attributo required
.
L'pseudo-classe :required
sarà disponibile per i campi obbligatori.
I campi non obbligatori possono essere selezionati con la pseudo-classe
:optional
.
Selezionare gli elementi in base all'indice, all'ordine e all'occorrenza
Esiste un gruppo di pseudo-classi che selezionano gli elementi in base alla loro posizione nel documento.
:first-child
e :last-child
Se vuoi trovare il primo o l'ultimo elemento,
puoi utilizzare
:first-child
e
:last-child
.
Queste pseudoclassi restituiscono il primo o l'ultimo elemento di un gruppo di elementi fratelli.
:only-child
Puoi anche selezionare gli elementi che non hanno elementi fratelli con la pseudo-classe :only-child
.
:first-of-type
e :last-of-type
Puoi selezionare :first-of-type
e :last-of-type
che a prima vista sembrano fare la stessa cosa di :first-child
e :last-child
, ma considera questo codice HTML:
<div class="my-parent">
<p>A paragraph</p>
<div>A div</div>
<div>Another div</div>
</div>
E questo CSS:
.my-parent div:first-child {
color: red;
}
Nessun elemento viene colorato di rosso perché il primo elemento secondario è un paragrafo e non un div.
In questo contesto è utile la pseudo-classe :first-of-type
.
.my-parent div:first-of-type {
color: red;
}
Anche se il primo <div>
è il secondo elemento secondario,
è comunque il primo di tipo all'interno dell'elemento .my-parent
,
quindi con questa regola sarà colorato di rosso.
:nth-child
e :nth-of-type
Non sei limitato ai primi e agli ultimi elementi secondari e ai tipi.
Le pseudoclassi :nth-child
e
:nth-of-type
ti consentono di specificare un elemento che si trova in un determinato indice.
L'indice nei selettori CSS inizia da 1.
Puoi anche passare più di un indice a queste pseudoclassi.
Se vuoi selezionare tutti gli elementi pari, puoi utilizzare :nth-child(even)
.
Puoi anche creare selettori più complessi che trovano gli elementi a intervalli regolari, utilizzando la microsintassi An+B.
li:nth-child(3n+3) {
background: yellow;
}
Questo selettore seleziona ogni terzo elemento,
a partire dall'elemento 3.
Il n
in questa espressione è l'indice,
che inizia da zero. Il 3 (3n
) è il numero per cui moltiplichi l'indice.
Supponiamo che tu abbia 7 articoli <li>
.
Il primo elemento selezionato è 3 perché 3n+3
si traduce in (3 * 0) + 3
.
L'iterazione successiva sceglierà l'elemento 6 perché n
è ora incrementato a 1
,
quindi (3 * 1) + 3)
.
Questa espressione funziona sia per :nth-child
sia per :nth-of-type
.
Puoi provare questo tipo di selettore con questo tester figlio n-esimo o questo strumento di selezione della quantità.
:only-of-type
Infine, puoi trovare l'unico elemento di un determinato tipo in un gruppo di elementi fratelli con
:only-of-type
.
Questa opzione è utile se vuoi selezionare elenchi con un solo elemento o se vuoi trovare l'unico elemento in grassetto in un paragrafo.
Trovare elementi vuoti
A volte può essere utile identificare elementi completamente vuoti, e anche per questo esiste una pseudo-classe.
:empty
Se un elemento non ha elementi secondari, viene applicata la pseudo-classe
:empty
.
Gli elementi secondari non sono solo elementi HTML o nodi di testo: possono anche essere spazi,
il che può creare confusione quando esegui il debug del seguente codice HTML e ti chiedi perché non funziona con :empty
:
<div>
</div>
Il motivo è che tra l'<div>
di apertura e quello di chiusura è presente uno spazio vuoto, quindi il valore vuoto non funzionerà.
La pseudo-classe :empty
può essere utile se hai poco controllo sull'HTML e vuoi nascondere elementi vuoti, come un editor di contenuti WYSIWYG.
In questo caso, un editor ha aggiunto un paragrafo vuoto e fuori contesto.
<article class="post">
<p>Donec ullamcorper nulla non metus auctor fringilla.</p>
<p></p>
<p>Curabitur blandit tempus porttitor.</p>
</article>
Con :empty
puoi trovarlo e nasconderlo.
.post :empty {
display: none;
}
Trovare ed escludere più elementi
Alcune pseudoclassi ti aiutano a scrivere CSS più compatti.
:is()
Se vuoi trovare tutti gli elementi secondari h2
, li
e img
in un elemento .post
,
potresti pensare di scrivere un elenco di selettori come questo:
.post h2,
.post li,
.post img {
…
}
Con l'pseudo-classe :is()
, puoi scrivere una versione più compatta:
.post :is(h2, li, img) {
…
}
La pseudo-classe :is
non è solo più compatta di un elenco di selettori, ma è anche più tollerante.
Nella maggior parte dei casi, se in un elenco di selettori è presente un errore o un selettore non supportato, l'intero elenco non funzionerà più.
Se si verifica un errore nei selettori passati in un'pseudo-classe :is
,
viene ignorato il selettore non valido, ma vengono utilizzati quelli validi.
:not()
Puoi anche escludere gli elementi con la pseudo-classe
:not()
.
Ad esempio, puoi utilizzarlo per applicare uno stile a tutti i link che non hanno un attributo class
.
a:not([class]) {
color: blue;
}
Un'pseudoclasse :not
può anche aiutarti a migliorare l'accessibilità.
Ad esempio, un <img>
deve avere un alt
, anche se si tratta di un valore vuoto,
quindi potresti scrivere una regola CSS che aggiunge un contorno rosso spesso alle immagini non valide:
img:not([alt]) {
outline: 10px red;
}
Verificare di aver compreso
Metti alla prova le tue conoscenze sulle pseudo classi
Le pseudo-classi si comportano come se una classe fosse stata applicata dinamicamente a un elemento, mentre gli pseudo-elementi agiscono sull'elemento stesso.
:
singolo o doppio come carattere distintivo principale nel selettoreQuali delle seguenti sono pseudo-classi funzionali?
:is()
:target
()
per indicare che accettano parametri.:empty
()
per indicare che accettano parametri.:not()
Quali delle seguenti pseudo classi sono dovute a un'interazione utente?
:hover
:press
:squeeze
:target
:focus-within
Quali delle seguenti sono pseudo classi di stato <form>
?
:enabled
:fresh
:indeterminate
:checked
:in-range
:loading
:valid