Tengo problemas para aplicar un estilo que es !important
. He intentado:
$("#elem").css("width", "100px !important");
Esto no hace nada ; no se aplica ningún estilo de ancho. ¿Existe una forma jQuery-ish de aplicar dicho estilo sin tener que sobrescribir cssText
(lo que significaría que primero debería analizarlo, etc.)?
Editar : debo agregar que tengo una hoja de estilo con un !important
estilo que estoy tratando de anular con un !important
estilo en línea, por lo que usar .width()
y similares no funciona, ya que mi !important
estilo externo lo anula .
Además, se calcula el valor que anulará el valor anterior , por lo que no puedo simplemente crear otro estilo externo.
javascript
jquery
html
css
mkoryak
fuente
fuente
.css
y!important
en el núcleo jQuery. El error se cerró como "no se solucionará". Sin embargo, el caso de prueba de ese error no era tan restrictivo como el de esta pregunta: el caso de prueba no tenía un!important
estilo en línea que intentaba anular. Por lo tanto, la solución propuesta en ese error no funcionará en este caso.Respuestas:
El problema se debe a que jQuery no comprende el
!important
atributo y, como tal, no aplica la regla.Es posible que pueda solucionar ese problema y aplicar la regla al referirse a él a través de
addClass()
:O al usar
attr()
:Sin embargo, este último enfoque desarmaría cualquier regla de estilo en línea previamente establecida. Así que úsalo con cuidado.
Por supuesto, hay un buen argumento de que el método de @Nick Craver es más fácil / más sabio.
El
attr()
enfoque anterior se modificó ligeramente para preservar lastyle
cadena / propiedades originales y se modificó según lo sugerido por falko en un comentario:fuente
'undefinedwidth: 100px !important;'
cuando el estilo actual esté vacío.Creo que he encontrado una solución real. Lo convertí en una nueva función:
jQuery.style(name, value, priority);
Puede usarlo para obtener valores con
.style('name')
igual.css('name')
, obtener CSSStyleDeclaration con.style()
, y también establecer valores, con la capacidad de especificar la prioridad como 'importante'. Mira esto .Manifestación
Aquí está la salida:
La función
Consulte esto para ver ejemplos de cómo leer y establecer los valores CSS. Mi problema era que ya había establecido
!important
el ancho en mi CSS para evitar conflictos con otro CSS de tema, pero los cambios que hice en el ancho en jQuery no se verían afectados ya que se agregarían al atributo de estilo.Compatibilidad
Para configurar con la prioridad usando la
setProperty
función, este artículo dice que hay soporte para IE 9+ y todos los demás navegadores. He intentado con IE 8 y ha fallado, por lo que desarrollé soporte para él en mis funciones (ver arriba). Funcionará en todos los demás navegadores que usan setProperty, pero necesitará mi código personalizado para funcionar en <IE 9.fuente
!important
en tus estilos, al menos para las cosas que vas a cambiar con jQuery ... siempre y cuando sean tus estilos. Si su código se ejecuta dentro de una página codificada por un estudiante que trabaja en torno a su ignorancia de las reglas de especificidad al aplicar!important
cada segundo estilo,!importants
tarde o temprano se va a meter en uno de estos .Puede establecer el ancho directamente usando
.width()
así:Actualizado para comentarios: también tiene esta opción, pero reemplazará todos los CSS en el elemento, así que no estoy seguro de que sea más viable:
fuente
$('#elem').css('cssText', $('#elem').css('cssText')+'width: 100px !important');
concat con el valor anteriorNota: el uso de Chrome puede devolver un error como:
Cambiar la línea para usar la
.removeProperty
función, como paraelem[0].style.removeProperty('width');
solucionar el problema.fuente
var = document.getElementById('elem');
y realiza los métodos de estilo en elem (en lugar de elem [0]). Salud.var style = document.getElementById('elem'); style.removeProperty('width'); style.setProperty('width, '100px', 'important')
.removeAttribute
. Parece ser un método solo para IE . El comentario de @mcoenca es correcto;.removeProperty
funciona bien. Es IE9 + según MSDNelem.next().get(0).style...
La respuesta de David Thomas describe una forma de uso
$('#elem').attr('style', …)
, pero advierte que su uso eliminará los estilos previamente establecidos en elstyle
atributo. Aquí hay una forma de usarattr()
sin ese problema:Como una función:
Aquí hay una demostración de JS Bin .
fuente
addStyleAttribute()
también podría modificarse para tomar los mismos parámetros que jQuery's.css()
. Por ejemplo, podría soportar llevar un mapa de propiedades CSS a sus valores. Si hiciera eso, básicamente volvería a implementarse.css()
con el!important
error corregido pero sin ninguna optimización.Después de leer otras respuestas y experimentar, esto es lo que funciona para mí:
Sin embargo, esto no funciona en IE 8 y versiones inferiores.
fuente
Puedes hacerlo:
Usando "cssText" como el nombre de la propiedad y lo que quiera agregar al CSS como su valor.
fuente
cssText
haya allí antes, por lo que no puede usarlo librementePuede lograr esto de dos maneras:
fuente
.prop()
función se agregó en jQuery v1.6 y funcionará en Chrome ... esto se cita desde la página de utilería: antes de jQuery 1.6, el.attr()
método a veces tenía en cuenta los valores de propiedad al recuperar algunos atributos, lo que podría causar un comportamiento inconsistente. A partir de jQuery 1.6, el.prop()
método proporciona una forma de recuperar explícitamente los valores de propiedad, mientras.attr()
recupera los atributos.No es necesario ir a la complejidad de la respuesta de @ AramKocharyan, ni la necesidad de insertar dinámicamente ninguna etiqueta de estilo.
Simplemente sobrescribe el estilo, pero no tienes que analizar nada, ¿por qué lo harías?
No se puede usar
removeProperty()
, porque no eliminará las!important
reglas en Chrome.No se puede usar
element.style[property] = ''
, porque solo acepta camelCase en Firefox.Probablemente podría acortar esto con jQuery, pero esta función vainilla se ejecutará en navegadores modernos, Internet Explorer 8, etc.
fuente
Esto es lo que hice después de encontrar este problema ...
fuente
Esta solución no anula ninguno de los estilos anteriores, solo aplica el que necesita:
fuente
Si no es tan relevante y ya que se trata de un elemento que lo es
#elem
, puede cambiar su identificación a otra y darle el estilo que desee ...Y en tu CSS:
fuente
En lugar de usar la
css()
función, pruebe laaddClass()
función:fuente
La mejor y más fácil solución para este problema fue simplemente usar addClass () en lugar de .css () o .attr ().
Por ejemplo:
$('#elem').addClass('importantClass');
Y en tu archivo CSS:
fuente
Para su información, no funciona porque jQuery no lo admite. Hubo un ticket archivado en 2012 ( # 11173 $ (elem) .css ("propiedad", "valor! Importante") falla ) que finalmente se cerró como WONTFIX.
fuente
La mayoría de estas respuestas ahora están desactualizadas, el soporte de IE7 no es un problema.
La mejor manera de hacer esto que sea compatible con IE11 + y todos los navegadores modernos es:
O si lo desea, puede crear un pequeño complemento jQuery que haga esto. Este complemento coincide estrechamente con el
css()
método propio de jQuery en los parámetros que admite:Ejemplo jsfiddle aquí .
fuente
Primero necesitamos eliminar el estilo anterior. Lo elimino usando una expresión regular. Aquí hay un ejemplo para cambiar de color:
fuente
$selector.css('cssText','margin-bottom: 0 !important')
Una forma alternativa de agregar estilo en la cabeza:
Esto agrega estilo después de todos sus archivos CSS, por lo que tendrá mayor prioridad que otros archivos CSS y se aplicará.
fuente
Puede ser que se vea así:
Cache
Establecer CSS
Eliminar CSS
fuente
Creo que funciona bien y puede sobrescribir cualquier otro CSS antes (esto: elemento DOM):
fuente
Hazlo asi:
fuente
Esta solución dejará todos los javascript calculados y agregará la etiqueta importante al elemento: puede hacerlo (Ej. Si necesita establecer el ancho con la etiqueta importante)
fuente
Tres ejemplos de trabajo
Tuve una situación similar, pero usé .find () después de luchar con .closest () durante mucho tiempo con muchas variaciones.
El código de ejemplo
Alternativa
Trabajo: http://jsfiddle.net/fx4mbp6c/
fuente
.indexOf()
función con algo que sea más compatible con todos los navegadores. Uso, más bien,.match()
o en.test()
lugar de.indexOf()
var contents =
?Puede o no ser apropiado para su situación, pero puede utilizar selectores CSS para muchos de estos tipos de situaciones.
Si, por ejemplo, desea que las instancias tercera y sexta de .cssText tengan un ancho diferente, puede escribir:
O:
fuente
.cssText
.:nth-of-type()
no hace lo que crees que hace. Ver aquí para una explicación.li
elementos. Todos son del mismo tipo de elementoli
, que es de lo que trata el selector. Si mezclara diferentes elementos en el mismo padre, entonces:nth-of-type()
se comportaría de manera diferente, especialmente una vez que agregue un selector de clase a la mezcla.Supongo que lo intentaste sin agregar
!important
?CSS en línea (que es cómo JavaScript agrega estilo) anula la hoja de estilo CSS. Estoy bastante seguro de que ese es el caso incluso cuando la regla CSS de la hoja de estilo tiene
!important
.Otra pregunta (quizás una pregunta estúpida, pero debe hacerse): ¿Es el elemento en el que está tratando de trabajar
display:block;
odisplay:inline-block;
?Sin conocer su experiencia en CSS ... los elementos en línea no siempre se comportan como cabría esperar.
fuente
Podemos usar setProperty o cssText para agregar
!important
a un elemento DOM usando JavaScript.Ejemplo 1:
Ejemplo 2
fuente
También descubrí que ciertos elementos o complementos (como Bootstrap) tienen algunos casos de clase especiales en los que no funcionan bien
!important
u otras soluciones como.addClass/.removeClass
, por lo que debe / desactivarlos.Por ejemplo, si usa algo como
<table class="table-hover">
la única forma de modificar con éxito elementos como los colores de las filas es activartable-hover
/ desactivar la clase, de esta manera$(your_element).closest("table").toggleClass("table-hover");
¡Esperemos que esta solución sea útil para alguien! :)
fuente
Tuve el mismo problema al tratar de cambiar el color del texto de un elemento de menú cuando "evento". La mejor manera que encontré cuando tuve este mismo problema fue:
Primer paso: Cree, en su CSS, una nueva clase con este propósito, por ejemplo:
Último paso: aplique esta clase utilizando el método addClass de la siguiente manera:
Problema resuelto.
fuente
La solución más segura para esto es agregar una clase y luego hacer la magia en CSS :-),
addClass()
yremoveClass()
debería hacer el trabajo.fuente
https://jsfiddle.net/xk6Ut/256/
Un enfoque alternativo es crear y actualizar dinámicamente la clase CSS en JavaScript. Para hacer eso, podemos usar el elemento de estilo y necesitamos emplear la ID para el elemento de estilo para que podamos actualizar la clase CSS
...
fuente