如何申请!重要的是使用.css()?

时间:2010-04-16 20:31:13

标签: javascript jquery html css

我无法应用!important的样式。我试过了:

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

没有;没有任何宽度样式应用。是否有jQuery-ish方式应用这样的样式而不必覆盖cssText(这意味着我需要先解析它等等)?

修改:我应该添加一个样式表,其样式为!important,我尝试使用!important样式内联覆盖,因此使用{{1}因为它被我的外部.width()样式覆盖,所以之类的功能不起作用。

此外,将覆盖先前值的值,因此我不能简单地创建另一种外部样式。

31 个答案:

答案 0 :(得分:549)

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

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

.importantRule { width: 100px !important; }

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

或者使用attr()

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

然而,后一种方法将取消设置任何先前设置的内联样式规则。所以要小心使用。

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

上面的attr()方法略有修改,以保留原始的style字符串/属性:

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

答案 1 :(得分:315)

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

jQuery.style(name, value, priority);

您可以使用它来获取.style('name')的值,就像.css('name')一样,使用.style()获取CSSStyleDeclaration,并设置值 - 可以将优先级指定为'important' 。请参阅this

演示

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值的示例,请参阅this。我的问题是我已经为我的CSS中的宽度设置!important以避免与其他主题CSS发生冲突,但是我对jQuery中的宽度所做的任何更改都不会受到影响,因为它们会被添加到style属性中。

兼容性

要使用setProperty功能设置优先级,This Article表示支持IE 9+和所有其他浏览器。我已经尝试过使用IE 8但它失败了,这就是为什么我在我的函数中建立了对它的支持(见上文)。它将适用于使用setProperty的所有其他浏览器,但它需要我的自定义代码才能在&lt; IE 9。

答案 2 :(得分:139)

您可以使用.width()直接设置宽度,如下所示:

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

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

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

答案 3 :(得分:71)

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

答案 4 :(得分:52)

David Thomas’s answer介绍了使用$('#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 demo

答案 5 :(得分:28)

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

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

但这在IE 8及以下版本中不起作用。

答案 6 :(得分:23)

你可以这样做:

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

使用“cssText”作为属性名称以及您想要添加到CSS中的任何值作为其值。

答案 7 :(得分:17)

您可以通过两种方式实现这一目标:

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

答案 8 :(得分: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(),因为它不会删除Chrome中的!important规则 无法使用element.style[property] = '',因为它只接受Firefox中的camelCase。

你可以用jQuery缩短它,但这个vanilla函数可以在现代浏览器,Internet Explorer 8等上运行。

答案 9 :(得分:12)

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

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

答案 10 :(得分: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);
}

答案 11 :(得分:9)

如果它不那么相关,并且因为你正在处理一个#elem的元素,你可以将其id更改为其他内容并根据需要设置样式...

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

在你的CSS中:

#cheaterId { width: 100px;}

答案 12 :(得分:8)

不使用css()函数,而是尝试addClass()函数:

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

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

答案 13 :(得分:8)

对我来说这个问题的最简单和最好的解决方案是简单地使用addClass()而不是.css()或.attr()。

例如:

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

在你的CSS文件中:

.importantClass {
    width: 100px !important;
}

答案 14 :(得分:7)

仅供参考,它不起作用,因为jQuery不支持它。 2012年有一张票(#11173 $(elem).css("property", "value !important") fails),最终以WONTFIX结束。

答案 15 :(得分:6)

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

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

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

答案 16 :(得分:6)

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

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

答案 17 :(得分:6)

可能看起来像这样:

高速缓存

var node = $('.selector')[0];
OR
var node = document.querySelector('.selector');

设置CSS

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

删除CSS

node.style.removeProperty('width');
OR
node.style.width = '';

答案 18 :(得分:5)

这样做:

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

答案 19 :(得分: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/

答案 20 :(得分:4)

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

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

答案 21 :(得分:4)

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

$('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

答案 22 :(得分:3)

我会假设您在没有添加!important的情况下尝试了它?

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

也是如此

另一个问题(可能是一个愚蠢的问题,但必须要问。):您试图在display:block;display:inline-block;处理的元素是什么?

不了解您在CSS方面的专业知识...内联元素并不总是像您期望的那样。

答案 23 :(得分:3)

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

示例1:

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

示例2:

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

答案 24 :(得分: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;}

答案 25 :(得分:2)

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

答案 26 :(得分:2)

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

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

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

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

/**
 * 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');

Example jsfiddle here

答案 27 :(得分:2)

在&#34; event&#34;时,尝试更改菜单项的文本颜色时遇到了同样的问题。我遇到同样问题时找到的最好方法是:

第一步:在CSS中创建一个具有此目的的新类,例如:

.colorw{ color: white !important;}

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

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

问题解决了。

答案 28 :(得分:2)

我还发现某些元素或附加组件(如Bootstrap)有一些特殊的类案例,它们与!important.addClass/.removeClass之类的其他解决方法不能很好地配合使用,因此你有打开/关闭它们。

例如,如果您使用<table class="table-hover">之类的内容,成功修改行颜色等元素的唯一方法是打开/关闭table-hover类,就像这样

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

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

答案 29 :(得分: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)

答案 30 :(得分:-6)

另一种解决此问题的简单方法是添加样式属性:

$('.selector').attr('style', 'width:500px !important');