Estou tendo problemas para aplicar um estilo que seja !important
. Eu tentei:
$("#elem").css("width", "100px !important");
Isso não faz nada ; nenhum estilo de largura é aplicado. Existe uma maneira jQuery-ish de aplicar esse estilo sem precisar sobrescrever cssText
(o que significaria que eu precisaria analisá-lo primeiro etc.)?
Editar : devo acrescentar que tenho uma folha de estilo com um !important
estilo que estou tentando substituir por um !important
estilo embutido, portanto, o uso .width()
e similares não funcionam, pois são substituídos pelo meu !important
estilo externo .
Além disso, o valor que substituirá o valor anterior é calculado , portanto não posso simplesmente criar outro estilo externo.
javascript
jquery
html
css
mkoryak
fonte
fonte
.css
e!important
no núcleo do jQuery. O bug foi fechado como "não será corrigido". No entanto, o caso de teste desse bug não era tão restritivo quanto o desta pergunta - o caso de teste não tinha um!important
estilo embutido que estava tentando substituir. Portanto, a solução proposta nesse bug não funcionará neste caso.Respostas:
O problema é causado pelo jQuery não entender o
!important
atributo e, como tal, falha ao aplicar a regra.Você pode solucionar esse problema e aplicar a regra consultando-a através de
addClass()
:Ou usando
attr()
:A última abordagem desabilitaria as regras de estilo em linha definidas anteriormente. Portanto, use com cuidado.
Claro, há um bom argumento de que o método de @Nick Craver é mais fácil / mais sábio.
A
attr()
abordagem acima foi modificada levemente para preservar astyle
cadeia / propriedades originais e modificada conforme sugerido por falko em um comentário:fonte
'undefinedwidth: 100px !important;'
quando o estilo atual estiver vazio.Eu acho que encontrei uma solução real. Eu fiz isso em uma nova função:
jQuery.style(name, value, priority);
Você pode usá-lo para obter valores
.style('name')
como.css('name')
, obter CSSStyleDeclaration.style()
e também definir valores - com a capacidade de especificar a prioridade como 'importante'. Veja isso .Demo
Aqui está a saída:
A função
Veja isso para exemplos de como ler e definir os valores CSS. Meu problema foi que eu já havia definido
!important
a largura do meu CSS para evitar conflitos com outro tema do CSS, mas quaisquer alterações feitas na largura do jQuery não seriam afetadas, pois seriam adicionadas ao atributo style.Compatibilidade
Para definir com prioridade usando a
setProperty
função, este artigo diz que há suporte para o IE 9+ e todos os outros navegadores. Eu tentei com o IE 8 e ele falhou, e é por isso que criei suporte para ele em minhas funções (veja acima). Ele funcionará em todos os outros navegadores usando setProperty, mas precisará do meu código personalizado para funcionar no <IE 9.fonte
!important
em seus estilos, pelo menos para as coisas que você vai mudar com o jQuery ... Desde que sejam seus estilos. Se o seu código for executado em uma página codificada por um aluno que resolve sua ignorância sobre as regras de especificidade, aplicando!important
cada segundo estilo, você começará a entrar em um desses!importants
itens mais cedo ou mais tarde.Você pode definir a largura diretamente usando o
.width()
seguinte:Atualizado para comentários: você também tem essa opção, mas ela substituirá todos os css no elemento, portanto, não tenha certeza se é mais viável:
fonte
$('#elem').css('cssText', $('#elem').css('cssText')+'width: 100px !important');
concat-lo com o valor anteriorNota: O uso do Chrome pode retornar um erro como:
Alterando a linha para usar a
.removeProperty
função, como paraelem[0].style.removeProperty('width');
corrigir o problema.fonte
var = document.getElementById('elem');
e executar os métodos de estilo no elem (ao contrário de elem [0]). Felicidades.var style = document.getElementById('elem'); style.removeProperty('width'); style.setProperty('width, '100px', 'important')
.removeAttribute
. Parece ser um método apenas para o IE . O comentário do @mcoenca está certo;.removeProperty
funciona bem. É IE9 + de acordo com o MSDNelem.next().get(0).style...
A resposta de David Thomas descreve uma maneira de usar
$('#elem').attr('style', …)
, mas alerta que o uso excluirá estilos definidos anteriormente nostyle
atributo. Aqui está uma maneira de usarattr()
sem esse problema:Como uma função:
Aqui está uma demonstração do JS Bin .
fonte
addStyleAttribute()
também pode ser modificado para obter os mesmos parâmetros que os do jQuery.css()
. Por exemplo, ele poderia suportar o mapeamento de propriedades CSS para seus valores. Se você fizesse isso, basicamente seria reimplementado.css()
com o!important
bug corrigido, mas sem nenhuma otimização.Depois de ler outras respostas e experimentar, é isso que funciona para mim:
Isso não funciona no IE 8 e abaixo, no entanto.
fonte
Você consegue fazer isso:
Usando "cssText" como o nome da propriedade e o que você deseja adicionar ao CSS como seu valor.
fonte
cssText
estava lá antes - para que você não pode realmente usá-lo livrementeVocê pode conseguir isso de duas maneiras:
fonte
.prop()
função foi adicionada no jQuery v1.6 e funcionará no Chrome ... isso é citado na página prop: Antes do jQuery 1.6, o.attr()
método às vezes considerava os valores das propriedades ao recuperar alguns atributos, o que poderia causar um comportamento inconsistente. A partir do jQuery 1.6, o.prop()
método fornece uma maneira de recuperar explicitamente os valores das propriedades, enquanto.attr()
recupera atributos.Não há necessidade de ir para a complexidade da resposta do @ AramKocharyan, nem a necessidade de inserir tags de estilo dinamicamente.
Basta substituir o estilo, mas você não precisa analisar nada, por que faria?
Não é possível usar
removeProperty()
, porque não removerá!important
regras no Chrome.Não é possível usar
element.style[property] = ''
, porque ele aceita apenas camelCase no Firefox.Você provavelmente poderia diminuir isso com o jQuery, mas essa função básica será executada em navegadores modernos, no Internet Explorer 8, etc.
fonte
Aqui está o que eu fiz depois de encontrar esse problema ...
fonte
Esta solução não substitui nenhum dos estilos anteriores, apenas aplica o que você precisa:
fonte
Se não for tão relevante, e como você está lidando com um elemento que é
#elem
, você pode alterar o ID dele para outra coisa e estilizá-lo como desejar ...E no seu CSS:
fonte
Em vez de usar a
css()
função, tente aaddClass()
função:fonte
A melhor e mais fácil solução para esse problema foi usar addClass () em vez de .css () ou .attr ().
Por exemplo:
$('#elem').addClass('importantClass');
E no seu arquivo CSS:
fonte
Para sua informação, não funciona porque o jQuery não suporta. Houve um ticket arquivado em 2012 ( falha no # 11173 $ (elem) .css ("property", "value! Important") ) que acabou sendo fechado como WONTFIX.
fonte
A maioria dessas respostas agora está desatualizada, o suporte ao IE7 não é um problema.
A melhor maneira de fazer isso que suporta o IE11 + e todos os navegadores modernos é:
Ou, se desejar, você pode criar um pequeno plugin jQuery que faz isso. Este plug-in corresponde ao
css()
método do jQuery nos parâmetros que ele suporta:Exemplo de jsfiddle aqui .
fonte
Primeiro precisamos remover o estilo anterior. Eu o removo usando uma expressão regular. Aqui está um exemplo para mudar de cor:
fonte
$selector.css('cssText','margin-bottom: 0 !important')
Uma maneira alternativa de acrescentar estilo na cabeça:
Isso acrescenta estilo a todos os seus arquivos CSS, para que ele tenha maior prioridade que outros arquivos CSS e seja aplicado.
fonte
Pode ser assim:
Cache
Definir CSS
Remover CSS
fonte
Eu acho que funciona bem e pode substituir qualquer outro CSS antes (este: elemento DOM):
fonte
Faça isso deste modo:
fonte
Esta solução deixará todo o javascript calculado e adicionará a tag importante ao elemento: Você pode fazer (Ex, se precisar definir a largura com a tag importante)
fonte
Três exemplos de trabalho
Eu tive uma situação semelhante, mas usei .find () depois de lutar com .closest () por um longo tempo com muitas variações.
O código de exemplo
Alternativa
Trabalho: http://jsfiddle.net/fx4mbp6c/
fonte
.indexOf()
função por algo que seja mais compatível com vários navegadores. Use, em vez disso,.match()
ou em.test()
vez de.indexOf()
var contents =
?Pode ou não ser apropriado para sua situação, mas você pode usar seletores CSS para muitos desses tipos de situações.
Se, por exemplo, você deseja que a 3ª e a 6ª instâncias do .cssText tenham uma largura diferente, você pode escrever:
Ou:
fonte
.cssText
.:nth-of-type()
não faz o que você pensa que faz. Veja aqui uma explicação.li
elementos. Eles são todos do mesmo tipo de elementoli
, com o qual o seletor lida. Se você misturasse elementos diferentes no mesmo pai,:nth-of-type()
teria um comportamento diferente, especialmente quando você adicionasse um seletor de classe ao mix.Eu diria que você tentou sem adicionar
!important
?CSS embutido (que é como o JavaScript adiciona estilo) substitui o CSS da folha de estilo. Tenho certeza de que é esse o caso, mesmo quando a regra CSS da folha de estilo tem
!important
.Outra pergunta (talvez uma pergunta estúpida, mas deve ser feita.): É o elemento em que você está tentando trabalhar
display:block;
oudisplay:inline-block;
?Não conhecendo sua experiência em CSS ... os elementos embutidos nem sempre se comportam como você esperaria.
fonte
Podemos usar setProperty ou cssText para adicionar
!important
a um elemento DOM usando JavaScript.Exemplo 1:
Exemplo 2:
fonte
Também descobri que certos elementos ou complementos (como o Bootstrap) têm alguns casos especiais de classe em que eles não funcionam bem
!important
ou outras soluções alternativas.addClass/.removeClass
, e, portanto, é necessário ativá-los / desativá-los.Por exemplo, se você usar algo como
<table class="table-hover">
a única maneira de modificar com êxito elementos como cores de linhas é ativartable-hover
/ desativar a classe, desta forma$(your_element).closest("table").toggleClass("table-hover");
Espero que essa solução alternativa seja útil para alguém! :)
fonte
Eu tive o mesmo problema ao tentar alterar a cor do texto de um item de menu quando "evento". A melhor maneira que encontrei quando tive esse mesmo problema foi:
Primeira etapa: crie, em seu CSS, uma nova classe com esse objetivo, por exemplo:
Última etapa: aplique esta classe usando o método addClass da seguinte maneira:
Problema resolvido.
fonte
A solução mais segura para isso é adicionar uma classe e fazer a mágica em CSS :-),
addClass()
eremoveClass()
deve fazer o trabalho.fonte
https://jsfiddle.net/xk6Ut/256/
Uma abordagem alternativa é criar e atualizar dinamicamente a classe CSS em JavaScript. Para fazer isso, podemos usar o elemento style e precisamos empregar o ID para o elemento style, para que possamos atualizar a classe CSS
...
fonte