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.