如何使用.css()应用!important?


734

我在应用的样式时遇到了麻烦!important。我试过了:

$("#elem").css("width", "100px !important");

什么都不做 ; 不会应用任何宽度样式。有没有一种类似jQuery的方式就可以应用这种样式而无需覆盖cssText(这意味着我需要首先对其进行解析等)?

编辑:我应该补充一点,我有一个样式表,该!important样式表尝试使用!important样式内联样式覆盖,因此使用.width()等不起作用,因为它被我的外部!important样式覆盖。

此外,将覆盖以前的值的值进行计算,所以我不能简单地创建另一个外部风格。


值得注意的是,这实际上在Chrome(至少对我而言)中有效,但在Firefox中则无效。
Peter Jaric

这在Chrome 17.x和Safari 5.1.1中也适用,但在FF 8.0中不适用。
DavidJ

在使用JQuery 1.8.2的Chromium 20.0.x上对我不起作用。
阿尔巴·门德斯

7
jQuery的错误#11173正要固定.css!importantjQuery的核心。该错误被关闭为“无法修复”。但是,该bug的测试用例没有此问题中的约束那么严格–测试用例没有!important试图覆盖的内联样式。因此,在这种情况下,该bug的建议解决方法将不起作用。
罗里·奥肯

2
使用CSS或jquery可能覆盖Overrideing!important的重复-虽然这个年龄较大,并且票数更高,但另一个却得到了最清晰,最有价值的答案。
杰森C

Answers:


603

问题是由jQuery无法理解!important属性引起的,因此无法应用规则。

您可能可以解决该问题,并通过引用它来应用规则addClass()

.importantRule { width: 100px !important; }

$('#elem').addClass('importantRule');

或使用attr()

$('#elem').attr('style', 'width: 100px !important');

但是,后一种方法将取消设置任何先前设置的内联样式规则。因此,请谨慎使用。

当然,有一个很好的论据,即@Nick Craver的方法更容易/更明智。

上面的attr()方法稍作修改以保留原始style字符串/属性,并按照falko在评论中的建议进行了修改:

$('#elem').attr('style', function(i,s) { return (s || '') + 'width: 100px !important;' });

2
我倾向于您的后一种方法,但是令我感到可悲的是,我可能无法解析以前的cssText,因为我不能只丢弃它而已
mkoryak 2010年

1
啊,抱歉无法理解,有时英语幽默超出了我的理解... :)
Sinan 2010年

1
嵌套引号('“ width:100px!important”')是什么?这对我不起作用,但是当我删除内部引号时,它起作用了。谢谢!
Peter Jaric

15
样式为空时的小修正:$('#elem')。attr('style',function(i,s){return(s ||'')+'width:100px!important;'});
falko

4
您应该添加@falko的修复程序,因为在firefox中,'undefinedwidth: 100px !important;'当当前样式为空时,您的最后一个代码片段会将样式设置为。
acdcjunior 2014年

332

我想我找到了一个真正的解决方案。我把它变成了一个新函数:

jQuery.style(name, value, priority);

你可以用它来获取值.style('name')一样.css('name'),获得与CSSStyleDeclaration上.style(),并设置值-有能力来指定优先级为“重要”。看到这个

演示版

var div = $('someDiv');
console.log(div.style('color'));
div.style('color', 'red');
console.log(div.style('color'));
div.style('color', 'blue', 'important');
console.log(div.style('color'));
console.log(div.style().getPropertyPriority('color'));

这是输出:

null
red
blue
important

功能

(function($) {    
  if ($.fn.style) {
    return;
  }

  // Escape regex chars with \
  var escape = function(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  };

  // For those who need them (< IE 9), add support for CSS functions
  var isStyleFuncSupported = !!CSSStyleDeclaration.prototype.getPropertyValue;
  if (!isStyleFuncSupported) {
    CSSStyleDeclaration.prototype.getPropertyValue = function(a) {
      return this.getAttribute(a);
    };
    CSSStyleDeclaration.prototype.setProperty = function(styleName, value, priority) {
      this.setAttribute(styleName, value);
      var priority = typeof priority != 'undefined' ? priority : '';
      if (priority != '') {
        // Add priority manually
        var rule = new RegExp(escape(styleName) + '\\s*:\\s*' + escape(value) +
            '(\\s*;)?', 'gmi');
        this.cssText =
            this.cssText.replace(rule, styleName + ': ' + value + ' !' + priority + ';');
      }
    };
    CSSStyleDeclaration.prototype.removeProperty = function(a) {
      return this.removeAttribute(a);
    };
    CSSStyleDeclaration.prototype.getPropertyPriority = function(styleName) {
      var rule = new RegExp(escape(styleName) + '\\s*:\\s*[^\\s]*\\s*!important(\\s*;)?',
          'gmi');
      return rule.test(this.cssText) ? 'important' : '';
    }
  }

  // The style function
  $.fn.style = function(styleName, value, priority) {
    // DOM node
    var node = this.get(0);
    // Ensure we have a DOM node
    if (typeof node == 'undefined') {
      return this;
    }
    // CSSStyleDeclaration
    var style = this.get(0).style;
    // Getter/Setter
    if (typeof styleName != 'undefined') {
      if (typeof value != 'undefined') {
        // Set style property
        priority = typeof priority != 'undefined' ? priority : '';
        style.setProperty(styleName, value, priority);
        return this;
      } else {
        // Get style property
        return style.getPropertyValue(styleName);
      }
    } else {
      // Get CSSStyleDeclaration
      return style;
    }
  };
})(jQuery);

请参见有关如何读取和设置CSS值的例子。我的问题是,我已经!important在CSS中设置了宽度以避免与其他主题CSS发生冲突,但是我对jQuery中的宽度所做的任何更改都不会受到影响,因为它们将被添加到style属性中。

兼容性

为了使用setProperty功能设置优先级,本文说支持IE 9+和所有其他浏览器。我尝试使用IE 8,但失败了,这就是为什么我在函数中建立了对它的支持(请参见上文)。它可以在使用setProperty的所有其他浏览器上运行,但是需要我的自定义代码才能在<IE 9中运行。


您在其他浏览器上测试过吗?
mkoryak 2012年

2
还有几年前发布的jQuery.important插件。我使用它在生产中只有一个小问题(见他们的问题标签。
colllin

14
$('.someclass').each(function(){this.style.setProperty('border','none','important');}); stackoverflow.com/questions/11962962/… 更简单,更清洁,更高效。

3
解决此问题的唯一好方法是使用类,而不是直接样式注入。
理查德

3
@Richard,解决此问题的唯一好方法是不要!important在您的样式中使用,至少在您要使用jQuery进行更改的情况下……只要它们是您的样式即可。如果您的代码运行在某个学生编码的页面中,而该学生通过打!important第二种样式来解决他对特定性规则的无知,那么您!importants迟早会首先涉足其中一种。
Septagram 2014年

149

您可以.width()像这样直接设置宽度:

$("#elem").width(100);

已更新,以获取评论: 您也具有此选项,但是它将替换元素上的所有css,因此不确定它是否更可行:

$('#elem').css('cssText', 'width: 100px !important');

好的,我举个例子,我关心的是设置!important。
mkoryak 2010年

1
我也编辑了问题以更好地反映我的情况。.基本上,我有一个外部!important宽度,该宽度设置为某些错误,必须覆盖内联。宽度()不工作,因为这个原因
mkoryak

@mkoryak-更新了唯一的其他非类选项,不确定是否适合您的情况。
尼克·克拉弗

1
但是它将覆盖直接应用于该元素的任何其他样式。stackoverflow.com/a/11723492/491044最容易实现。
trgraglia

10
通过将$('#elem').css('cssText', $('#elem').css('cssText')+'width: 100px !important');其与先前的值相结合来防止覆盖
Abel Callejo

81
const elem = $("#elem");
elem[0].style.removeAttribute('width');
elem[0].style.setProperty('width', '100px', 'important');

注意:使用Chrome可能会返回以下错误:

elem [0] .style.removeAttribute不是函数

更改线路以使用.removeProperty诸如elem[0].style.removeProperty('width');修复问题的功能。


10
这是最好的答案之一。简单而且有效。而且不需要太多解释。它只是普通的JavaScript,除了jQuery选择器。jQuery不提供对“重要”的支持,因此使用常规的JS是必经之路
OMA 2014年

2
如果您想使用Vanilla,只需var = document.getElementById('elem');在elem上创建并执行样式方法即可(与elem [0]相反)。干杯。
humbolight 2015年

3
在原始JS中,removeAttribute不起作用。请执行下列操作。 var style = document.getElementById('elem'); style.removeProperty('width'); style.setProperty('width, '100px', 'important')
mcoenca 2015年

2
也有问题.removeAttribute。它似乎是仅IE的方法。@mcoenca评论是正确的;.removeProperty工作良好。根据MSDN,
FelipeAls

2
@Dejan,很抱歉回答晚了,但这应该可以解决:elem.next().get(0).style...
RedClover

54

大卫·托马斯(David Thomas)的答案描述了一种使用方法$('#elem').attr('style', …),但警告说,使用它会删除style属性中先前设置的样式。这是一种attr()没有问题的使用方法:

var $elem = $('#elem');
$elem.attr('style', $elem.attr('style') + '; ' + 'width: 100px !important');

作为功​​能:

function addStyleAttribute($element, styleAttribute) {
    $element.attr('style', $element.attr('style') + '; ' + styleAttribute);
}
addStyleAttribute($('#elem'), 'width: 100px !important');

这是一个JS Bin演示


2
addStyleAttribute()也可以修改为采用与jQuery.css()相同的参数。例如,它可以支持将CSS属性映射为其值。如果这样做的话,基本上您将.css()!important修复了错误但没有任何优化的情况下重新实现。
罗里·奥肯

1
这对我来说效果很好,因为宽度是在CSS类中定义的,因此我需要使用根据浏览器窗口和内容的宽度计算出的值动态地覆盖它。
克里斯·拉斯科

30

阅读其他答案并进行实验后,这对我有效:

$(".selector")[0].style.setProperty( 'style', 'value', 'important' );

但是,这在IE 8及更低版本中不起作用。


1
而且由于我们仍然必须支持IE8(我们当中有些人是不幸的),所以这不是很好。
mkoryak 2014年

27

你可以这样做:

$("#elem").css("cssText", "width: 100px !important;");

使用“ cssText”作为属性名称,并使用任何要添加到CSS的值作为其值。


5
这种方法的缺点是,它会覆盖任何cssText在那里之前-所以你真的不能运用自如
mkoryak

1
无论如何,您可以使用$(“#elem”)。css(“ cssText”,“ + =; width:100px!important;”);
lexa-b

18

您可以通过两种方式实现:

$("#elem").prop("style", "width: 100px !important"); // this is not supported in chrome
$("#elem").attr("style", "width: 100px !important");

实际上,该.prop()函数是在jQuery v1.6中添加的,并且将在Chrome中运行。。。这是从支持页面中引用的:在jQuery 1.6之前,该.attr()方法有时在检索某些属性时会考虑属性值,这可能会导致行为不一致。从jQuery 1.6开始,该.prop()方法提供了一种在检索属性的同时显式检索属性值的方法.attr()
Mottie '16

1
对于通用解决方案来说不是一个好主意。您可以使用此方法覆盖现有样式。
Nirav Zaveri

14

无需研究@AramKocharyan的答案的复杂性,也无需动态插入任何样式标签。

只是覆盖样式,但是您不必解析任何内容,为什么呢?

// Accepts the hyphenated versions (i.e. not 'cssFloat')
function addStyle(element, property, value, important) {
    // Remove previously defined property
    if (element.style.setProperty)
        element.style.setProperty(property, '');
    else
        element.style.setAttribute(property, '');

    // Insert the new style with all the old rules
    element.setAttribute('style', element.style.cssText +
        property + ':' + value + ((important) ? ' !important' : '') + ';');
}

无法使用removeProperty(),因为它不会删除!importantChrome 中的规则。
无法使用element.style[property] = '',因为它仅在Firefox中接受camelCase。

您可能可以使用jQuery来简化它,但是此香草函数将在现代浏览器,Internet Explorer 8等上运行。


12

这是我遇到这个问题后所做的...

var origStyleContent = jQuery('#logo-example').attr('style');
jQuery('#logo-example').attr('style', origStyleContent + ';width:150px !important');

谢谢,这比自定义插件实现起来简单得多(即使它确实有可能破坏其他内联样式)。
Phrogz

9

该解决方案不会覆盖任何先前的样式,而只是应用您需要的样式:

var heightStyle = "height: 500px !important";
if ($("foo").attr('style')) {
  $("foo").attr('style', heightStyle + $("foo").attr('style').replace(/^height: [-,!,0-9,a-z, A-Z, ]*;/,''));
else {
  $("foo").attr('style', heightStyle);
}

9

如果它不那么相关,并且由于您要处理的元素是#elem,则可以将其id更改为其他名称,并根据需要设置其样式...

$('#elem').attr('id', 'cheaterId');

在您的CSS中:

#cheaterId { width: 100px;}

9
为什么更改ID以应用CSS而不是仅添加CSS类?
TeKapa

8

代替使用该css()函数,请尝试使用该addClass()函数:

  <script>
  $(document).ready(function() {
    $("#example").addClass("exampleClass");
  });
  </script>

  <style>
  .exampleClass{
    width:100% !important;
    height:100% !important;
  }
  </style>

OP写道,该属性的值是动态计算的,因此您的答案对他不起作用。
塞巴斯蒂安·扎特纳

这个解决方案对我有用。我认为我没有原始海报的确切需求,但是在css()没有的情况下它确实可以工作。
leekei 2014年

2
这确实是一个解决问题的完全合理的解决方案……而不仅仅是这个问题!
mkoryak 2014年

8

对于我来说,最简单,最好的解决方案是简单地使用addClass()而不是.css()或.attr()。

例如:

$('#elem').addClass('importantClass');

在您的CSS文件中:

.importantClass {
    width: 100px !important;
}

1
由于宽度是用JavaScript计算的,因此无法解决问题。
克里斯(Chris)


7

这些答案大多数现在已经过时,IE7支持不再是问题。

支持IE11 +和所有现代浏览器的最佳方法是:

const $elem = $("#elem");
$elem[0].style.setProperty('width', '100px', 'important');

或者,如果需要,您可以创建一个小型jQuery插件来执行此操作。该插件css()在其支持的参数中紧密匹配jQuery自己的方法:

/**
 * Sets a CSS style on the selected element(s) with !important priority.
 * This supports camelCased CSS style property names and calling with an object 
 * like the jQuery `css()` method. 
 * Unlike jQuery's css() this does NOT work as a getter.
 * 
 * @param {string|Object<string, string>} name
 * @param {string|undefined} value
 */   
jQuery.fn.cssImportant = function(name, value) {
  const $this = this;
  const applyStyles = (n, v) => {
    // Convert style name from camelCase to dashed-case.
    const dashedName = n.replace(/(.)([A-Z])(.)/g, (str, m1, upper, m2) => {
      return m1 + "-" + upper.toLowerCase() + m2;
    }); 
    // Loop over each element in the selector and set the styles.
    $this.each(function(){
      this.style.setProperty(dashedName, v, 'important');
    });
  };
  // If called with the first parameter that is an object,
  // Loop over the entries in the object and apply those styles. 
  if(jQuery.isPlainObject(name)){
    for(const [n, v] of Object.entries(name)){
       applyStyles(n, v);
    }
  } else {
    // Otherwise called with style name and value.
    applyStyles(name, value);
  }
  // This is required for making jQuery plugin calls chainable.
  return $this;
};
// Call the new plugin:
$('#elem').cssImportant('height', '100px');

// Call with an object and camelCased style names:
$('#another').cssImportant({backgroundColor: 'salmon', display: 'block'});

// Call on multiple items:
$('.item, #foo, #bar').cssImportant('color', 'red');

示例jsfiddle在这里


1
这就是答案。无需检查其他答案
Shwet

6

我们首先需要删除以前的样式。我使用正则表达式将其删除。这是更改颜色的示例:

var SetCssColorImportant = function (jDom, color) {
       var style = jDom.attr('style');
       style = style.replace(/color: .* !important;/g, '');
       jDom.css('cssText', 'color: ' + color + ' !important;' + style); }

3
不知道为什么当cssText方法可以正常工作时,有这么多解决方案将样式标签砍到元素上……例如$selector.css('cssText','margin-bottom: 0 !important')
frumbert 2013年

6

在头部附加样式的另一种方法:

$('head').append('<style> #elm{width:150px !important} </style>');

这会将样式附加到所有CSS文件之后,因此它将具有比其他CSS文件更高的优先级并被应用。


6

可能看起来像这样:

快取

var node = $('。selector')[0];
要么
var node = document.querySelector('。selector');

设置CSS

node.style.setProperty('width','100px','important');

删除CSS

node.style.removeProperty('width');
要么
node.style.width ='';

6

我认为它工作正常,并且可以覆盖之前的任何其他CSS(此:DOM元素):

this.setAttribute('style', 'padding:2px !important');

5

像这样做:

$("#elem").get(0).style.width= "100px!important";

5

此解决方案将保留所有计算出的javascript并将重要标签添加到元素中:您可以这样做(例如,如果需要使用重要标签设置宽度)

$('exampleDiv').css('width', '');
//This will remove the width of the item
var styles = $('exampleDiv').attr('style');
//This will contain all styles in your item
//ex: height:auto; display:block;
styles += 'width: 200px !important;'
//This will add the width to the previous styles
//ex: height:auto; display:block; width: 200px !important;
$('exampleDiv').attr('style', styles);
//This will add all previous styles to your item

4

三个工作实例

我也遇到类似的情况,但是在长时间与.closest()纠缠不清之后,还是使用了.find()并进行了许多更改。

示例代码

// Allows contain functions to work, ignores case sensitivity

jQuery.expr[':'].contains = function(obj, index, meta, stack) {
    result = false;
    theList = meta[3].split("','");
    var contents = (obj.textContent || obj.innerText || jQuery(obj).text() || '')
    for (x=0; x<theList.length; x++) {
        if (contents.toLowerCase().indexOf(theList[x].toLowerCase()) >= 0) {
            return true;
        }
    }
    return false;
};

$(document).ready(function() {
    var refreshId = setInterval( function() {
        $("#out:contains('foo', 'test456')").find(".inner").css('width', '50px', 'important');
    }, 1000); // Rescans every 1000 ms
});

另类

$('.inner').each(function () {
    this.style.setProperty('height', '50px', 'important');
});

$('#out').find('.inner').css({ 'height': '50px'});

工作:http//jsfiddle.net/fx4mbp6c/


我将不赞成您,但您应该选择.indexOf()使用跨浏览器更兼容的功能来代替该功能。而使用,.match().test()代替.indexOf()
亚历山大·迪克森

为什么没有分号var contents =
彼得·莫滕森

3

它可能适合您的情况,也可能不适合您,但您可以在许多此类情况下使用CSS选择器。

例如,如果您希望.cssText的第3和第6实例具有不同的宽度,则可以编写:

.cssText:nth-of-type(3), .cssText:nth-of-type(6) {width:100px !important;}

要么:

.container:nth-of-type(3).cssText, .container:nth-of-type(6).cssText {width:100px !important;}

这与的第3个和第6个实例匹配.cssText:nth-of-type()不按照您的想法去做。请参阅此处以获取解释。
BoltClock

很公平。我确实阅读了链接,但是不确定我是否理解您的观点。这是一个小提琴,按预期显示了此工作: jsfiddle.net/d2E4b
Tim Cutting

2
在摆弄中,您正在处理一系列li元素。它们都是相同的元素类型li,这是选择器要处理的。如果您要在同一父级中混合使用不同的元素,则其:nth-of-type()行为会有所不同,尤其是在将类选择器添加到混合中之后。
BoltClock

3

我会假设您尝试时未添加!important

内联CSS(这是JavaScript添加样式的方式)将覆盖样式表CSS。我很确定即使样式表CSS规则具有!important

另一个问题(可能是一个愚蠢的问题,但必须提出。):您正在尝试处理的元素是 display:block;还是display:inline-block;

不了解您在CSS方面的专业知识...内联元素并不总是表现出预期的效果。


4
具有!important的css规则会覆盖所有内容,无论它们位于何处,唯一的例外是带有!important的内联样式将覆盖带有!important的样式表样式。这是我遇到的问题。有一个样式表规则具有!important,我想覆盖它。而且,我需要提供的值必须通过JS计算,所以我不能简单地更改样式表本身。
mkoryak 2010年

3

我们可以使用setProperty或cssText !important使用JavaScript 添加到DOM元素。

范例1:

elem.style.setProperty ("color", "green", "important");

范例2:

elem.style.cssText='color: red !important;'

2

我还发现某些元素或附加组件(如Bootstrap)具有一些特殊的类情况,它们不能与!important或其他变通方法(如)配合使用.addClass/.removeClass,因此您必须将其打开/关闭。

例如,如果您使用类似<table class="table-hover">的方法来成功修改行颜色之table-hover类的元素的唯一方法是像这样切换类的开/关

$(your_element).closest("table").toggleClass("table-hover");

希望这种解决方法对某人有所帮助!:)


2

我在尝试更改“事件”时更改菜单项的文本颜色时遇到了同样的问题。当我遇到同样的问题时,发现的最好方法是:

第一步:为此,在CSS中创建一个新类,例如:

.colorw{ color: white !important;}

最后一步:使用addClass方法来应用此类,如下所示:

$('.menu-item>a').addClass('colorw');

问题解决了。


1
我认为最好的答案。最方便的一种。
Siyah '18年

谢谢@Siyah CSS是ppl的载入者所熟知,但只有很少的人了解它,这很可悲,这使一些程序员讨厌它lol
JoelBonetR

但是,如果您想使用js生成CSS值,例如在JS中定义的颜色值,则不可以。否则,这很好。
卡尔·帕普沃思

为什么要在js中定义颜色?
JoelBonetR

2

最安全的解决方法是添加一个类,然后在CSS中做魔术:-),addClass()removeClass()应完成工作。


1

https://jsfiddle.net/xk6Ut/256/

一种替代方法是在JavaScript中动态创建和更新CSS类。为此,我们可以使用样式元素,并且需要为样式元素使用ID,以便我们可以更新CSS类

function writeStyles(styleName, cssText) {
    var styleElement = document.getElementById(styleName);
    if (styleElement) document.getElementsByTagName('head')[0].removeChild(
        styleElement);
    styleElement = document.createElement('style');
    styleElement.type = 'text/css';
    styleElement.id = styleName;
    styleElement.innerHTML = cssText;
    document.getElementsByTagName('head')[0].appendChild(styleElement);
}

...

  var cssText = '.testDIV{ height:' + height + 'px !important; }';
  writeStyles('styles_js', cssText)
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.