是否可以使用jQuery删除内联样式?


236

jQuery插件正在应用内联样式(display:block)。我很懒,想用来替代它display:none

最好的(懒惰)方式是什么?


79
在SO上寻求帮助:)
Dave Swersky 2010年

15
最佳方式和惰性方式不一定相同。
乔尔2010年

1
我经常听到这样的论点,即最好的开发人员是懒惰的... blog.codinghorror.com/how-to-be-lazy-dumb-and-successful
kaelle

两种方法都可以使用removeAttr()或.css()实现此目标,请参考codepedia.info/jquery-remove-inline-style
Satinder singh

Answers:


381

更新:尽管以下解决方案有效,但是有一种更简单的方法。见下文。


这是我想出的,我希望这对您或其他任何人都派上用场:

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

这将删除该内联样式。

我不确定这是您想要的。您想覆盖它,正如已经指出的那样,它很容易通过来完成$('#element').css('display', 'inline')

我正在寻找的是一种完全删除嵌入式样式的解决方案。我正在编写的插件需要这个,我必须在其中临时设置一些内联CSS值,但以后要删除它们;我希望样式表重新获得控制权。我可以通过存储所有原始值,然后再将它们放回内联来做到这一点,但是这种解决方案对我来说感觉更干净。


这是插件格式:

(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));

如果您在脚本之前的页面中包含此插件,则只需调用

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

这应该可以解决问题。


更新:我现在意识到这一切都是徒劳的。您可以简单地将其设置为空白:

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

它将自动为您删除。

这是来自docs的引文:

将样式属性的值设置为空字符串(例如$('#mydiv').css('color', '')),如果该属性已被直接应用(无论是在HTML样式属性中,通过jQuery的.css()方法还是通过对样式属性的直接DOM操作),则将从元素中删除该属性。但是,它不会删除样式表或<style>元素中已应用CSS规则的样式。

我不认为jQuery在这里发挥了任何作用。看来style对象本身是这样做的


3
@ximi-谢谢你。我一直在考虑这个问题,因此我决定这不是浪费时间。可以采用它来检查内联样式,而jQuery目前尚不支持内联样式(.css('property')为您提供了值,但没有告诉您它是否来自内联样式)。
约瑟夫·西尔伯

我独立地得出了相同的结论-空字符串似乎可以满足我们的要求。该API尚未正式记录,但希望它将继续起作用。
Jon z

@Jonz-它正式记录(尽管我不知道它何时添加;我不记得在最初发布它时在那儿看到过它)。另外,我认为jQuery在这里没有做任何事情。本机style对象的行为似乎相同。我用此信息修改了答案。
约瑟夫·西尔伯

这是否适用于诸如字体系列之类的东西,或者-使正则表达式弄乱了吗?
TMH 2014年

4
@mosh-为什么不只使用$('#element').css('display', '')
约瑟夫·席尔伯

158

.removeAttr("style") 摆脱整个样式标签...

.attr("style") 测试值并查看是否存在内联样式...

.attr("style",newValue) 设置为其他


18
这将影响所有内联样式,而不仅仅是display
Slaks

1
听起来很不舒服,请尝试一下,让您知道,我通常不会使用内联样式,因此通常很高兴清除所有内联样式
Haroldo 2010年

11
@很好,这就是我所说的“摆脱整个样式标签”;)
heisenberg 2012年

你好 有没有一种方法可以检查从任何来源(例如内联样式),样式属性(例如font,b,strong,css文件等)到... $('*')是否已应用到某些...删除/重置任何内容还是仅重置所有一张照片?
米歇尔·帕特恩

由于单独删除每个内联样式不会删除(now-empty)style属性,因此仍然值得一提。
Brilliand

26

删除内联样式(由jQuery生成)的最简单方法是:

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

内联代码应消失,并且您的对象应采用CSS文件中预定义的样式。

为我工作!


13

您可以使用jQuery的css方法设置样式:

$('something:visible').css('display', 'none');

@Kobi:他在问任何内联样式。
Slaks

呃,什么?我可能不明白。我在想<div style="display:block;">$('div').hide()
科比

3
@Kobi:hide解决了一种修改内联样式的特殊情况。这个答案解决了所有情况。(hide/show也有一个限制,即切换两个值的两个。即none-> block或none-> inline。)
Joel

@Joel:hide/ show将记住的旧值display并正确还原它。
Slaks

@SLaks:太酷了。这一定是最近添加的,因为我记得以前遇到过麻烦。
乔尔2010年

12

您可以这样创建一个jquery插件:

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]);
        });
    };
})();

用法

$(".foo").removeInlineCss(); //remove all inline styles
$(".foo").removeInlineCss("display"); //remove one inline style
$(".foo").removeInlineCss("color font-size font-weight"); //remove several inline styles

1
这个答案包含一个非常简洁的单行技巧,即使没有jQuery也很有用,而且很多开发人员可能都不知道—调用elem.style.removeProperty('margin-left')只会margin-leftstyle属性中删除(并返回该属性的值)。对于IE6-8,它是elem.style.removeAttribute()
craigpatik '16

9

懒惰的方式(这将使未来的设计师诅咒您的名字并在您的睡眠中谋杀您):

#myelement 
{
    display: none !important;
}

免责声明:我不提倡这种方法,但这当然是懒惰的方法。


2
显然,这是对问题的最佳答案,因为它本着不良做法的精神“懒惰”。干杯!
ktamlyn 2013年



6

如果要删除样式属性内的属性(而不仅仅是将其设置为其他属性),请使用以下removeProperty()方法:

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

更新:
我进行了一个交互式提琴,以尝试使用不同的方法及其结果。显然set to empty stringset to faux value和之间没有太大区别removeProperty()。它们都会导致相同的后备–这是预先提供的CSS规则或浏览器的默认值。


5

如果display是样式中的唯一参数,则可以运行以下命令以删除所有样式:

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

意味着如果您的元素之前看起来像这样:

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

现在,您的元素将如下所示:

<input id="element" style="">


2

更改插件以不再应用样式。这比之后删除样式要好得多。


1
因此“懒惰”!不能发现它是哪个插件!
哈罗多

4
我不知道您如何定义懒惰,我只是回答了我将如何做。似乎有必要解决问题的根源,而不是在插件外部进行修补。那样做的话,我可以预见到混乱。
乔什·斯托多拉

哪一条路?如果您编辑插件,则更新到新版本后可能会遇到问题,这将覆盖您的更改并弄乱布局。谁会记得您在那一年左右的时间里做了一次小小的调整?除了修改插件源代码,我总是尝试寻找其他解决方案
Zefiryn

2

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

等等...

只需将第二个参数留空!


1
如果你们不赞成某件事,请发表评论。
他Nrik

1
我猜你得到了downvotes,因为你没有回答这个问题问"jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none"。尽管您的文本正确,但是您的代码无法解决问题。
Gone Coding

解决了我遇到的问题。Tnx。
yodalr'9

0

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

最初,我尝试删除CSS中的内联样式,但是它不起作用,并且新样式如display:不会覆盖任何样式。但是在JQuery中,它的工作原理是这样的。


0

我对width属性有类似的问题。我无法从代码中删除!important,并且由于它需要在新模板上使用此样式,因此我向该元素添加了一个Id(模态样式),然后我向该模板中添加了以下代码:

<script type="text/javascript">
    $('#modalstyling').css('width', '');    //Removal of width !important
    $('#modalstyling').width('75%');        //Set custom width
</script>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.