2012-05-22 19 views
14

HTML:¿Por qué se invalida este importante valor de CSS?

<div id="test">This is a test</div> 

JavaScript:

var elem = document.getElementById('test'); 

elem.style.setProperty('color', 'green', 'important'); 
elem.style.color = 'red'; 

Demostración en directo:http://jsfiddle.net/4fn6h/3/

El texto es de color verde en Chrome, Safari, e IE9, pero el rojo en Firefox y Opera. (Además, el texto es negro en IE7 e IE8, porque el código arroja un error, pero ignoremos eso ...)

Entonces, ¿qué navegadores siguen el estándar aquí? ¿Debería ser posible anular setProperty(...,'important') o no?

+0

Consulte esta pregunta: http://stackoverflow.com/questions/462537/overriding-important-style-using-javascript –

+0

http://quirksmode.org/dom/w3c_css.html#t46 – jbabey

+0

interesante, esto también sucede con http://jsfiddle.net/4fn6h/4/ – ajax333221

Respuesta

0

Podría ser que el comportamiento de Firefox y Opera sea más apropiado.

Cuando ejecute elem.style.color = 'red'; no desactivó la prioridad "importante" en el color, en cuyo caso tendría sentido cambiar el color a rojo. En cuanto a por qué eligen hacerlo de una manera u otra, no lo sé.

+1

Una posibilidad es que FF/Opera simplemente sobrescriba toda la propiedad 'color'. El hecho de que el valor anterior tuviera '! Important' no significa que la propiedad fuera de solo lectura. Pero entonces ¿por qué Chrome/Safari/IE9 tampoco lo sobrescribe? –

+0

No hay nada de eso en la especificación. ¿Qué sucede en Chrome/Safari/IE9 cuando se establece la prioridad (como en http://jsfiddle.net/4fn6h/9/)? – Bergi

+0

@Bergi Lo mismo. Verde en Chrome & co., Rojo en Firefox ... –

2

La especificación no está clara. Hay dos formas de verlo:

  1. es un error en WebKit/IE9. Si está sobrescribiendo el valor color, no hay ninguna razón para que el valor anterior se quede, importante o no.
  2. WebKit/IE9 son correctos. La interfaz DOM style manipula la propiedad style del elemento, que se considera CSS Declaration Block. En un bloque CSS, una propiedad con !important establecerá siempre tendrá prioridad sobre los que no tienen. Según esa regla, el cambio a 'rojo' no debería tener ningún efecto, por lo que se ignora de manera efectiva.

Creo que esta última es la explicación más probable. Considerar la posibilidad de una declaración como esta:

p { color: red !important; } 

Si se agrega una segunda regla color, sin !important, no tiene ningún efecto:

p { 
    color: red !important; 
    color: blue; 
} 
/* the color is still red */ 

Lo mismo se aplica a la manipulación del HTML style atribuyen directamente.

Entonces el comportamiento en Chrome/Safari/IE9 es consistente con las reglas de cascada CSS, mientras que FF y Opera tratan el estilo DOM como un objeto simple sin tener en cuenta las reglas en cascada, no como una interfaz a las declaraciones CSS.

http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113/css.html#CSS-CSSStyleDeclaration


Diversión hecho: webkit parece estar haciendo un partido de cadena para important, así que esto también funciona:

elem.style.setProperty('color', 'red', 'this is a really important rule'); 

Y un consejo: elegir un mejor par de colores la próxima vez, está haciendo que sea difícil para los daltónicos ayudar :)

+0

'!' Es un delimitador e 'importante' es una palabra clave. delimiter está diseñado para navegadores para analizar a través de los estilos. 'importante' es la" operación "que se debe realizar. 'super' o' very' no son parte de ningún estándar w3 y nosotros los desarrolladores nunca debemos usarlos. seamos claros y fuertes. –

+0

@RayCheng ¿Ves la palabra "curiosidad" allí arriba? Lo encontré gracioso. Además, el argumento 'priority' para' setProperty' no debe incluir '!', Pero la función acepta 'setProperty ('color', 'red! Important', null)' too (webkit al menos). –

0

Sh ¿Sería posible anular un setProperty (..., 'importante') o no? sí, debería. pero tiene que hacerlo con otra llamada ele.style.setProperty. eche un vistazo a this y debería ver red en todos los navegadores modernos.

Entonces, ¿qué navegadores siguen el estándar aquí? desde green se establece con !important, no debe reemplazarse con red ya que red no está configurado con !important. eso significa que Chrome, Safari e IE9 están siguiendo el estándar y que Firefox NO.

+0

Todo esto es correcto, pero se olvidó de que el problema es la interfaz DOM para modificar las declaraciones de estilo, no solo CSS. Este comportamiento es opuesto a la manipulación directa de la propiedad 'style', que no permite establecer'! Important'. –