如何删除使用.css()函数添加的样式?


868

我正在使用jQuery更改CSS,并且希望删除基于输入值添加的样式:

if(color != '000000') $("body").css("background-color", color); else // remove style ?

我怎样才能做到这一点?
请注意,只要使用颜色选择器选择了颜色(即,当鼠标移至色轮上时),以上行就会运行。

第二注:我不能这样做,css("background-color", "none")因为它将从CSS文件中删除默认样式。
我只想删除jQuerybackground-color添加的内联样式。



最好根据您的功能尝试addClass / removeClass。这不会影响其他样式。
Prabhakaran

Answers:


1332

将属性更改为空字符串似乎可以完成此工作:

$.css("background-color", "");

4
@baacke当所谓的“标准”过时并且浪费大量开发时间时,这是一种可耻的事情。对于选择使用过时软件的公司,我几乎没有同情心,我不明白为什么我应该花更多的时间为他们开发软件。
andrewb 2014年

33
我必须在这里支持@baacke。我们的客户仍然具有IE6(!!)的官方最低要求。问题是,他们的客户遍布世界各地,包括欠发达国家。“客户的客户”可能正在使用非常古老的计算机与我们的客户进行业务往来。因此,至少必须至少对旧的浏览器提供最少的支持,否则他们就有失去业务的风险……
user1429080 2014年

8
你们不必为您为客户开发的任何解决方案设定要求。如果该客户想要或需要对较旧浏览器的支持,则需要为其提供服务。你们在谈论“谁在乎”会给真正的工程师一个坏名字。
Ed DeGagne 2014年

5
@EdDeGagne-您经常需要停止支持旧版本的IE。这样可以改善您的代码库,并鼓励访问者不要使用旧的IE。唯一困难的事情是弄清楚何时可以放弃支持。谷歌的网站有很多访问者,如果他们决定删除旧的IE,那么您可以相信他们,这是一个不错的决定。一家公司甚至告诉他们的用户,为每位老IE用户购买一台现代计算机,而不是保持他们的IE代码(这正是他们所提供的),这比他们付出的更多。
janko-m 2014年

5
当我看到“即使在Windows 7上,IE8仍然是标准的”,我停止阅读了
Capsule

544

可接受的答案有效,但是style在我的测试中DOM上留有空属性。没什么大不了的,但是这消除了这一切:

removeAttr( 'style' );

假定您要删除所有动态样式并返回样式表样式。


这是一个不错的主意,但在jQuery中存在错误,请参见提交的错误:bugs.jquery.com/ticket/9500
Tosh

4
@Tosh该缺陷是决心8/25/2011:bugs.jquery.com/...
ThinkingStiff

我知道,但至少在1.7版中它仍然存在问题,我还没有测试1.8
Tosh 2012年

7
这也将删除style属性中的所有其他属性。因此,明智地选择。
codingrhythm

1
这很聪明!可接受的答案不适用于jquery内联样式应覆盖css样式的情况,但是此方法在所有情况下均能正常工作。
Farzad YZ

170

有几种使用jQuery删除CSS属性的方法:

1.将CSS属性设置为其默认(初始)值

.css("background-color", "transparent")

请参阅MDN的CSS属性初始值。此处的默认值为transparent。您还可以使用inherit多个CSS属性从其父级继承属性。在CSS3 / CSS4中,您也可以使用initialrevert或者unset这些关键字可能对浏览器的支持有限。

2.删除CSS属性

空字符串将删除CSS属性,即

.css("background-color","")

但是要注意,如jQuery .css()文档中所指定的那样,这会删除该属性,但是它对某些CSS速记属性(包括background)与IE8存在兼容性问题。

将样式属性的值设置为空字符串,例如$('#mydiv')。css('color','')-如果该属性已被直接应用(无论是HTML样式),则会从元素中删除该属性属性,通过jQuery的.css()方法或通过对style属性的直接DOM操作。但是,它不会删除样式表或元素中已应用CSS规则的样式。警告:一个值得注意的例外是,对于IE 8及更低版本,删除快捷方式属性(例如border或background)将完全从元素中删除该样式,而不管样式表或element中的设置是什么

3.删除元素的整个样式

.removeAttr("style")

49

我有办法使用纯JavaScript删除样式属性,只是让您知道纯JavaScript的方法

var bodyStyle = document.body.style;
if (bodyStyle.removeAttribute)
    bodyStyle.removeAttribute('background-color');
else        
    bodyStyle.removeProperty('background-color');

11
这个家伙已经在使用jQuery ...为什么要重新实现跨浏览器方法!?!?
Billy

32
因为jquery并不是万能的,因为她或也许我应该说我们每个开发人员都应该知道兼容性的含义以及如何使用JavaScript之类的核心语言来完成这些工作,也许这是我已经建立了自己的框架的理论从我对JavaScript核心知识的了解来看,我拒绝使用其他事物,我有自己的概念和思维方式:)并且顺便感谢您的(-)我只需要成为增值:),而且顺便提一下,她不是一个名叫亚历克斯(Alex
吗?

1
我只想指出,如果不使用document.all,则不应对其进行检查。也许您应该这样检查:if(elm.style.removeProperty){elm.style.removeProperty(propertyName); } else if(elm.style.removeAttribute){elm.style.removeAttribute(attributeName); }
理查德(Richard)

好吧,你是对的,它应该像这样if(navigator.appName ==“ Microsoft Internet Explorer”)document.body.style.removeAttribute('background-color'); 否则document.body.style.removeProperty('background-color'); 而在另一方面你的解决方案是正确的太:)感谢您的来信
马尔

9
不,您绝对应该检查该功能是否存在,而不是检查浏览器。如果MS决定在下一版IE中更改功能名称怎么办?然后,您还去检查IE的版本吗?
2013年


19

这些jQuery函数中的任何一个都应该起作用:

$("#element").removeAttr("style");
$("#element").removeAttr("background-color") 

22
要仅删除一个CSS属性:var cssObject = $('selector').prop('style'); cssObject.removeProperty('background-color');
ilgaar 2013年

igaar-您的解决方案是最干净的。我将它放在“ .each”循环中,用于一堆表单元格,这些表单元格必须具有“ display:none”但必须保留其他属性。它完美无瑕地工作,只需移除显示屏即可:无显示,剩下的一切。
罗伯·冯·内塞罗德2014年

9

只需使用:

$('.tag-class').removeAttr('style');

要么

$('#tag-id').removeAttr('style');

这还将删除其他内联添加的样式,而不仅仅是颜色。
LongInt

7

怎么样:

var myCss = $(element).attr('css');
myCss = myCss.replace('background-color: '+$(element).css('background-color')+';', '');
if(myCss == '') {
  $(element).removeAttr('css');
} else {
  $(element).attr('css', myCss);
}

我喜欢这一个!您删除指定的属性,然后再删除其他任何内容。
2015年

7

使用我的插件:

$.fn.removeCss=function(all){
        if(all===true){
            $(this).removeAttr('class');
        }
        return $(this).removeAttr('style')
    }

对于您的情况,请按以下方式使用:

$(<mySelector>).removeCss();

要么

$(<mySelector>).removeCss(false);

如果您还想删除其类中定义的CSS:

$(<mySelector>).removeCss(true);

$(this).removeAttr是多余的,this.removeAttr应该足够了。
Emile Bergeron

是否removeAttr 也将删除classATTR?我不这么认为
Abdennour TOUMI,2016年

我说的是removeAttr您插件的内部,那里this已经是jQuery元素。$(this)是多余的。
Emile Bergeron

2
啊!好吧好吧.. @EmileBergeron,旧的jquery this作为HTMLElement映射到jQuery元素的实例提供了...如您所见,我的答案很旧...这就是原因。由于ES6中新增了箭头功能。.. this变得毫无用处,由event.currentTarget
Abdennour TOUMI

1
很公平!;)很有趣,JS世界3岁了。
Emile Bergeron

7

尝试这个:

$('#divID').css({"background":"none"});// remove existing

$('#divID').css({"background":"#bada55"});// add new color here.

谢谢


“删除现有”的唯一问题是,如果有一套,它还将覆盖样式表背景。
Jtbs

6

如果使用CSS样式,则可以使用:

$("#element").css("background-color","none"); 

然后替换为:

$("#element").css("background-color", color);

如果您不使用CSS样式,并且在HTML元素中具有属性,则可以使用:

$("#element").attr("style.background-color",color);



2

为什么不采用您希望删除CSS类的样式?现在您可以使用:.removeClass()。这也开辟了使用以下方法的可能性:.toggleClass()

(如果存在该类,则将其删除;如果不存在,则将其添加。)

在处理布局问题时,添加/删除类也不会造成更改/故障排除的混乱(相对于试图弄清为什么特定样式消失的原因)。


2
let el = document.querySelector(element)
let styles = el.getAttribute('style')

el.setAttribute('style', styles.replace('width: 100%', ''))

1

这比其他一些解决方案更为复杂,但在以下情况下可能会提供更大的灵活性:

1)制作一个类定义,以隔离(封装)您要有选择地应用/删除的样式。它可以为空(在这种情况下,可能应该是):

.myColor {}

2)使用这个代码,基于http://jsfiddle.net/kdp5V/167/这个答案gilly3

function changeCSSRule(styleSelector,property,value) {
    for (var ssIdx = 0; ssIdx < document.styleSheets.length; ssIdx++) {
        var ss = document.styleSheets[ssIdx];
        var rules = ss.cssRules || ss.rules;
        if(rules){
            for (var ruleIdx = 0; ruleIdx < rules.length; ruleIdx++) {
                var rule = rules[ruleIdx];
                if (rule.selectorText == styleSelector) {
                    if(typeof value == 'undefined' || !value){
                        rule.style.removeProperty(property);
                    } else {
                        rule.style.setProperty(property,value);
                    }
                    return; // stops at FIRST occurrence of this styleSelector
                }
            }
        }
    }
}

用法示例:http//jsfiddle.net/qvkwhtow/

注意事项:

  • 未经广泛测试。
  • 不能在新值中包含!important或其他指令。任何此类现有指令都将通过此操作丢失。
  • 仅更改第一次发现的styleSelector。不会添加或删除整个样式,但是可以通过更精细的操作来完成。
  • 任何无效/不可用的值将被忽略或引发错误。
  • 在Chrome中(至少),非本地(如跨站点)的CSS规则不会通过document.styleSheets对象公开,因此无法在它们上使用。记住此代码的“首次发现”行为,必须添加一个局部替代并对其进行操作。
  • 一般来说,document.styleSheets对操作不是特别友好,不要指望它能积极地使用。

通过这种方式隔离样式是CSS的全部目的,即使并非如此。操纵CSS规则并不是jQuery的全部目的,jQuery操纵DOM元素,并使用CSS选择器来做到这一点。


1

简单在Web开发中很便宜。我建议在删除特定样式时使用空字符串

$(element).style.attr = '  ';

1

尝试这个

$(".ClassName").css('color','');
Or 
$("#Idname").css('color','');
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.