¿Cómo agregas CSS con Javascript?

¿Cómo se agregan las reglas de CSS (por ejemplo, strong { color: networking } ) mediante el uso de Javascript?

También puedes hacer esto usando DOM CSS 2 interfaces ( MDN ):

 var sheet = window.document.styleSheets[0]; sheet.insertRule('strong { color: networking; }', sheet.cssRules.length); 

… en todos less (naturalmente) IE, que usa su propia fraseología marginalmente diferente:

 sheet.addRule('strong', 'color: networking;', -1); 

Hay una ventaja teórica en esto en comparación con el método createElement-set-innerHTML, en el que no tiene que preocuparse por poner caracteres HTML especiales en el innerHTML, pero en la práctica los elementos de estilo son CDATA en HTML henetworkingado y '<' y '&' rara vez se usan en las hojas de estilo de todos modos.

Necesita una hoja de estilo en su lugar antes de poder comenzar a agregarla de esta manera. Esa puede ser cualquier hoja de estilo activa existente: externa, incrustada o vacía, no importa. Si no hay uno, la única forma estándar de crearlo en este momento es con createElement.

El enfoque simple y directo es crear y agregar un nuevo nodo de style al documento.

 var css = document.createElement("style"); css.type = "text/css"; css.innerHTML = "strong { color: networking }"; document.body.appendChild(css); 

La solución de Ben Blank no funcionaría en IE8 para mí.

Sin embargo, esto funcionó en IE8

 function addCss(cssCode) { var styleElement = document.createElement("style"); styleElement.type = "text/css"; if (styleElement.styleSheet) { styleElement.styleSheet.cssText = cssCode; } else { styleElement.appendChild(document.createTextNode(cssCode)); } document.getElementsByTagName("head")[0].appendChild(styleElement); } 

Aquí hay una versión ligeramente actualizada de la solución de Chris Herring , teniendo en count que también se puede usar innerHTML en lugar de crear un nuevo nodo de text:

 function insertCss( code ) { var style = document.createElement('style'); style.type = 'text/css'; if (style.styleSheet) { // IE style.styleSheet.cssText = code; } else { // Other browsers style.innerHTML = code; } document.getElementsByTagName("head")[0].appendChild( style ); } 

YUI acaba de agregar una utilidad específicamente para esto.

Puede agregar classs o attributes de estilo elemento a elemento.

Por ejemplo:

 <a name="myelement" onclick="this.style.color='#FF0';">text</a> 

Donde podría hacer this.style.background, this.style.font-size, etc. También puede aplicar un estilo usando este mismo método ala

 this.className='classname'; 

Si desea hacer esto en una function de JavaScript, puede usar getElementByID en lugar de 'this'.

Este sencillo ejemplo de agregar <style> en la cabecera de html

 var sheet = document.createElement('style'); sheet.innerHTML = "table th{padding-bottom: 0 !important;padding-top: 0 !important;}\n" + "table ul { margin-top: 0 !important; margin-bottom: 0 !important;}\n" + "table td{padding-bottom: 0 !important;padding-top: 0 !important;}\n" + ".messages.error{display:none !important;}\n" + ".messages.status{display:none !important;} "; document.body.appendChild(sheet); // append in body document.head.appendChild(sheet); // append in head 

Estilo dynamic de origen : manipulación de CSS con JavaScript

Otra opción es usar JQuery para almacenar la propiedad de estilo en línea del elemento, anexarla y luego actualizar la propiedad de estilo del elemento con los nuevos valores. Como sigue:

 function appendCSSToElement(element, CssProperties) { var existingCSS = $(element).attr("style"); if(existingCSS == undefined) existingCSS = ""; $.each(CssProperties, function(key,value) { existingCSS += " " + key + ": " + value + ";"; }); $(element).attr("style", existingCSS); return $(element); } 

Y luego ejecútelo con los nuevos attributes CSS como un object.

 appendCSSToElement("#ElementID", { "color": "white", "background-color": "green", "font-weight": "bold" }); 

Este no necesariamente es el método más eficiente (estoy abierto a sugerencias sobre cómo mejorar esto :)), pero definitivamente funciona.

Esta es mi solución para agregar una regla css al final de la última list de hojas de estilo:

 var css = new function() { function addStyleSheet() { let head = document.head; let style = document.createElement("style"); head.appendChild(style); } this.insert = function(rule) { if(document.styleSheets.length == 0) { addStyleSheet(); } let sheet = document.styleSheets[document.styleSheets.length - 1]; let rules = sheet.rules; sheet.insertRule(rule, rules.length); } } css.insert("body { background-color: networking }"); 

Aquí está mi function de propósito general que parametriza el selector de CSS y las reglas, y opcionalmente toma un nombre de file css (distingue entre mayúsculas y minúsculas) si desea agregarlo a una hoja en particular (de lo contrario, si no proporciona un nombre de file CSS, creará un nuevo elemento de estilo y lo agregará a la cabecera existente. Hará como máximo un nuevo elemento de estilo y lo volverá a utilizar en futuras llamadas a funciones). Funciona con FF, Chrome e IE9 + (quizás antes también, sin probar).

 function addCssRules(selector, rules, /*Optional*/ sheetName) { // We want the last sheet so that rules are not overridden. var styleSheet = document.styleSheets[document.styleSheets.length - 1]; if (sheetName) { for (var i in document.styleSheets) { if (document.styleSheets[i].href && document.styleSheets[i].href.indexOf(sheetName) > -1) { styleSheet = document.styleSheets[i]; break; } } } if (typeof styleSheet === 'undefined' || styleSheet === null) { var styleElement = document.createElement("style"); styleElement.type = "text/css"; document.head.appendChild(styleElement); styleSheet = styleElement.sheet; } if (styleSheet) { if (styleSheet.insertRule) styleSheet.insertRule(selector + ' {' + rules + '}', styleSheet.cssRules.length); else if (styleSheet.addRule) styleSheet.addRule(selector, rules); } }