使用 CSS3
新特性 :is()
, @layer
覆写 !important
如果想覆盖如下样式:
td {height: 100px !important}
我们可以添加另一个CSS规则,同样具有 !important
同时赋予它更高的层级,如添加额外的选择器(标签,ID或者class选择器),
同时我们可以在内联样式中添加!important
, 给元素添加的内联样式 (例如,style="font-weight:bold"
) 总会覆盖外部样式表的任何样式,因此可看作是具有最高的优先级。
或者,使用JS进行覆盖也是为一个办法:
$('.mytable td').attr('style', 'display: none !important');
在了解到一些CSS3的选择器之后,可以使用:is()和:not() 结合使用,为css选择器设置任意的层级:
:is(td, #A#A#A:not(*)) {height: 200px !important}
MDN文档:
:is() (:matches(), :any()) , :not()
:is()
选择器的大致作用如下:
/* 选择 header、main、footer 里的任意一个悬浮状态的段落 */
:is(header, main, footer) p:hover {
color: red;
cursor: pointer;
}
/* 以上内容相当于以下内容 */
header p:hover,
main p:hover,
footer p:hover {
color: red;
cursor: pointer;
}
我们继续回头看我们的代码:
:is(td, #A#A#A:not(*)) {height: 200px !important}
首先, :is()
计入整体选择器的优先级(它接受优先级最高参数的优先级),同时 与之类似的 :where()
的优先级为 0
:not(*)
部分意味着该选择器永远不会匹配任何元素本身,但是 #A#A#A
提供了三个ID选择器(3,0,0),我们几乎可以覆盖所有的 !important
同时不需要担心副作用, 但是这种方法仍然属于歪门邪道(hack代码)!important
已经够让人心累了
不过,还有更好的方法: @layer
级联层,级联层内部的样式永远高于级联层外部的样式,后声明的级联层层级高于先前的
@layer {
td {height: 200px !important}
}
PS:请注意,这两种方法都不允许您覆盖 HTML 样式属性中的 !important 设置。
截止到 2023/02/13
兼容性马马虎虎吧