I selettori CSS 2.1 sono ancora oggi i selettori più usati dagli sviluppatori, anche se in alcuni aspetti ancora poco conosciuti. Scopo del presente articolo è quello di dare una descrizione completa dei selettori disponibili e della loro applicazione.
Definizione
Un selettore è composto da uno o più selettori semplici separati dai combinatori. I combinatori sono: spazio, ">" e "+". Lo spazio può ricorrere tra un combinatore e i selettori semplici. Gli elementi del documento che vengono selezionati da un selettore sono detti soggetti del selettore.
Raggruppamento
Quando più selettori condividono le stesse dichiarazioni, possono essere raggruppati in un elenco e separati da virgola:
h1, h2, h3 {font-family: Arial, sans-serif;}
Selettore universale
Il selettore universale (un asterisco, "*") seleziona ogni singolo elemento nel documento:
* {color: #000;}
Se il selettore universale non è il solo componente di un selettore semplice, può essere omesso:
*.box
e.box
sono equivalenti*#box
e#box
sono equivalenti
Selettori di tipo
Un selettore di tipo seleziona un elemento in base al tipo di elemento, ossia seleziona ogni istanza del tipo di elemento nel documento:
p {line-height: 1.6;}
Selettori del discendente
Un selettore del discendente seleziona un elemento quando questo è il discendente di un altro elemento. Un selettore del discendente è costituito da due o più selettori separati da uno spazio:
h1 a {color: #000; text-decoration: none;}
h1 * {text-decoration: none;}
div p img {padding: 3px; border-style: solid;}
Selettori del figlio
Un selettore del figlio seleziona un elemento quando questo è il figlio di un altro elemento. Un selettore del figlio è costituito da due o più selettori separati da ">":
div > p {line-height: 1.6;}
div ol > li p {line-height: normal;}
Questo selettore non è supportato dalle versioni di Internet Explorer inferiori alla 7.
Selettori del fratello adiacente
I selettori del fratello adiacente hanno la seguente sintassi: E1 + E2, dove E2 è il soggetto del selettore. Il selettore seleziona E2 se E1 ed E2 hanno lo stesso genitore e se E1 precede immediatamente E2 nell'albero del documento, ignorando i nodi diversi da quelli degli elementi (come i nodi testuali ed i commenti):
h1 + p {text-indent: 1em;}
Questo selettore non è supportato dalle versioni di Internet Explorer inferiori alla 7.
Selettori di attributo
I selettori di attributo selezionano gli elementi che hanno determinati attributi nel documento sorgente. Sono divisi in quattro tipi:
E[attr]
Seleziona qualsiasi elemento sulla base della presenza di un attributo, a prescindere dal suo valore. Viene detto selettore di attributo semplice.
a[title] {border-bottom: 1px dashed; text-decoration: none;}
E[attr="valore"]
Seleziona qualsiasi elemento sulla base del valore esatto dell'attributo. Viene detto selettore di valore esatto di attributo.
a[title="Link esterno"] {color: #008; background: #ffc;}
E[attr~="valore"]
Seleziona qualsiasi elemento sulla base di una parte del valore di un attributo separata da uno spazio. Viene detto selettore di valore parziale di attributo.
p[class~="importante"] {font-weight: bold;}
che selezionerà, ad esempio:
<p class="nota importante">...</p>
E[lang|="L"]
Seleziona qualsiasi elemento con un attributo
lang
il cui valore è un elenco di valori separati da trattini, che inizia con il valore L specificato nel selettore. Viene detto selettore di attributo di lingua.html[lang|="en"] {background: #ccc; color: #000;}
Questi selettori non sono supportati dalle versioni di Internet Explorer inferiori alla 7.
Selettori di classe
Un selettore di classe seleziona uno o più elementi in base al valore dell'attributo
class
specificato per essi:
.importante {color: #000; background: #ffc;}
p.nota {border: 1px solid #000;}
La prima dichiarazione si applicherà a tutti gli elementi con classe .importante
, mentre la seconda solo
agli elementi p
con classe .nota
. È possibile combinare le classi:
<p class="nota importante">...</p>
Si noti il punto (".") unito al nome della classe. Una classe può essere usata più volte nello stesso documento.
Selettori di id
Un selettore di id seleziona un elemento in base al valore del suo attributo id
. Un id può
essere usato una sola volta nel documento:
#box {width: 200px; margin: 1em 0;}
div#foo {border: 1px solid #000;}
La prima dichiarazione selezionerà un elemento con id uguale a box
, indipendentemente dal tipo di elemento.
La seconda invece selezionerà solo un elemento di tipo div
. Si noti il simbolo di cancelletto
("#") unito al nome dell'id.
La pseudo-classe :first-child
NOTA: Una pseudo-classe è un tipo di selettore che permette di operare una selezione in base a delle informazioni esterne all'albero del documento.
La pseudo-classe :first-child seleziona un elemento se questo è il primo figlio di un altro elemento:
div p:first-child {margin: 0 1em;}
Questo selettore non è supportato dalle versioni di Internet Explorer inferiori alla 7.
Le pseudo-classi dei link: :link e :visited
Le pseudo-classi :link e :visited si applicano, rispettivamente, a quei link non visitati e visitati (ossia presenti o meno nella cronologia del browser):
a:link {color: blue;}
a:visited {color: purple;}
Le pseudo-classi dinamiche: :hover, :active, :focus
Queste pseudo-classi si applicano in base a determinate azioni dell'utente:
- :hover
Si applica quando l'utente sceglie un elemento con il mouse ma non lo attiva. I browser la applicano quando si passa con il mouse sul box generato da un elemento.
- :active
Si applica quando un elemento viene attivato dall'utente, per esempio nel lasso di tempo in cui l'utente preme il bottone del mouse e lo rilascia.
- :focus
Si applica quando un elemento riceve il focus, ossia quando accetta eventi da tastiera o altre forme di input testuale.
Se applicate ai link, le pseudo-classi sinora esaminate devono essere specificate in questo ordine:
a:link { }
a:visited { }
a:hover { }
a:active { }
a:focus { }
Si possono applicare le pseudo-classi dinamiche anche ad altri elementi, come quelli dei form:
input:focus {outline-style: dotted; background: #ffc;}
Il supporto di Internet Explorer alle pseudo-classi dinamiche è parziale.
La pseudo-classe della lingua :lang
La pseudo-classe :lang(L) seleziona un elemento se l'elemento è nella lingua L:
p:lang(it) {text-indent: 1em;}
Lo pseudo-elemento :first-line
NOTA: Gli pseudo-elementi accedono a delle informazioni che si trovano al di fuori dell'albero del documento, creando delle astrazioni esterne a quest'ultimo.
Lo pseudo-elemento :first-line seleziona la prima riga di un elemento di blocco, inline-block, didascalia o cella di tabella:
p:first-line {text-transform: uppercase;}
Questo selettore non è supportato da Internet Explorer 5.x per Windows.
Lo pseudo-elemento :first-letter
Lo pseudo-elemento :first-letter seleziona la prima lettera di un elemento di blocco, se la lettera iniziale non è preceduta da altro contenuto (immagini e tabelle inline). Gli si possono assegnare le seguenti proprietà:
- proprietà dei font
text-decoration
text-transform
letter-spacing
word-spacing
line-height
float
vertical-align
(sefloat
ènone
)- proprietà del margine
- proprietà del padding
- proprietà del bordo
color
- proprietà dello sfondo
p:first-letter {
float: left;
font: italic bold 200%/1 serif;
}
Questo selettore non è supportato da Internet Explorer 5.x per Windows.
Gli pseudo-elementi :before e :after
Questi pseudo-elementi vengono usati per inserire contenuto generato prima (:before) e
dopo (:after) il contenuto di un elemento. Vengono di solito usati insieme alla proprietà
content
:
p:before {content:"Nota "; font-weight: bold;}
h1:after {content: url("img.gif");}
Questi pseudo-elementi possono essere usati contemporaneamente:
a[title="Link esterno"]:before {
content: '\2022';
padding-right: 2px;
}
a[title="Link esterno"]:after {
content: "[" attr(href) "]";
padding-left: 2px;
}
Questi selettori non sono supportati da Internet Explorer 6 e 7.