É possível remover estilos embutidos com o jQuery?

236

Um plugin jQuery está aplicando um estilo embutido ( display:block). Estou com preguiça e quero substituí-lo display:none.

Qual é a melhor maneira (preguiçosa)?

Haroldo
fonte
79
Peça ajuda no SO :)
Dave Swersky
15
A melhor maneira e a preguiçosa não são necessariamente as mesmas.
Joel
1
Eu ouvi muitas vezes o argumento de que os melhores desenvolvedores são preguiçosos ...
kaelle
duas maneiras de obter i, e usando removeAttr () ou .css (), consulte codepedia.info/jquery-remove-inline-style
Satinder singh

Respostas:

381

Atualização: enquanto a seguinte solução funciona, há um método muito mais fácil. Ver abaixo.


Aqui está o que eu criei, e espero que isso seja útil - para você ou qualquer outra pessoa:

$('#element').attr('style', function(i, style)
{
    return style && style.replace(/display[^;]+;?/g, '');
});

Isso removerá esse estilo embutido.

Não tenho certeza se é isso que você queria. Você queria substituí-lo, o que, como já foi mencionado, é facilmente realizado $('#element').css('display', 'inline').

O que eu procurava era uma solução para REMOVER completamente o estilo embutido. Eu preciso disso para um plug-in que estou escrevendo, onde tenho que definir temporariamente alguns valores CSS embutidos, mas quero removê-los posteriormente; Quero que a folha de estilo retome o controle. Eu poderia fazer isso armazenando todos os seus valores originais e depois colocando-os de volta na linha, mas essa solução me parece muito mais limpa.


Aqui está no formato do plugin:

(function($)
{
    $.fn.removeStyle = function(style)
    {
        var search = new RegExp(style + '[^;]+;?', 'g');

        return this.each(function()
        {
            $(this).attr('style', function(i, style)
            {
                return style && style.replace(search, '');
            });
        });
    };
}(jQuery));

Se você incluir esse plug-in na página antes do seu script, poderá chamar

$('#element').removeStyle('display');

e isso deve fazer o truque.


Atualização : agora percebi que tudo isso é inútil. Você pode simplesmente configurá-lo para em branco:

$('#element').css('display', '');

e ele será removido automaticamente para você.

Aqui está uma citação dos documentos :

Definir o valor de uma propriedade de estilo como uma string vazia - por exemplo $('#mydiv').css('color', '')- remove essa propriedade de um elemento se já tiver sido aplicada diretamente, seja no atributo de estilo HTML, através do .css()método do jQuery ou através da manipulação direta DOM da propriedade de estilo. No entanto, ele não remove um estilo que foi aplicado com uma regra CSS em uma folha de estilo ou <style>elemento.

Eu não acho que o jQuery esteja fazendo nenhuma mágica aqui; parece que o styleobjeto faz isso de forma nativa .

Joseph Silber
fonte
3
@ximi - Obrigado cara. Eu estive pensando sobre isso e decidi que não era uma perda de tempo. Pode ser adotado para verificar estilos inline, para os quais atualmente não há suporte no jQuery ( .css('property')fornece o valor, mas não informa se veio de um estilo inline).
Joseph Silber
Cheguei à mesma conclusão de forma independente - a string vazia parece fazer exatamente o que queremos. Não está oficialmente documentado na API, mas espero que continue a funcionar.
Jon z
@Jonz - Ele está documentado oficialmente (embora eu não sei quando ele foi adicionado, eu não me lembro de vê-lo lá quando eu originalmente publicado este). Além disso, acho que o jQuery não está fazendo nada aqui. O styleobjeto nativo parece se comportar da mesma maneira. Eu alterei minha resposta com esta informação.
Joseph Silber
Isso funciona com coisas como família de fontes ou o - atrapalha o regex?
TMH
4
@mosh - Por que você não usa $('#element').css('display', '')?
Joseph Silber
158

.removeAttr("style") para se livrar de toda a etiqueta de estilo ...

.attr("style") para testar o valor e verificar se existe um estilo embutido ...

.attr("style",newValue) para configurá-lo para outra coisa

Heisenberg
fonte
18
Isso afetará todos os estilos embutidos, não apenas display.
SLaks
1
sons bom mal dar-lhe uma tentativa e que você saiba, eu nunca usar estilos inline normalmente tão felizes para limpar todos os estilos inline
Haroldo
11
@Slaks bem, isso é o que eu quis dizer com "se livrar de toda a tag estilo";)
Heisenberg
Oi. existe uma maneira de verificar se algum 'estilo' foi aplicado ao ... $ ('*'), de qualquer fonte como um estilo embutido, atribuindo estilo como fonte, b, forte, arquivo css. antes de tentar remover / redefinir qualquer coisa ou simplesmente redefinir todos um tiro?
Milche Patern
Como remover todos os estilos embutidos individualmente não remove o styleatributo (agora vazio) , isso ainda é digno de nota.
Brilliand
26

A maneira mais fácil de remover estilos embutidos (gerados pelo jQuery) seria:

$(this).attr("style", "");

O código embutido deve desaparecer e seu objeto deve adaptar o estilo predefinido nos seus arquivos CSS.

Trabalhou para mim!

Rick van 't Wout Hofland
fonte
13

Você pode definir o estilo usando o cssmétodo jQuery :

$('something:visible').css('display', 'none');
SLaks
fonte
@Kobi: Ele está perguntando sobre qualquer estilo embutido.
SLaks
errar o que? Eu provavelmente não entendo alguma coisa. Estou pensando <div style="display:block;">, $('div').hide().
Kobi
3
@Kobi: hideaborda um caso especial de modificação de estilos embutidos. Esta resposta aborda todos os casos. ( hide/showTambém têm uma limitação como dois que dois valores são alternados ou seja None-> bloco ou None-> in-line..)
Joel
@ Joel: hide/ showlembrará o valor antigo displaye o restaurará corretamente.
SLaks
@ Slaks: Legal. Isso deve ter sido adicionado recentemente, como me lembro de ter tido problemas com isso antes.
Joel
12

você pode criar um plugin jquery como este:

jQuery.fn.removeInlineCss = (function(){
    var rootStyle = document.documentElement.style;
    var remover = 
        rootStyle.removeProperty    // modern browser
        || rootStyle.removeAttribute   // old browser (ie 6-8)
    return function removeInlineCss(properties){
        if(properties == null)
            return this.removeAttr('style');
        proporties = properties.split(/\s+/);
        return this.each(function(){
            for(var i = 0 ; i < proporties.length ; i++)
                remover.call(this.style, proporties[i]);
        });
    };
})();

uso

$(".foo").removeInlineCss(); //remove all inline styles
$(".foo").removeInlineCss("display"); //remove one inline style
$(".foo").removeInlineCss("color font-size font-weight"); //remove several inline styles
Yukulélé
fonte
1
Esta resposta contém um truque de uma linha muito interessante que é útil mesmo sem jQuery e que muitos desenvolvedores talvez não conheçam - a chamada elem.style.removeProperty('margin-left')será removida apenas margin-leftdo styleatributo (e retornará o valor dessa propriedade). Para o IE6-8 é elem.style.removeAttribute().
22416
9

A maneira preguiçosa (que fará com que futuros designers amaldiçoem seu nome e o matem enquanto dorme):

#myelement 
{
    display: none !important;
}

Isenção de responsabilidade: não defendo essa abordagem, mas certamente é o caminho preguiçoso.

Joel
fonte
2
Esta é claramente a melhor resposta para a pergunta, porque está no espírito da má prática "preguiçosa". Felicidades!
precisa saber é o seguinte
6
$('div[style*=block]').removeAttr('style');
antpaw
fonte
Que tal apenas $ ('div [style]'). RemoveAttr ('style') ;?
skybondsor
@skybondsor não iria removê-lo apenas para os elementos de bloco, como ele queria
antpaw
Ah sim. Eu pensei que ele queria remover estilos embutidos de tudo.
skybondsor
6
$("[style*=block]").hide();
David Morton
fonte
6

Se você deseja remover uma propriedade dentro de um atributo de estilo - e não apenas configurá-la para outra coisa -, use o removeProperty()método:

document.getElementById('element').style.removeProperty('display');

ATUALIZAÇÃO:
Eu criei um violino interativo para brincar com os diferentes métodos e seus resultados. Aparentemente, não há muita diferença entre set to empty string, set to faux valuee removeProperty(). Todos eles resultam no mesmo fallback - que é uma regra CSS predefinida ou o valor padrão do navegador.

WoodrowShigeru
fonte
5

Caso a exibição seja o único parâmetro do seu estilo, você pode executar este comando para remover todo o estilo:

$('#element').attr('style','');

Significa que, se seu elemento tivesse a seguinte aparência:

<input id="element" style="display: block;">

Agora seu elemento ficará assim:

<input id="element" style="">
paulalexandru
fonte
3

Aqui está um filtro seletor inlineStyle que escrevi que se conecta ao jQuery.

$("div:inlineStyle(display:block)") // will select all divs with an inline style of display: block set

No seu caso, você pode usar isso como:

$("div:inlineStyle(display:block)").hide();
Corban Brook
fonte
2

Altere o plug-in para não aplicar mais o estilo. Isso seria muito melhor do que remover o estilo depois.

Josh Stodola
fonte
1
daí o 'preguiçoso'! Não é possível descobrir qual bit de qual plugin é!
Haroldo
4
Não sei como você define preguiçoso, apenas respondi como faria isso. Parece fazer sentido corrigir o problema onde ele se origina, em vez de corrigir as coisas fora do plug-in. Prevejo bagunças ao fazê-lo dessa maneira.
Josh Stodola
Qual caminho? Se você editar o plug-in, poderá ter problemas após atualizar para a nova versão, que substituirá sua alteração e estragará o layout. Quem se lembrará daqui a um ano ou mais que você fez aquele pequeno ajuste lá? Eu sempre tentar encontrar outra solução de modificar o código-fonte plug-in
Zefiryn
2

$el.css({ height : '', 'margin-top' : '' });

etc ...

Apenas deixe o segundo param em branco!

Bert
fonte
1
Se vocês votarem em algo negativo, por favor, deixe um comentário.
He Nrik
1
Eu acho que você tem os downvotes porque você não respondeu a pergunta : "jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none". Embora seu texto esteja correto, seu código não resolve a questão.
Gone Coding
Resolvi o problema que eu tinha. Tnx.
yodalr
0

$("#element").css({ display: "none" });

No começo, tentei remover o estilo embutido no css, mas ele não funciona e o novo estilo como a exibição: nenhum será substituído. Mas no JQuery funciona assim.

Cocoa3338
fonte
0

Eu tive um problema semelhante com a propriedade width. Eu não consegui remover o! Important do código, e como ele precisava desse estilo em um novo modelo, adicionei um ID (modalstyling) ao elemento e depois adicionei o seguinte código ao modelo:

<script type="text/javascript">
    $('#modalstyling').css('width', '');    //Removal of width !important
    $('#modalstyling').width('75%');        //Set custom width
</script>
Mbotet
fonte