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

IT技术 javascript jquery html css
2021-01-13 01:58:52

我在应用!important. 我试过了:

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

什么都不做没有应用任何宽度样式。是否有一种 jQuery 风格的方式来应用这种样式而不必覆盖cssText(这意味着我需要先解析它等)?

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

此外,将覆盖前一个值的值是计算的,所以我不能简单地创建另一个外部样式。

6个回答

问题是由 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;' });
样式为空时的小修复: $('#elem').attr('style', function(i,s) { return (s||'') + 'width: 100px !important;' });
2021-03-15 01:58:52
我倾向于你的后一种方法,但令人难过的是,生病可能最终不得不解析以前的 cssText 因为我不能丢弃它
2021-03-16 01:58:52
嵌套引号 ('"width: 100px !important"') 有什么用?这对我不起作用,但是当我删除内部引号时它起作用了。谢谢!
2021-03-27 01:58:52
您应该添加@falko 的修复程序,因为在 Firefox 中,您的最后一个代码段会将样式设置'undefinedwidth: 100px !important;'为当前样式为空时。
2021-04-01 01:58:52
啊,抱歉没听懂,有时英语幽默超出了我的理解...:)
2021-04-04 01:58:52

我想我已经找到了解决办法。我已经把它变成了一个新功能:

jQuery.style(name, value, priority);

您可以使用它来获取.style('name')like 的.css('name'),获取CSSStyleDeclarationwith .style(),还可以设置值,并能够将优先级指定为'important'看到这个

例子

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 中对宽度所做的任何更改都不会受到影响,因为它们会被添加到样式属性中。

兼容性

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

还有几年前发布jQuery.important 插件我在生产中使用它,只有一个小问题(请参阅他们的问题选项卡。
2021-03-13 01:58:52
@Richard,解决这个问题的唯一好方法是不要!important在您的样式中使用,至少对于您要使用 jQuery 更改的内容...只要它们是您的样式。如果您的代码在一个学生编写的页面中运行,该学生通过对特定规则的无知来解决他的!important每一种风格,那么您!importants迟早会首先进入其中一种风格
2021-03-15 01:58:52
解决这个问题的唯一好方法是使用类,而不是直接样式注入。
2021-03-18 01:58:52
$( '.someclass' ).each(function () { this.style.setProperty( 'border', 'none', 'important' ); }); stackoverflow.com/questions/11962962/... 更简单、更干净、更高效。
2021-04-04 01:58:52
你在其他浏览器上测试过吗?
2021-04-08 01:58:52

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

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

更新评论: 你也有这个选项,但它会替换元素上的所有 css,所以不确定它是否更可行:

$('#elem').css('cssText', 'width: 100px !important');
但它会覆盖直接应用于元素的任何其他样式。stackoverflow.com/a/11723492/491044是最容易实现的。
2021-03-14 01:58:52
我还编辑了问题以更好地反映我的情况..基本上我有一个外部 !important 宽度设置为不好的东西,我必须覆盖内联。由于这个原因,width() 不起作用
2021-03-18 01:58:52
通过将$('#elem').css('cssText', $('#elem').css('cssText')+'width: 100px !important');其与以前的值连接来防止覆盖
2021-03-20 01:58:52
@mkoryak - 更新了唯一的其他非类选项,不确定它是否适合您的情况。
2021-03-24 01:58:52
好的,我以 with 为例,我关心的是设置!重要。
2021-04-04 01:58:52
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');修复问题的功能。

也有问题.removeAttribute这似乎是一种仅限 IE 的方法@mcoenca 评论是对的;.removeProperty工作正常。根据MSDN,它是 IE9+
2021-03-10 01:58:52
如果你想使用它,只需var = document.getElementById('elem');在 elem 上创建和执行样式方法(而不是 elem[0])。干杯。
2021-03-11 01:58:52
这是最好的答案之一。简单,它的工作原理。而且不需要太多解释。它只是普通的 JavaScript,除了 jQuery 选择器。jQuery 不提供对“重要”的支持,因此使用常规 JS 是可行的方法
2021-03-16 01:58:52
@Dejan,很抱歉很晚才回答,但这应该有效: elem.next().get(0).style...
2021-03-27 01:58:52
在 vanilla JS 中,removeAttribute 不起作用。请执行下列操作。 var style = document.getElementById('elem'); style.removeProperty('width'); style.setProperty('width, '100px', 'important')
2021-04-03 01:58:52

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 演示

这对我来说效果很好,因为宽度是在 CSS 类中定义的,我需要使用基于浏览器窗口和内容的宽度计算的值动态覆盖它。
2021-03-22 01:58:52
addStyleAttribute()也可以修改为采用与jQuery.css()相同的参数例如,它可以支持将 CSS 属性映射到它们的值。如果你这样做,你基本上会重新实现修复.css()!important错误但没有任何优化。
2021-03-24 01:58:52