Cos'è un selettore CSS
Un selettore è la parte di una regola prima delle parentesi graffe. Decide a quali elementi si applicano le dichiarazioni.
p.note { color: #2563eb; }
/* selector: p.note declaration: color: #2563eb */
I cinque selettori di base coprono la maggior parte dei fogli di stile reali:
I tipi di selettore a colpo d'occhio
| Selettore | Esempio | Seleziona |
|---|---|---|
| Universale | * | Ogni elemento |
| Tipo | p | Ogni <p> |
| Classe | .tip | Gli elementi con class="tip" (tra le altre) |
| ID | #main-title | L'elemento con id="main-title" |
| Attributo | [type="email"] | Gli elementi il cui attributo corrisponde |
| Pseudo-classe | a:hover, li:first-child | Gli elementi in uno stato o in una posizione |
| Pseudo-elemento | p::first-line, .x::before | Una parte di un elemento |
| Gruppo | h1, h2, h3 | Tutto ciò che corrisponde a uno dell'elenco |
| Composto | p.tip | Un <p> che ha anche la classe |
Classi e ID hanno una pagina tutta loro, selettore di classe CSS. Le pseudo-classi come :nth-child() e :not() sono trattate nella pagina sulle pseudo-classi.
Combinatori: discendente contro figlio
Un combinatore unisce due selettori in base alla loro relazione nell'albero HTML. Ce ne sono quattro.
| Combinatore | Sintassi | Seleziona B quando |
|---|---|---|
| Discendente | A B (spazio) | B si trova ovunque dentro A |
| Figlio | A > B | Il genitore di B è A |
| Fratello adiacente | A + B | B viene subito dopo A, stesso genitore |
| Fratello generale | A ~ B | B viene da qualche parte dopo A, stesso genitore |
Lo spazio e > sono la coppia che si confonde di più. Il selettore discendente arriva a qualsiasi profondità; il selettore figlio si ferma a un livello:
Combinatori tra fratelli: + e ~
I fratelli guardano solo in avanti. Non esiste un combinatore del "fratello precedente", anche se :has() può esprimerlo: h2:has(+ p) seleziona un h2 seguito direttamente da un p.
Selettori di attributo
Le parentesi quadre selezionano in base agli attributi e ai loro valori:
| Selettore | Seleziona |
|---|---|
[disabled] | Ha l'attributo, con qualsiasi valore |
[type="email"] | Il valore è esattamente email |
[href^="https"] | Il valore inizia con https |
[href$=".pdf"] | Il valore finisce con .pdf |
[class*="icon"] | Il valore contiene icon in qualsiasi punto |
[lang|="en"] | Il valore è en o inizia con en- |
[data-state="open" i] | Corrispondenza esatta, senza distinguere maiuscole e minuscole |
I selettori di attributo sugli attributi data-* sono un modo pulito per dare stile a uno stato impostato da JavaScript, senza inventare nomi di classe.
Prova qualsiasi selettore
Scrivi un selettore nel campo. Ogni elemento che seleziona riceve un contorno ambra, e il conteggio compare sotto.
Prova #demo a, ul > li, h2 ~ *, a[href^="https"], li:not(.active).
Composto contro discendente: lo spazio conta
p.note e p .note differiscono per uno spazio e significano cose diverse.
Come i browser leggono i selettori
Quando più regole selezionano lo stesso elemento e impostano la stessa proprietà, vince il selettore più specifico, e a parità vince quello scritto dopo. Un ID pesa più di qualsiasi numero di classi, e una classe più di qualsiasi numero di selettori di tipo; la pagina su !important ha la tabella completa della specificità.
Un gruppo ha un'insidia: se un selettore qualsiasi in un semplice elenco non è valido, l'intera regola viene scartata. In a, b:unknown { } nemmeno i link ricevono lo stile. Racchiudere l'elenco in :is() lo rende tollerante, quindi :is(a, b:unknown) dà comunque stile ai link.
Errori comuni
- Dimenticare il punto o il cancelletto.
tip { }seleziona un elemento<tip>, nonclass="tip". Scrivi.tip. - Uno spazio in un selettore composto.
p .notenon èp.note. - Aspettarsi che
>arrivi ai nipoti. Usa uno spazio per qualsiasi profondità. - Un errore di battitura rompe un intero gruppo. In
h1, h2:hovr, h3niente riceve lo stile. - Selettori troppo lunghi.
body div.wrapper ul li aè lento da leggere e difficile da sovrascrivere. Di solito basta una sola classe.
Domande frequenti
Cos'è un selettore CSS?
La parte di una regola CSS prima della { che dice a quali elementi si applicano le dichiarazioni. In p.note { color: blue; }, il selettore p.note seleziona ogni <p> con la classe note.
Qual è la differenza tra uno spazio e > in un selettore CSS?
Lo spazio è il combinatore discendente: nav a seleziona ogni link ovunque dentro un nav, a qualsiasi profondità. > è il combinatore figlio: nav > a seleziona solo i link il cui genitore diretto è il nav.
Cosa significa + in CSS?
+ è il combinatore del fratello adiacente. h2 + p seleziona un <p> che viene subito dopo un <h2> con lo stesso genitore. ~ è meno restrittivo: h2 ~ p seleziona ogni fratello <p> successivo.
Come seleziono gli elementi in base a un attributo in CSS?
Metti l'attributo tra parentesi quadre: [disabled] seleziona gli elementi che lo hanno, [type="email"] un valore esatto, [href^="https"] un valore che inizia con una stringa, [href$=".pdf"] uno che finisce con essa, e [class*="btn"] uno che la contiene.
CSS può selezionare un elemento genitore?
Sì, con la pseudo-classe :has(), supportata dalle versioni attuali di Chrome, Firefox e Safari. li:has(> a.active) seleziona gli elementi della lista che contengono direttamente un link attivo.