Dare la possibilità agli utenti di scegliere l'aspetto del sito è certamente un bel servizio, capace anche migliorare l'accessibilità per gli utenti con problemi alla vista, come gli ipovedenti. Ciò è possibile grazie ai CSS e al DOM.
Abbiamo più volte visto come i CSS permettano di separare i contenuti di un sito dal suo layout. Essendo la grafica distinta dal codice (X)HTML della pagina, è possibile ottenere aspetti differenti semplicente associando differenti fogli di stile come nella pagina di esempio associata all'articolo.
Per ottenere questo risultato, l'ideale sarebbe utilizzare uno script lato server (PHP, JSP, ...). Purtroppo non sempre ciò è possibile, poiché non tutti i siti hanno a disposizione il supporto di tali linguaggi sul proprio server. Una valida alternativa è utilizzare uno script in Javascript che funzioni direttamente sul browser dell'utente. Lo script presentato in questo articolo funziona solo se i cookie sono attivi e se il browser ha un valido supporto del DOM come ad esempio IE5, IE6, Mozilla 1, Netscape 7.
Il foglio di stile deve essere associato col seguente codice:
<link rel="stylesheet" type="text/css" href="stile.css" media="screen" />
E' importante che il foglio di stile sia collegato specificando media="screen"
(E' in generale buona norma specificare il media a cui il foglio di stile è associato).
I lettori più esperti noteranno che ciò non permette l'utilizzo del metodo @import
per escludere fogli di stile elaborati a browser quali Netscape Navigator 4. In realtà ciò può facilmente essere ottenuto utilizzando il metodo @import
direttamente nel foglio di stile.
Il codice Javascript, per semplicità incluso nella pagina di esempio, è il seguente
function createCookie(name,value,days) {
// istruzioni per creare il cookie, non interessa ai fini dell'articolo
}
function readCookie(name) {
// istruzioni per leggere il cookie, non interessa ai fini dell'articolo
}
// memorizzazione del foglio di stile scelto e aggiornamento della pagina
function setCSS(nome_file_css) {
createCookie('skinUtente',nome_file_css,365);
location.reload();
}
// impostazione del foglio di stile
function setCSShref(nome_file_css) {
var link_ = document.getElementsByTagName("link");
for ($i=0;$i<link_.length;$i++)
if(link_[$i].media=="screen") link_[$i].href=nome_file_css+".css";
}
// scelta del foglio di stile
window.onload = function() {
nome_file_css = readCookie('skinUtente');
if(nome_file_css) setCSShref(nome_file_css);
}
Analizziamo il codice cominciando dalla memorizzazione del foglio di stile scelto e aggiornamento della pagina. Quando la funzione setCSShref(nome_file_css)
viene invocata, viene creato un cookie che memorizza nella variabile skinUtente
il nome del file CSS (passato attraverso la variabile nome_file_css
) che si vuole attivare per specificare il layout della pagina e viene ricaricata la pagina (ciò è necessario con Internet Explorer ma non con Mozilla).
Quando la pagina è (ri)caricata viene letto il nome del file CSS dal cookie e memorizzato nella variabile nome_file_css
. Se il cookie esiste viene invocata la funzione setCSShref(nome_file_css)
.
La funzione setCSShref(nome_file_css)
si occupa di impostare il giusto foglio di stile modificando il valore del parametro href
nel tag <link rel="stylesheet" type="text/css" href="stile.css" media="screen" />
. In pratica lo script memorizza nella variabile link_
tutti i tag LINK
presenti nel documento e identifica quello su cui agire attraverso il parametro media="screen"
. Una volta identificato il giusto tag LINK
su cui agire, altera il parametro href
per selezionare il giusto foglio di stile.
L'implementazione dello script è estremamente semplice. Si supponga di aver creato tre differenti fogli di stile:
Per selezionare i vari CSS, dunque per impostare le varie, skin è sufficiente creare dei link che invochino la funzione setCSS(nome_file_css)
, dove nome_file_css
è il nome del file che si vuole attivare privo dell'estensione .css. Un'esempio di codice (X)HTML per la creazione dei link potrebbe essere il seguente:
<a href="javascript:setCSS('skin1')">Skin 1</a> |
<a href="javascript:setCSS('skin2')">Skin 2</a> |
<a href="javascript:setCSS('accessibile')">Alta accessibilità</a>