我无法应用!important
的样式。我试过了:
$("#elem").css("width", "100px !important");
没有;没有任何宽度样式应用。是否有jQuery-ish方式应用这样的样式而不必覆盖cssText
(这意味着我需要先解析它等等)?
修改:我应该添加一个样式表,其样式为!important
,我尝试使用!important
样式内联覆盖,因此使用{{1}因为它被我的外部.width()
样式覆盖,所以之类的功能不起作用。
此外,将覆盖先前值的值,因此我不能简单地创建另一种外部样式。
答案 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');
node.style.setProperty('width', '100px', 'important');
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'});
答案 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 key
和addClass()
应该完成工作。
答案 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');
答案 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');