css样式important规则的正确使用方式


Posted in HTML / CSS onJune 10, 2022

一、理解 !important 与优先级无关

有的同学称 css 的样式优先级计算的例外规则-!important规则,为 css 样式优先级“最高级”,这其实有点道理,因为从作用结果上看,这似乎符合事实的。不管内联样式,还是百八十嵌套层的样式选择器组合,都可以被 !important 覆盖。

例如:下面这个优先级权重其实已经很高的样式,会轻易被 !important 作用的样式覆盖。

.text {
    color: green !important;

}
body #main .box p span {

    color: red;

}

按照下面的这份样式优先级权重规则来看,“body #main .box p span{}” 的优先级权重大约是 0113,而 ".text{}" 的优先级权重大约是 0010。

css样式important规则的正确使用方式

css 延时优先级权重规则说明:

一个选择器的优先级可以说是由四个部分相加 (分量),可以认为是个十百千 — 四位数的四个位数:

  • 千位: 如果声明在 style 的属性(内联样式)则该位得一分。这样的声明没有选择器,所以它得分总是1000。
  • 百位: 选择器中包含ID选择器则该位得一分。
  • 十位: 选择器中包含类选择器、属性选择器或者伪类则该位得一分。
  • 个位:选择器中包含元素、伪元素选择器则该位得一分。

css样式important规则的正确使用方式

css样式important规则的正确使用方式

正如上图所示,结果很显然,应用了 ".text{}" 的样式,文本颜色为 green。我们要注意,“body #main .box p span{}” 的优先级权重大约是 0113,而 ".text{}" 的优先级权重大约是 0010,前者的优先级更高,却应用了后者的样式,这是因为 !important 这个例外规则。注意,从技术上讲,!important 与优先级无关,所以你要算 !important 的优先级权重是多算?一万?八千?这没法算,它是例外规则,与最终的结果直接相关,但是与优先级无关。

当然,你如果从样式作用结果的角度理解,认为 !important 具有一个很高的样式优先级权重,尽管这个权重值不存在,但这样理解问题也不大。但说它是样式优先级的例外规则更合适,因为它就是如此设计的。关于例外规则,这在不合适量化,在某一套计算规则难以算清(难以解释)的场景下,使用例外规则很有好处。

二、什么时候可以使用 !important 规则

tips:css 中使用 !important 的合理场景,是去覆盖糟糕的难以更改的样式。注意是覆盖,而不是一开始写样式就使用 !important。覆盖+难以更改就是我认为的 !important 的合理适用场景。

例如下面的场景:

1.覆盖内联样式

内联样式的优先级权重很高,如果不便于改动源码中的样式,那么选用 !important 去覆盖掉原来的内联样式是合适的。因为此时,除了改动源码,还有什么合适的办法可以改动内联样式?似乎没有了吧。然后就是关于“不便改动源码”的理解,例如第三方插件的内联样式,这确实不便于改动。如果是自己开发中的项目,那么改动源码可能比起用 !important 去覆盖更合适。对于一些老旧项目里面的内联样式,这种源码是可以动的,但如果你认为“改动源码”非常费劲,你也有一点理由去使用 !important,但不太建议。

2.覆盖优先级很高的选择器

除了内联样式,还有一种需要使用 !important 的场景,那就是样式优先级很高,权重很大的样式。优先级很高,权重很大,是啥概念呢?就是除了改源码(代码),几乎没有办法能改动了。

<!DOCTYPE html>

<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>css-important Demo</title>
    <style>
        #main {

            color: red;

        }
        body #main {

            color: #002afd;

        }
        html #main {

            color: #5dfd00;

        }
        /* 假设这份样式在第三方插件中,除了改动源码,

        还有什么办法可以覆盖 html body #main{} 的样式,样式穿透已经改不动了吧 */
        html body #main {
            color: #2c3e50;
        }
    </style>
</head>
<body>
<div id="main">

    这一段普通的文字

</div>
</body>
</html>

例如上面的例子,html body #main{} 的优先级很高,如果的代码是在第三方插件中,我们不便于改动源码,也就是也无法使用内联样式这个秘密武器,而样式穿透的优先级又不够,没啥好办法了,此时就是 !important 的适用场景了。

还是这个样式 html body #main{} ,如果它在自己的项目中,但是不便于改动 html body #main{} 本身,因为那可能带来一些副作用,写内联样式又不好,那么也可以考虑 !important。请特别注意,使用 !important,是因为

html body #main{} 实在太高了,高到别的级联样式规则没办法覆盖,才使用 !important。如果是 html #main{} 或 body #main,这样优先级还不是很高的样式,那么不应该使用 !important 规则,因为我们还有合适的选择,例如 html body #main{} 的优先级就比它们都高。

还有一种情况,就是旧的样式已经使用了 !important 规则,而我们不便于改动源码(代码),那么只能使用 !important 去覆盖 !important 的样式。

例如下面这样:

div p { height: 30px !important; }
#my-container div p { height: 50px !important; }

有时可能还要结合样式穿透符,例如下面这样:

::v-deep #my-container div p { height: 50px !important; }

三、禁用 !important 的经验法则

为啥要特别强调谨慎使用 !important,因为正如前文说到的 !important 是例外规则,没法算清优先级权重,就是说使用 !important 会破坏固有的级联规则,让调试找bug,以及覆盖样式都变得更加困难。所以,才要特别强调谨慎使用 !important。

所以:

  • ①样式级联规则还管用,就别用 !important。
  • ②还有办法覆盖样式就别用 !important。

下面是来自 Mozilla 的经验法则提示:

  • 一定要优先考虑使用样式规则的优先级来解决问题而不是 !important
  • 只有在需要覆盖全站或外部 CSS 的特定页面中使用 !important
  • 永远不要在你的插件中使用 !important
  • 永远不要在全站范围的 CSS 代码中使用 !important

到此这篇关于css样式important规则的正确使用方式的文章就介绍到这了,更多相关css important规则内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
CSS3中background-clip和background-origin的区别示例介绍
Mar 10 HTML / CSS
CSS3实现千变万化的文字阴影text-shadow效果设计
Apr 26 HTML / CSS
老生常谈CSS中的长度单位
Jun 27 HTML / CSS
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
Mar 05 HTML / CSS
自定义html标记替换html5新增元素
Oct 17 HTML / CSS
HTML5的download属性详细介绍和使用实例
Apr 23 HTML / CSS
浅谈移动端网页图片预加载方案
Nov 05 HTML / CSS
Html5 canvas画图白板踩坑
Jun 01 HTML / CSS
HTML5逐步分析实现拖放功能的方法
Sep 30 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
Nov 10 HTML / CSS
css中有哪些方式可以隐藏页面元素及区别
Jun 16 HTML / CSS
使用CSS实现按钮边缘跑马灯动画
May 07 HTML / CSS
分享几个实用的CSS代码块
Jun 10 #HTML / CSS
html中两种获取标签内的值的方法
Jun 10 #HTML / CSS
html5+实现plus.io进行拍照和图片等获取
Jun 01 #HTML / CSS
基于CSS制作创意端午节专属加载特效
聊聊CSS粘性定位sticky案例解析
Jun 01 #HTML / CSS
HTML5之高度塌陷问题的解决
Jun 01 #HTML / CSS
使用CSS实现黑白格背景效果
Jun 01 #HTML / CSS
You might like
php实现图片添加水印功能
2014/02/13 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
Yii配置文件用法详解
2014/12/04 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
PHP微信支付结果通知与回调策略分析
2019/01/10 PHP
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
JsRender实用入门教程
2014/10/31 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
python中实现精确的浮点数运算详解
2017/11/02 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
python用Configobj模块读取配置文件
2020/09/26 Python
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
2015年财务人员个人工作总结
2015/07/27 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
python实现过滤敏感词
2021/05/08 Python
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL