Réponse courte, ceci est compatible "sur tous les navigateurs" (en particulier, IE8 / 7):
function createClass(name,rules){
var style = document.createElement('style');
style.type = 'text/css';
document.getElementsByTagName('head')[0].appendChild(style);
if(!(style.sheet||{}).insertRule)
(style.styleSheet || style.sheet).addRule(name, rules);
else
style.sheet.insertRule(name+"{"+rules+"}",0);
}
createClass('.whatever',"background-color: green;");
Et ce dernier bit applique la classe à un élément:
function applyClass(name,element,doRemove){
if(typeof element.valueOf() == "string"){
element = document.getElementById(element);
}
if(!element) return;
if(doRemove){
element.className = element.className.replace(new RegExp("\\b"+name+"\\b","g");
}else{
element.className = element.className + " "+name;
}
}
Voici aussi une petite page de test: https://gist.github.com/shadybones/9816763
L'élément clé est le fait que les éléments de style ont une propriété "styleSheet" / "sheet" que vous pouvez utiliser pour ajouter / supprimer des règles.