Analisi progettuale delle pseudo-classi CSS
Le pseudo-classi strutturali riguardano tutti quegli elementi basati sulla loro relazione con altri elementi del DOM.
CSS 2 includeva solo una pseudo-classe strutturale in questa categoria, :first-child, mentre CSS 3 ne ha introdotti di nuove.
Le pseudo-classi strutturali di CSS 3 sono supportate da tutti i principali browser.
E:root
La pseudo-classe :root seleziona l'elemento radice della pagina. In HTML l'elemento radice è sempre l'elemento HTML; ció significa che le seguenti righe di codice sono quasi equivalenti, anche se la pseudo-classe è più specifica:
html {background-color: red; color: white}
:root {background-color: red; color: white}
E:first-child
La pseudo-classe :first-child corrisponde al primo figlio dell'elemento selezionato.
p:first-child {}
Nel seguente esempio, questa regola si applica al primo elemento figlio del paragrafo.
<p><span>Primo figlio dell'elemento</span> <span>altro testo</span> </p>
E: last-child
La pseudo-classe :last-child rappresenta l'ultimo figlio dell'elemento selezionato.
p:last-child {}
Questa regola ha come target l'ultimo figlio del seguente del paragrafo.
<p><span>altro testo</span> <span>Ultimo figlio dell'elemento</span> </p>
E: only-child
La pseudo-classe :only-child corrisponde ad un elemento il cui oggetto padre non ha figli.
p:only-child {} /* elemento figlio unico */
Nell'esempio che segue notiamo che questa regola viene applicata al primo elemento perché è l'unico figlio del paragrafo. Il secondo paragrafo ha due figli, quindi nessuno di loro è interessato da questa regola.
<p><strong>Figlio unico</strong></p> <p><strong>altro testo</strong><em>altro testo</em></p>
E: only-of-type
Il funzionamento di :only-of-type è simile a quello di :only-child. Come suggerisce il nome, il selettore :only-of-type corrisponde all'elemento selezionato solo se il padre contiene elementi figli di diverso tipo.
p:only-of-type {} /* valido solo per l'elemento <p> */
Il seguente paragrafo è interessato da questa regola perché è l'unico elemento paragrafo del suo genitore.
<div><h1>altro testo</h1> <p>Testo only-of-type</p> </div>
E: first-of-type
La pseudo-classe :first-of-type si riferisce al primo elemento figlio di un elemento selezionato.
p:first-of-type {} /* il primo elemento di <p> */
Nel seguente esempio corrisponde al primo elemento <p>:
<div><h1>Titolo</h1> <p>testo first-of-type</p> <p>altro testo</p> </div>
E: last-of-type
La pseudo-classe :last-of-type seleziona il primo elemento che è l'ultimo figlio del suo tipo.
strong:last-of-type {} /* ultimo elemento <strong> */
Questa regola si applica all'ultimo <strong> tra gli elementi simili.
<div> <strong>altro testo</strong> <strong>elemento selezionato last-of-type</strong> </div>
E:nth-child()
La pseudo-classe :nth-child() é senza dubbio, tra le pseudo-classi di nuova generazione, la più interessante: identifica l'elemento E che è l'n-esimo figlio del suo elemento padre. L'argomento posto all'interno delle parentesi, può essere un numero, una parola chiave o una formula.
I suoi utilizzi sono innumerevoli. Vediamo nel dettaglio. Supponiamo di dover costruire una semplice tabella:
| Item 1 | Item 2 | Item 3 |
|---|---|---|
| Element 1 | Element 2 | Element 3 |
| Element 4 | Element 5 | Element 6 |
| Element 7 | Element 8 | Element 9 |
| Element 10 | Element 11 | Element 12 |
| Element 13 | Element 14 | Element 15 |
Il nostro scopo é dover selezionare ed evidenziare una solo riga. Ricorrendo al vecchio metodo, avremmo semplicemente apposto una classe alla riga in questione, creando una regola ad hoc. Con la pseudo-classe E:nth-child() tutto si semplifica.
Basta infatti scegliere il numero della riga da evidenziare e apporre una regola di stile, come da esempio:
tr:nth-child(2) td {background-color: #E7E7E7;}
Abbiamo qui evidenziato la riga 2 della nostra tabella, assegnadole uno sfondo di un colore differente.
Nel caso avessimo bisogno di utilizzare diversi colori di background a righe alternate (la 1 e la 3 per esempio), possiamo utilizzare queste righe di codice
tr td {background-color: #DBEEF4} tr:nth-child(odd) td {background-color: #F5F5F5;}
Sostituendo la parola even a la parola odd, si selezionano le righe pari (2 e 4)
La flessibilitá della pseudo-classe :nth-child() permette di inserire formule per creare dei pattern piuttosto complessi.
Partendo dagli esempi prima visti, possiamo infatti contrarre la formula, ottentendo un background diverso ogni 2 celle
tr:nth-child(2n+1) td {background-color: #E2E2E2;}
Entriamo nel dettaglio della formula an + b: a e b sono dei numeri interi. Con tale pattern selezioniamo l'elemento figlio che si trova alla distanza an+b-1 dal primo elemento figlio. Il valore di b indica la distanza di partenza, ovvero dopo quanti elementi bisogna far partire la formula.
Cerchiamo di capire meglio il concetto, che fin'ora potrebbe sembrare piuttosto ostico.
tr:nth-child(3n+2) td {background-color: #E5E5E5;}
Questa formula assegna un background di colore differente ogni 3 righe della tabella, iniziando a contare dalla riga numero 2.
Se ne deduce naturalmente che, incrementando il valore di a aumenti lo spazio tra gli elementi selezionati e contestualmente, incrementando il valore di b, aumenti lo spazio iniziale della selezione.
Se il valore di a è uguale a 1 o il valore b é uguale a 0, gli stessi valori possono essere omessi.
CASI PARTICOLARI
queste sono identiche
tr:nth-child(2n)
tr:nth-child(even)queste sono identiche
tr:nth-child(2n+1)
tr:nth-child(odd)queste sono identiche
tr:nth-child(0n+5)
tr:nth-child(5)queste sono identiche
tr:nth-child(1n+0)
tr:nth-child(n+0)
tr:nth-child(n)queste sono simili ma con una specificitá piú bassa
/* le seguenti regole sono del tutto identiche */
tr:nth-child(10n-1) /* selezionerà l'elemento 9, 19, 29, ecc */
tr:nth-child(10n+9) /* selezionerà l'elemento 9, 19, 29, ecc */
E: nth-of-type
La pseudo-classe :nth-of-type (an+b) corrisponde al b-esimo elemento di un elemento selezionato tra un gruppo di altri elementi dello stesso tipo, divisi in gruppi.
p:nth-of-type(2) {} /* secondo paragrafo del gruppo */
p:nth-of-type(2n) {} /* paragrafo pari del gruppo */
p:nth-of-type(2n+1) {} /* paragrafo dispari del gruppo */
Il comportamento di questa pseudo-classe è simile a :nth-child, ma corrisponde anche a elementi dello stesso tipo dell'elemento specificato, anziché ai figli corrispondenti all'elemento specificato.
<div> <em>testo</em><p>pari</p><p>secondo e dispari</p><p>pari</p> </div>
Simile alla pseudo-classe :nth, le parole chiavi pari e dispari possono essere usate per creare corrispondenze tra elementi dello stesso tipo.
p:nth-of-type(even) {} /* elemento dispari dello stesso tipo */
p:nth-of-type(odd) {} /* elemento pari dello stesso tipo */
E: nth-last-of-type
La pseudo-classe :nth-last-of-type(an + b) corrisponde all'elemento del tipo selezionato che ha an + b elementi dello stesso tipo dopo di esso. Questo comportamento è equivalente alla pseudo-classe :nth-of-type, tranne
per il fatto che si parte a contare gli elementi dal basso verso l'alto.
p:nth-last-of-type(3) {} /* terzo e ultimo paragrafo */
p:nth-last-of-type(-n+2) {} /* ultimi due paragrafi */
Possiamo vedere le regole applicate al seguente esempio. L'elemento <em> non è conteggiato perché non è del tipo specificato, in questo caso il paragrafo.
<div> <p>terzo e ultimo</p> <p>ultimi due</p> <p>ultimi due</p><em>testo non interessato da modifica</em> </div>
E: nth-last-child
La pseudo-classe :nth-last-child(an + b) rappresenta qualsiasi elemento che
ha un fratello an + b dopo di esso. Il suo comportamento è lo stesso di :nth-child, tranne per il fatto che inizia con l'elemento inferiore anziché con quello superiore.
p:nth-last-child(3) {} /* terzo e ultimo figlio */ p:nth-last-child(-n+2) {} /* ultimi due figli */
Queste regole vengono applicate agli elementi figli nel seguente esempio:
<div> <p>terzo e ultimo</p> <p>ultimi due</p> <p>ultimi due</p> </div>
E: empty
La pseudo-classe :empty corrisponde agli elementi selezionati che non hanno contenuto.
p:empty {} /* paragrafi vuoti */
Un elemento è considerato vuoto se non ha elementi figlio, del testo o spazi bianchi ad eccezione dei commenti al codice.
La regola precedente si applica ai seguenti due paragrafi:
<p></p> <p><!-- commento --></p>