Selettori CSS: i sei tipi e come combinarli
Tipo, classe, id, attributo, pseudo-classe, pseudo-elemento: più :is(), :where(), :not() e i combinatori
Un selettore è la parte di una regola CSS che dice a chi applicare lo stile. Vediamo i sei tipi fondamentali, quanto «pesano» (la loro specificità) e come combinarli.
Un selettore è il criterio con cui chiami un gruppo di persone in una sala. Puoi dire «tutti i medici» (tipo), «chi indossa il maglione rosso» (classe) o «la persona con matricola 123» (id). Più il criterio è mirato, più «pesa».
1. I sei tipi di selettore (e la loro specificità)
La specificità si scrive su tre colonne, ID - CLASSE - TIPO (l'abbiamo vista nella pillola sulla cascade). Ecco quanto vale ciascun selettore:
- p h1 tipo (elemento): seleziona per nome del tag → 0-0-1
- .evidenza classe: per l'attributo class → 0-1-0
- #logo id: per l'attributo id (unico nella pagina) → 1-0-0
- [type="email"] attributo: per presenza o valore di un attributo → 0-1-0 (come la classe)
- :hover :first-child pseudo-classe: per uno stato o una posizione (un due punti) → 0-1-0
- ::before ::first-line pseudo-elemento: una parte che non è un vero elemento (due due-punti) → 0-0-1
Poi abbiamo il selettore l'universale *, che seleziona tutto ma la sua specificità è 0-0-0.
Qual'è la differenza tra una pseudo-classe è uno pseudo-elemento? La pseudo-classe è «la persona che in questo momento alza la mano», uno stato temporaneo di chi è già presente in una riunione. Il pseudo-elemento è «l'iniziale decorata di questo paragrafo», una parte che non esisteva come elemento a sé, ma che ora puoi truccare.
Fonte: MDN Web Docs: «CSS selectors and combinators» e «Specificity».
2. I combinatori: le relazioni tra elementi
I combinatori descrivono la posizione di un elemento rispetto a un altro. Ce ne sono quattro:
article p /* ogni <p> dentro un <article> (discendente) */
article > p /* solo i <p> figli DIRETTI di <article> (figlio) */
h2 + p /* il <p> subito dopo un <h2> (adiacente) */
h2 ~ p /* tutti i <p> dopo un <h2> (successivo) */
Nota importante: i combinatori rendono la selezione più precisa, ma non aggiungono peso alla specificità (il peso viene solo dai selettori che collegano).
Fonte: MDN Web Docs: «CSS selectors and combinators» (combinatori discendente, figlio, +, ~).
3. :is(), :where() e :not(): raggruppare e negare
:is(...) significa «uno qualunque tra»: accorcia i selettori lunghi. :not(...) significa «tutti tranne». Entrambi prendono la specificità del loro argomento più forte. :where(...) seleziona esattamente come :is(), ma la sua specificità è sempre zero (0-0-0).
:is(h1, h2, h3) {
color: navy;
} /* invece di h1, h2, h3 { … } */
:where(a) {
color: blue;
} /* 0-0-0: facilissimo da sovrascrivere */
li:not(:last-child) {
border-bottom: 1px solid;
}
La differenza tra :is() e :where() è solo la specificità: :where() vale zero, ed è perfetto per stili di base (reset, temi, librerie) che vuoi rendere facili da sovrascrivere.
Fonte: MDN Web Docs: pseudo-classi funzionali «:is()», «:where()», «:not()».
In sintesi
| Selettore | Esempio | Specificità |
|---|---|---|
| Tipo / elemento | p, h1 |
0-0-1 |
| Classe | .evidenza |
0-1-0 |
| ID | #logo |
1-0-0 |
| Attributo | [type="email"] |
0-1-0 |
| Pseudo-classe | :hover |
0-1-0 |
| Pseudo-elemento | ::before |
0-0-1 |
| Universale | * |
0-0-0 |
| :is() / :not() | :is(.a, #b) |
quella dell'argomento più forte |
| :where() | :where(.a, #b) |
0-0-0 (sempre) |
| Combinatori | > + ~ (spazio) |
non aggiungono peso |
Regola pratica: usa il selettore più semplice che funziona, tieni bassa la specificità (:where() è tuo amico) e riserva gli #id ai casi davvero unici. I combinatori e funzioni come :is() servono a scrivere meno e in maniera più chiara.
Per approfondire
- Variabili CSS (Custom Properties): --variabile, var(), fallback: le variabili globali si dichiarano proprio con un selettore, :root.
Commenti (0)
Registrati per commentare, fare domande e proporre l'argomento della prossima pillola (oppure accedi se hai già un account).
Nessun commento. Sii il primo a scrivere qualcosa.