Aggiungere una regola CSS in modo dinamico con Javascript può esserci utile in vari casi: uno riguarda sicuramente le performance, permettendoci di aggiungere e rimuovere regole direttamente al foglio di stile; un altro caso potrebbe essere semplicemente quelli di fare del traversing, cioè di manipolare degli elementi per fargli avere certe caratteristiche.
Partiamo dalle basi: per accedere ai fogli di stile CSS, dobbiamo utilizzare l’oggetto document.styleSheets:
var fogli = document.styleSheets; alert("Numero dei file CSS: "+fogli.length); var primo_css = document.styleSheets[0];
Vediamo quali sono le proprietà dell’oggetto:
console.log(document.styleSheets[0]); /* CSSStyleSheet cssRules: CSSRuleList disabled: false href: "https://devdev.it/style.css" media: MediaList ownerNode: link ownerRule: null parentStyleSheet: null rules: CSSRuleList title: null type: "text/css" */
Aggiungiamo delle regole
Per aggiungere delle regole, utilizzeremo il metodo insertRule, passandogli l’intera regola CSS, proprio come faremmo in un comune foglio di stile:
//Prendiamo il primo foglio var foglio_css = document.styleSheets[0]; if (foglio_css) { foglio_css.insertRule("img { border: 1px solid #F00; opacity: 0.8; }"); }
Questo metodo accetta un secondo parametro non obbligatorio, l’indice, cioè la posizione alla quale la regola verrà aggiunta, di default è 0, che corrisponde alla cima del foglio di stile.
foglio_css.insertRule("img { border: 1px solid #F00; opacity: 0.8; }", 5);
Questo metodo, purtroppo, non è compatibile con le vecchie versioni di Internet Explorer. Se la compatibilità per noi è un problema, possiamo utilizzare un metodo maggiormente compatibile, addRule, che ha una sintassi leggermente diversa:
var foglio_css = document.styleSheets[0]; if (foglio_css) { foglio_css.addRule("img", "border: 1px solid #F00; opacity: 0.8;"); }
Questo metodo è più largamente compatibile ed è quindi consigliabile in certi contesti. I parametri sono, principalmente, due: l’elemento e le regole CSS da applicare.