Es fácil establecer valores CSS en línea con javascript. Si quiero cambiar el ancho y tengo un html como este:
<div style="width: 10px"></div>
Todo lo que necesito hacer es:
document.getElementById('id').style.width = value;
Cambiará los valores de la hoja de estilo en línea. Normalmente esto no es un problema, porque el estilo en línea anula la hoja de estilo. Ejemplo:
<style>
#tId {
width: 50%;
}
</style>
<div id="tId"></div>
Usando este Javascript:
document.getElementById('tId').style.width = "30%";
Obtengo lo siguiente:
<style>
#tId {
width: 50%;
}
</style>
<div id="tId" style="width: 30%";></div>
Esto es un problema, porque no solo no quiero cambiar los valores en línea, si busco el ancho antes de configurarlo, cuando tengo:
<div id="tId"></div>
El valor devuelto es Nulo, por lo que si tengo Javascript que necesita saber el ancho de algo para hacer algo de lógica (aumento el ancho en un 1%, no a un valor específico), obtengo Null cuando espero la cadena "50% "realmente no funciona.
Entonces mi pregunta: tengo valores en un estilo CSS que no están ubicados en línea, ¿cómo puedo obtener estos valores? ¿Cómo puedo modificar el estilo en lugar de los valores en línea, dada una identificación?
Respuestas:
Bien, parece que desea cambiar el CSS global para que cambie de manera eficiente todos los elementos de un estilo peticular a la vez. Recientemente aprendí cómo hacer esto yo mismo con un tutorial de Shawn Olson . Puede hacer referencia directamente a su código aquí .
Aquí está el resumen:
Puede recuperar las hojas de estilo a través de
document.styleSheets
. En realidad, esto devolverá una matriz de todas las hojas de estilo en su página, pero puede saber en cuál se encuentra a través de ladocument.styleSheets[styleIndex].href
propiedad. Una vez que haya encontrado la hoja de estilo que desea editar, debe obtener la matriz de reglas. Esto se denomina "reglas" en IE y "cssRules" en la mayoría de los demás navegadores. La forma de saber en qué CSSRule se encuentra es mediante laselectorText
propiedad. El código de trabajo se parece a esto:Hágame saber cómo funciona esto para usted y comente si ve algún error.
fuente
rule.value
en FF 20. Sinrule.style
embargo, hay, que se puede configurar y se comporta comoelement.style
. Cf. https://developer.mozilla.org/en-US/docs/DOM/CSSStyleRule .rule.type == rule.STYLE_RULE
También puede ser una buena idea buscar antes de accederrule.selectorText
.document.styleSheets[styleIndex].cssRules.[ruleIndex].style = {'color':'red', 'background-color':'green'};
funcionó para mí, gracias!¡Por favor! ¡Pregúntele a w3 ( http://www.quirksmode.org/dom/w3c_css.html )! O en realidad, me tomó cinco horas ... ¡pero aquí está!
La función es realmente fácil de usar ... ejemplo:
Oh..
EDITAR: como @ user21820 describió en su respuesta, podría ser un poco innecesario cambiar todas las hojas de estilo en la página. La siguiente secuencia de comandos funciona con IE5.5 y con la última versión de Google Chrome, y agrega solo la función css () descrita anteriormente.
fuente
Al reunir el código en las respuestas, escribí esta función que parece funcionar bien en mi FF 25.
Esta es una forma de poner valores en el CSS que se usarán en JS incluso si el navegador no los entiende. por ejemplo, maxHeight para un tbody en una tabla desplazada.
Llamada :
CCSStylesheetRuleStyle('default', "#mydiv", "height");
CCSStylesheetRuleStyle('default', "#mydiv", "color", "#EEE");
fuente
document.styleSheets[m].href
será nulo y fallará.No sé por qué las otras soluciones revisan la lista completa de hojas de estilo para el documento. Hacerlo crea una nueva entrada en cada hoja de estilo, lo cual es ineficiente. En su lugar, simplemente podemos agregar una nueva hoja de estilo y simplemente agregar nuestras reglas CSS deseadas allí.
Tenga en cuenta que podemos anular incluso los estilos en línea establecidos directamente en los elementos agregando "! Important" al valor de la propiedad, a menos que ya existan declaraciones de estilo "! Important" más específicas para esa propiedad.
fuente
No tengo suficiente representante para comentar, así que formatearé una respuesta, pero es solo una demostración del problema en cuestión.
Al parecer, cuando los estilos de elementos se definen en hojas de estilo, no son visibles para getElementById ("someElement"). Style
Este código ilustra el problema ... Código de abajo en jsFiddle .
En la Prueba 2, en la primera llamada, el valor de los elementos que quedan no está definido, por lo que lo que debería ser un simple cambio se estropea. Para mi uso, definiré mis valores de estilo importantes en línea, pero parece frustrar parcialmente el propósito de la hoja de estilo.
Aquí está el código de la página ...
Espero que esto ayude a aclarar el tema.
Omitir
fuente
Puede obtener los estilos "calculados" de cualquier elemento.
IE usa algo llamado "currentStyle", Firefox (y supongo que otros navegadores "compatibles con el estándar") usa "defaultView.getComputedStyle".
Necesitará escribir una función de navegador cruzado para hacer esto, o usar un buen marco de Javascript como prototype o jQuery (busque "getStyle" en el archivo prototipo de javascript y "curCss" en el archivo jquery javascript).
Dicho esto, si necesita la altura o el ancho, probablemente debería usar element.offsetHeight y element.offsetWidth.
Tenga en cuenta que si agrega un estilo en línea al elemento en cuestión, puede actuar como el valor "predeterminado" y será legible por Javascript al cargar la página, ya que es la propiedad de estilo en línea del elemento:
fuente
Esta simple esencia de 32 líneas le permite identificar una hoja de estilo dada y cambiar sus estilos muy fácilmente:
fuente
Nunca he visto un uso práctico de esto, pero probablemente debería considerar las hojas de estilo DOM . Sin embargo, honestamente creo que es una exageración.
Si simplemente desea obtener el ancho y el alto de un elemento, independientemente de dónde se apliquen las dimensiones, simplemente use
element.offsetWidth
yelement.offsetHeight
.fuente
Quizás intente esto:
fuente