CSS Pseudo-classi: come usarle su IE6+!

Le pseudo-classi CSS sono utilizzate per aggiungere effetti speciali ad alcuni selettori e si riconoscono perchè hanno i "due punti " che precedono la dichiarazione. I CSS3 stanno per introdurre una gran quantità di nuove pseudo classi, che renderanno la vita dei webdesigner molto più facile (se si esclude la compatibilità con tutti i browser). Le pseudo-classi aiutano sia l’estetica e l’usabilità, e possono fare velocemente e facilmente cose che una volta erano difficili da ottenere.

Purtroppo, anche se alcune di esse appartengono già alle specifiche CSS 2.1, non sono supportate da nesusn browser IE. Ecco allora che ci vengono in aiuto alcune librerie JavaScript che uniformano il comportamento di IE ai browser più recenti.

IE7.js è una libreria JavaScript (100kb) per far sì che Internet Explorer 6+ si comporti come un browser standard-compliant. Essa risolve molti problemi legati a HTML, CSS e fa funzionare correttamente con IE5 e IE6 le PNG trasparenti.
Scarichiamola e scegliamo di includere il JavaScript che ci permette di aggiornare tutti gli IE alla versione 9, così:

<!--[if lt IE 9]>
  <script src="IE9.js"></script>
<![endif]-->

Pseudoclassi: sintassi

Tutte le pseudo-classi seguono questa sintassi:

elemento:pseudoClasse {
...
}

Alcune pseudo-classi fanno uso anche delle parentesi. Per esempio, la pseudo-classe :not() dichiara quale regola CSS non applicare. Ciò è utile quando si desidera applicare qualcosa a tutto tranne a un certa classe/ID. Per esempio, questa dichiarazione:

.miaClasse:not(div) { 
 background:#CCC;
}  

imposta uno sfondo di colore #CCC per tutti gli elementi che non siano div.

Utilizzo delle pseudo-classi

Pseudo-classi correlate ai link

Queste pseudo-classi applicano degli stili ai diversi stati di un link. Ecco di seguito la lista completa e cosa possiamo ottenere:

  • :link applica uno stile a un link non visitato
  • :visited applica uno stile a un link visitato
  • :hover applica uno stile su un elemento al passaggio del mouse
  • :active applica uno stile a un elemento attivo. Per esempio, un link è attivo da quando ci si clicca a quando si rilascia il click

A questo riguardo occorre ricordare che l’ordine sopra indicato non è casuale: in fatti, ogni pseudo-classe link-related ha una sua specificità.
Esiste una sorta di short-hand per ricordarsi la corretta successione: prendendo la lettera iniziale di ogni stato si ottiene "LVHA", che può essere ampliato a "LoVe HAte".

Pseudo-classi correlate a Input & link

  • :focus applica uno stile a un elemento in uso. Per esempio, quando si scrive dentro una textarea, in quel momento essa è in uso
  • :target se si dispone di un URL tipo index.html#about, questo permetterà di applicare i CSS per l’elemento con id="about"
  • :enabled seleziona tutti gli elementi input in stato enable
  • :disabled seleziona tutti gli elementi input in stato disabled
  • :checked controllato nelle caselle di immissione selezionate
  • :indeterminate seleziona i radio e i check-box, quando essi non sono né selezionata né non selezionata
  • :required seleziona gli elementi input che sono required
  • :optional seleziona gli elementi input che sono optional
  • :invalid seleziona input non validi
  • :in-range selziona elementi che sono in un range (da utilizzare con input type="range" in HTML5)
  • :out-of-range seleziona elementi fuori dal range
  • :default seleziona l’elemento di default, per esempio, in un form il bottone submit
  • :valid seleziona un campo input valido (HTML5)

Pseudo-classi correlate alla posizione/numero

Ecco un esempio:

  • :root applica uno stile CSS all’elemento radice, ossia il tag <html> in un documento HTML
  • :first-child applica uno stile al primo figlio di un elemento
  • :last-childapplica i CSS all’ultimo elemento contenuto. Esempio div p:last-child seleziona l’ultimo paragrafo d un div
  • :nth-child(N) seleziona elementi numerati, su base 1. Per esempio, p:nth-child(3) seleziona l’elemento p che è il terzo figlio. Si possono anche aggiungere regole, per esempio p:nth-child(2n+1), dove n è il numero di partenza partendo da 0 e viene incrementato di 1. Perciò, questa regola seleziona tutti gli elementi pari (odd): in questo caso è equivalente a scrivere nth-child(odd), così come per i dispari si scrive nth-child(even)
  • :nth-of-type(N) applicare i CSS a un elemento numerato di un certo tipo. Per esempio: div:nth-of-type(2) seleziona il secondo di quel tipo
  • :nth-last-of-type(N) seleziona un elemento in base alla sua posizione, per esempio nth-last-of-type(4)
  • :first-of-type applica i CSS solo al primo alemento di quel genere. Per esempio, se ci sono due div consecutivi, applica la regola solo al primo
  • :last-of-type Seleziona l’utlimo elemento di un genere
  • :only-child seleziona un elemento solo se è l’unico figlio del contenitore padre
  • :only-of-type seleziona un elemento solo se esso è l’unico nel suo genere contenuto nell’elemento padre

Pseudo-classi relazionali

  • :not(elemento | classe) applica una regola CSS solo agli elementi che non sono specificati tra le parentesi
  • :empty applica i CSS a un elemento solo se è vuoto

Pseudo classi e paseudo elementi legati al testo

Pseudo-elementi

  • :first-line definisce lo stile CSS della prima riga di un elemento
  • :first-letter definisce lo stile CSS del primo carattere di un elemento

Pseudo-classi

  • :lang() applica uno stile a un elemento che usa una lingua specifica, per esempio :lang(en) per l’inglese. È quindi possibile mettere lang = "en" in un tag HTML e impostare gli stili solo per esso
  • ::selection permette di cambiare lo stile del testo selezionato nel browser
  • :read-only seleziona gli elementi che sono read-only
  • :read-write seleziona la parte editabile in un elemento

Content-related pseudo-elementi

  • :before è in grado di aggiungere contenuti prima di un certo elemento
  • :after è in grado di aggiungere contenuti, dopo un certo elemento

jQuery: pseudo-selettori CSS3

jQuery permette di usare tutti questi selettori, per esempio:

  • :first funziona come :nth-child(1)
  • :eq(X) è uguale a :nth-child(X)
  • :contains('text')
  • :lt(X)come :nth-child(-n+X), seleziona “i primi X elementi”
  • :gt(X) è come :nth-child(n+X), seleziona tutto tranne “i primi (X-1) elementi”
  • :even è come :nth-child(even) o :nth-child(2n)
  • :odd è uguale a :nth-child(odd) o :nth-child(2n+1)
  • :has(S) controlla se l’elemento contiene un certo discendente

Oltre a questi ve ne sono molti altri.

Selettori di discendenza

C’è una differenza tra figli e discendenti?

Vediamo come impostare degli stili CSS per capire come funzionano il combinatore figlio diretto, il combinatore fratello adiacente, e il combinatore fratello di pari livello.

Child: combinatore "figlio diretto"

Nel codice sottostante, dichiariamo una discendenza generica (Combinatore del discendente – Descendant), e di seguito, una diretta.

#child  p { color: #000;font-weight:normal; }  
#child > p { color: #F00;font-weight:bold; }  

Adjacent sibling: combinatore "fratello adiacente"

Ecco come funziona adjacent sibling: in pratica appica lo stile all’elemento, se e solo se, esso è immediatamente successivo altro elemento indicato.

p + p { font-size: smaller; }
/* Applica lo stile solo al paragrafo che ne segue un altro (adiacente) */
#intro + ul { margin-top: 0; }
/* Applica lo stile solo alla lista che segue direttamente un elemento con  ID intro */

General sibling: combinatore "fratello generico"

General sibling è molto simile ad adiacent sibling: la differenza è che l’elemento che viene selezionato non ha bisogno di essere immediatamente successivo al primo elemento, ma può apparire ovunque dopo di esso. Ecco un esempio di general sibling:

p ~ p { background-color:#0F0; color:#FFF; padding:10px; }