CSS 重新认识 !important 肯定有你不知道的
- 重新认识 !important
- 影响级联规则
- 与 animation 和 transition 的关系
- 级联层cascade layer
- 内联样式
- !important 与权重
- !important 与简写属性
- !important 与自定义变量
- !important 最佳实践
- 影响级联规则
在开始之前, 先来规范一下文中的用于, 首先看 W3C 中关于 CSS
的一些术语定义吧. 下图来自 W3C
我们将一个完整的 color: blue;
称为一个声明(declaration
), 其中 color
称为属性(property
), blue
称为值(value
)
重新认识 !important
!important
表示 CSS
声明是「重要」的. !important
改变了 CSS
级联中究竟使用哪个 CSS
声明的规则. 如果一个 CSS
声明不是重要(important)的, 那么就称其为一般(normal)声明.
我们只需要将 !important
加在一个 CSS
声明的值的后面, 要加上至少一个空格, !
和 important
之间可以有空格, 但是通常没有空格
.box {border-radius: 10px; /* normal declaration */font-size: 18px ! important; /* 可以, 但不推荐 */background-color: red !important; /* 可以, 推荐 */
}
影响级联规则
在级联规则中, 有三种常见的样式表, 他们的优先级依次 降低
author stylesheets
: 最常见的样式表, 由web
开发人员编写user stylesheets
: 大多数浏览器中, 网站的用户可以使用自定义的user
样式表覆盖网站的样式. 根据浏览器的不同,user
样式表可以直接配置或者通过浏览器扩展添加
.user-agent stylesheets
: 浏览器默认样式表.
一旦应用了 !important
, 优先级就完全反过来. user-agent
所有 !important
样式表优先级大过 user
所有 !important
样式表优先级; 而 user
所有 !important
样式表优先级又大过 author
所有 !important
样式表优先级.
举个例子, 我们可以使用广告拦截器插件拦截页面某个元素. 本来 author
样式表的优先级高于 user
样式表, 但是因为 user
样式表中的 CSS
声明使用了 !important
, 所以它的优先级就反过来高过 author
样式表中 !important
的 CSS
声明.
因此即便我们在 author
样式表中多加 display: block !important;
仍然无济于事, 元素 display
的计算属性还是 none
. 这也就是使用广告拦截器插件拦截页面元素时, 网站开发者是没有能力覆盖插件的 user stylesheets
的原因.
反转 important
样式表优先级满足了用户的某些特殊要求, 比如要改变浏览器字体大小, 从而覆盖网页开发者编写的样式表. 同样的, user-agent
样式表中 important
声明的优先级更高也会阻止某些恶意插件破环页面功能等.
与 animation
和 transition
的关系
首先要注意的是, 在 @keyframes
中的声明不能使用 !important
所有 important
声明都比 animation
中声明的优先级高. 下面的例子中对 width
设置了 !important
, 但是在动画中呢, 需要 width
从 0
到 100px
变化
.box2 {width: 100px !important;height: 100px;background-color: salmon;animation: moving linear 2s infinite;
}
@keyframes moving {from {width: 0;height: 0;}to {width: 200px;height: 100px;}
}
这条规则在 Chrome 109
版本和 Firefox
上的表现符合预期, 即元素的宽度始终为 100px
而不会动态变化, 但是在 Safari 15.6
上就不是啦. 至于为什么 Safari
浏览器表现不同于其他浏览器, 俺也不知道🤷♀️, 在开发时需要注意避免.
transition
优先级高于 important
声明. 当 CSS
属性从一个值变向另一个值时, 这个属性将不会匹配特定的 important
声明.
/* 第一种 */
.box3 {background-color: lightblue;transition: background-color 1s linear;
}
.box3:hover {background-color: red !important;
}/* 第二种 */
.box3 {background-color: lightblue !important;transition: background-color 1s linear;
}
.box3:hover {background-color: red;
}
从下图中可以看到, 如果 important
添加在在过渡后的声明, 那么过渡正常; 反之添加在过渡前的声明, 则没有过渡.
如果过渡前后都有 important
呢? 答案是过渡正常发生.
上述三种情况在 Chrome
, Firefox
和 Safari
表现相同.
级联层(cascade layer)
样式表有三种来源(不止三种, 这里只讨论三种), 即 user-agent stylesheets
浏览器默认样式, user stylesheets
通过浏览器配置或浏览器插件添加和 author stylesheets
网页开发人员编写.
对于在级联层外的一般(normal)声明优先级高于在级联层内的一般声明; 如果一般声明在不同级联层中, 那么在最后声明的级联层中的一般声明的优先级最高. 具体规则需要查看 @layer.
看个简单的例子
如果使用了 !important
, 那么优先级就反转了. 先声明的级联层中的 important
声明优先级高于后声明的级联层中的 important
声明, 同时, 所有级联层中的 important
声明优先级高于级联层外的 important
优先级
内联样式
内联样式就是使用 style attribute
的声明. 内联样式也可以是一般(normal)声明或 important
声明. 内联一般声明的优先级高于所有其他一般声明, 不论其来源. 而内联 important
声明的优先级高于其他所有 important
声明, 不论级联层, 但是 user-agent
样式表的 important
声明, user
样式表的 important
声明和 transitions
高过内联 important
声明.
这里只关注内联 important
声明, 首先第一条, 内联 important
声明的优先级高于其他所有 important
声明, 即便 important
声明在级联层中, 可对照上部分.
验证第二部分, 内联 important
声明优先级低于 user-agent
样式表的 important
声明
声明和 user
样式表的 important
声明声明. 首先创建一个 button
元素, 然后用浏览器插件屏蔽它, 再增加内联 important
声明
声明, 发现元素仍然被屏蔽.
第三部分, 就是 transitions
的优先级更高我看浏览器的实际表现与规范中所写不同, 俺也不知道为啥…
!important 与权重
关于优先级与权重的说法, 我个人认为是不同来源的 CSS
样式表是「优先级」,同一来源的 CSS
规则之间是「权重」.
!important
并不影响 CSS
规则的权重, 但是却有关系. 如果两条 CSS
规则的权重不同, 那么使用 !important
的样式胜出, 与权重无关
<div class="box7" id="box7">Where are you from?</div>
#box7.box7 {color: red;
}
.box7 {color: green !important;
}
如果两个 CSS
规则都是 important
规则, 那么权重高的胜出.
!important 与简写属性
在简写属性中使用 !important
会使简写属性包括的所有属性都变成 !important
.
p.smile {border-top: 1px solid black;
}
.smile {border: 5px solid red !important;
}
虽然 .smile
的权重低于 p.smile
, 但是 border
中的 !important
使得 border-top-width
也变成了 important
, 所以胜出.
!important 与自定义变量
:root {--custom-bg-color: pink !important;--custom-bg-color: skyblue;
}
如果将 !important
添加到 CSS
变量声明中, 只有赋值时 !important
才起作用. 也就是将 pink
复制给变量 --custom-bg-color
时起了作用, 因为如果没有 !important
, --custom-bg-color
的值应该是 skyblue
.
赋值之后 !important
就从自定义属性上「脱落」了, 使用 var()
函数时并不会传递 !important
.
.box8 {background-color: var(--custom-bg-color);background-color: red;
}
从下图就可以看出, .box8
的背景色是 red
, 因为关于背景色的两条 CSS
声明都是一般声明.
!important 最佳实践
避免使用 !important 覆盖权重. 如果就是想创建 important
声明, 应该在代码中增加注释来解释这样做的原因并且告诉其他开发者不要覆盖 important
.
即便要覆盖不在你控制下的高权重的样式, 比如使用 id
选择器的第三方库的样式, 你也不需要使用 !important
. 可以考虑在第一个级联层中引入第三方样式文件. 只要第三方样式中不包含 !important
, 你自己的样式就会覆盖第三方的样式.
如果真的需要覆盖外部样式表中的 important
样式, 仍然考虑创建一个级联层并在级联层中包含用来覆盖的 CSS
规则, 并将该级联层声明为第一个级联层. 我们来解释一下这个应该怎么做
首先在 index.html
中创建 .box9
元素, 并通过 link
标签引入 index1.css
.
<link rel="stylesheet" href="index1.css">
<div class="box9"></div>
在 index1.css
中编写 .box9
的样式, 并引入 index2.css
作为模拟的外部样式
@layer basement;
@import "./index2.css" layer(basement);.box9 {width: 100px;height: 100px;background-color: green;
}
下面是 index2.css
的代码
.box9 {background-color: blueviolet !important;
}
可以看到此时页面中 .box9
的背景色是紫色, 这是因为如果级联层中的 CSS
声明有 !important
标志, 那么其优先级就会高过外部没有在级联层中的 CSS
声明.
为了覆盖外部的 important
, 我们也必须列用下面的特性: 即先声明的级联层中的 important
优先级高过后声明的级联层中的 important
. 于是修改 index1.css
.
@layer haha, basement;
@import url(index2.css) layer(basement);@layer haha {.box9 {background-color: green !important;}
}.box9 {width: 100px;height: 100px;background-color: green;
}
📖我们先创建了两个没有任何规则的级联层, 然后分别引入外部样式资源, 并在 haha
这个级联层中追加用来覆盖的 CSS
. 这里有一个点值得注意 @layer haha, basement;
中 haha
是首先声明的, basement
是其次声明的.
📖不该加分号的地方不要乱加, 别问我怎么知道的.
谢谢你看到这里😊
相关文章:
CSS 重新认识 !important 肯定有你不知道的
重新认识 !important 影响级联规则 与 animation 和 transition 的关系级联层cascade layer内联样式!important 与权重 !important 与简写属性!important 与自定义变量!important 最佳实践 在开始之前, 先来规范一下文中的用于, 首先看 W3C 中关于 CSS 的一些术语定义吧. 下图…...
android 12添加系统字体并且设置为默认字体
需求:在11.0 12.0系统定制化开发中,在产品定制中,有产品需求对于系统字体风格不太满意,所以想要更换系统的默认字体,对于系统字体的修改也是常有的功能,而系统默认也支持增加字体,所以就来添加楷…...
LeetCode刷题系列 -- 1094. 拼车
车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向)给定整数 capacity 和一个数组 trips , trip[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的…...
二叉查找树的应用 —— K模型和KV模型
文章目录前言1. K模型2. KV模型🍑 构建KV模型的树🍑 英汉词典🍑 统计水果出现的次数3. 总结前言 在上一篇文章中,我们进行了二叉查找树的实现(文章链接),那么今天主要探讨一下二叉查找树的应用…...
深度学习实战(11):使用多层感知器分类器对手写数字进行分类
使用多层感知器分类器对手写数字进行分类 1.简介 1.1 什么是多层感知器(MLP)? MLP 是一种监督机器学习 (ML) 算法,属于前馈人工神经网络 [1] 类。该算法本质上是在数据上进行训练以学习函数。给定一组特征和一个目标变量&#x…...
ThingsBoard-警报
1、使用 IoT 设备警报 ThingsBoard 提供了创建和管理与您的实体相关的警报的能力:设备、资产、客户等。例如,您可以将 ThingsBoard 配置为在温度传感器读数高于某个阈值时自动创建警报。当然,这是一个非常简化的案例,实际场景可能要复杂得多。 2、主要概念 下面让我们回…...
如何去阅读源码,我总结了18条心法
在聊如何去阅读源码之前,先来简单说一下为什么要去阅读源码,大致可分为以下几点原因:最直接的原因,就是面试需要,面试喜欢问源码,读完源码才可以跟面试官battle提升自己的编程水平,学习编程思想…...
排序:归并排序
一、归并 li[2,4,5,7,//1,3,6,8]#归并的前提是必须两部分排好序 def merge(li,low,mid,high):ilowjmid1ltmp[]while i<mid and j<high: #只要左右两边都有数if li[i]<li[j]:ltmp.append(li[i])i1else:ltmp.append(li[j])j1#while执行完,肯定有一部分没数…...
Allegro172版本线到铜皮不按照设定值避让的原因和解决办法
Allegro172版本线到铜皮不按照设定值避让的原因和解决办法 用Allegro做PCB设计的时候,有时会单独给某块铜皮附上线到铜皮额外再增加一个数值,如下图 在规则的基础上,额外再避让10mil 规则避让line到铜皮10.02mil 额外设置多避让10mil,避让的结果却是30.02mil,正确的是20.…...
小白该从哪方面入手学习大数据
大数据本质上是海量数据。 以往的数据开发,需要一定的Java基础和工作经验,门槛高,入门难。 如果零基础入门数据开发行业的小伙伴,可以从Python语言入手。 Python语言简单易懂,适合零基础入门,在编程语言…...
尚医通(十)数据字典加Redis缓存 | MongoDB
目录一、Redis介绍二、数据字典模块添加Redis缓存1、service_cmn模块,添加redis依赖2、service_cmn模块,添加Redis配置类3、在service_cmn模块,配置文件添加redis配置4、通过注解添加redis缓存5、查询数据字典列表添加Redis缓存6、bug&#x…...
为什么我们不再发明编程语言了?
上个世纪,数百种编程语言被发明出来,但是进入21世纪,当我们都进入互联网时代时,只剩那么寥寥几个了。 如果你翻一下TIOBE得编程语言排行榜,就会发现20年来,上蹿下跳的就是那几张老面孔:C , Java…...
预处理指令详解
预处理指令详解**1.预定义符号****2.#define****2.1 #define 定义标识符****2.2 #define 定义宏****2.3 #define 替换规则****2.4 #和##****#的作用****##的作用****2.5 带副作用的宏参数****2.6 宏和函数的对比****宏和函数对比图****2.7 命名约定****3.#undef**4.条件编译4.1…...
Redis
一.认识NoSQL 1.SQL 关系型数据库 结构化: 定义主键,无符号型数据等关联的:结构化表和表之间的关系通过外键进行关联,节省存储空间SQL查询:语法固定 SELECT id,name,age FROM tb_user WHERE id1 ACID 2.NoSQL 非关系型数据库 Re…...
Elasticsearch5.5.1 自定义评分插件开发
文本相似度插件开发,本文基于Elasticsearch5.5.1,Kibana5.5.1 下载地址为: Past Releases of Elastic Stack Software | Elastic 本地启动两个服务后,localhost:5601打开Kibana界面,点击devTools,效果图…...
4.4 序列化与反序列化
文章目录1.概述2.特点/应用场景3.涉及到的流对象4.代码实现序列化与反序列化4.1 步骤1:创建学生类Student24.2 步骤2:创建序列化测试类5.测试案例中常见的几种编译错误类型6.为什么反序列化版本号需要与序列化版本号一致?7.自动提示 生成UID …...
647. 回文子串 516. 最长回文子序列
647. 回文子串 方法一:动态规划 dp[i][j]:[i,j]范围的下标字符串s是否为回文子串 遍历字符串,每次判断s[i]与s[j]是否相等 ①若相等,j-i0 即单个字符串s[i],那么一定为回文子串,赋值为1 ②若相等,j-i1…...
实用小妙招
记录一些实用小妙招,都是收藏夹里收藏的各种文章,总结在一起,持续更新 实用小妙招LinuxUbuntu修改终端语言安装 Node.js (nvm)git 记住账号密码WSL迁移默认用户修改Linux Ubuntu 修改终端语言 apt update apt install -y language-pack-zh…...
别让猴子跳回背上
1.管理者的贡献来自于他们的判断力与影响力,而非他们所投入的个人时间与埋头苦干 2.管理者的绩效表现则是许多人群策群力的结果 3.管理者的时间管理: 老板占用的时间;组织占用的时间;自己占用的时间;外界占用的时间; 4.管理者的策略在于增加自己的时间,…...
数据结构 | 线性表
🔥Go for it!🔥 📝个人主页:按键难防 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 📖系列专栏:数据结构与算法 ὒ…...
Deepwalk深度游走算法
主要思想 Deepwalk是一种将随机游走和word2vec两种算法相结合的图结构数据的挖掘算法。该算法可以学习网络的隐藏信息,能够将图中的节点表示为一个包含潜在信息的向量, Deepwalk算法 该算法主要分为随机游走和生成表示向量两个部分,首先…...
微服务项目【服务调用分布式session共享】
nginx动静分离 第1步:通过SwitchHosts新增二级域名:images.zmall.com 第2步:将本次项目的所有静态资源js/css/images复制到nginx中的html目录下 第3步:在nginx的核心配置文件nginx.conf中新增二级域名images.zmall.com访问映射…...
神经网络的万能逼近定理
这是我见过的讨论神经网络万有逼近问题的最好的文章。在文章中,给出了最清晰,简洁的构造性证明。揭示了它的本质。 三十年前,我们接触到神经网络的万有逼近问题。发表了几篇文章。这些文章把神经网络能力的来历、优点、缺点,都已…...
【信息系统项目管理师】项目管理过程的三万字大论文
【信息系统项目管理师】项目管理过程的三万字大论文 【信息系统项目管理师】项目管理过程的三万字大论文 【信息系统项目管理师】项目管理过程的三万字大论文1.制定项目章程2.识别干系人3.制定范围管理计划4.制定进度管理计划5.制定成本管理计划6.制定质量管理计划7.编制人力资…...
【C++】C++11 ~ 包装器解析
🌈欢迎来到C专栏~~包装器解析 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&a…...
SpringBoot整合(三)SpringBoot发送邮件
使用SpringBoot发送邮件 邮件发送其实是一个非常常见的需求,用户注册,找回密码等地方,都会用到,Spring Boot 中对于邮件发送,提供了相关的自动化配置类,使得邮件发送变得非常容易。 1、前置工作 目前国内…...
【docker知识】联合文件系统(unionFS)原理
一、说明 Docker CLI 操作起来比较简单——您只需掌握Create、Run、InspPull和Push容器和图像,但是谁想过Docker 背后的内部机制是如何工作的?在这个简单的表象背后隐藏着许多很酷的技术, UnionFS(统一文件系统)就是其…...
使用Lame库实现wav、pcm转mp3
文章目录 前言 一、Lame库是什么? 二、使用步骤 0.创建native项目 1.下载Lame库 2.pcm转MP3 3.wav转MP3 4、native方法如下 三、注意 总结 前言 因为使用android录音后生成的文件是wav或者pcm格式,项目要求最后的文件需要是mp3格式,于…...
c++11 标准模板(STL)(std::multimap)(三)
定义于头文件 <map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class multimap;(1)namespace pmr { template <class Key, class T…...
【报复性赚钱】2023年5大风口行业
今天就来和大家分享一下,在时代的洪流下,普通人如何顺应大势抓住机遇! 实现人在风口上,猪都会飞起来。 根据对市场的观察及各平台数据分析结果,结合国家政策和经济专家的分析,小编预测了2023年将会迎来大…...
如何建一个自己网站/今天新闻最新消息
1.拦截器实现登录验证判断 1.1 实现思路 1、有一个登陆页面,需要写一个controller访问页面。2、登陆页面有一提交表单的动作。需要在controller中处理。判断用户名密码是否正确。如果正确,向session中写入用户信息。返回登陆成功。3、拦截用户请求&…...
php动态网站开发唐四薪课后答案/网站建设加推广优化
在Dataguard的备库上应用日志的时候,通常有两个语句,但是这两个语句是有区别的,一个是实时应用,一个是非实时应用。 alter database recover managed standby database disconnect from session; alter database recover managed…...
wordpress网站 添加微信/如何开展网络营销
质数:在大于1的整数中,如果只包含1和本身这两个约数,那么就是素数 试除法: 时间复杂度 O(sqrt(n)) 代码: static boolean prime(int n){if(n < 2) return false;for(int i 2; i < n/i; i){//因为i能被整除&am…...
杭州房产网二手房/南昌seo方案
Vector3(x,y,z)x代表左右,y代表上下,z代表前后 Vector3.magnitude 长度 计算两点之间的距离 。如果只给了一点的话。算出的长度其实就是和Vector3.zero点之间的长度 公式:a2b2c2(勾股定理) 2D:3D: 计算机实现&…...
杭州建设网站哪家好/游戏推广公司怎么接游戏的
据国外媒体报道,苹果在昨日的全球开发者会议上未发布任何硬件产品。此举让部分媒体和专栏作家感到不安,并由此展开讨论。苹果究竟是一家硬件公司,还是一家软件公司?《福布斯》周二发表评论文指出——苹果事实上是一家生态系统公司。 以下为《…...
做网站的基本流程/自己如何注册一个网站
在使用solidworks打开STP文件时通常是打开之后什么模型都没有,其实是软件找不到模板,为什么出现这种情况呢?是因为安装SOLIDWORKS软件后的默认模板一般为空。如何解决SOLIDWORKS打开STP文件时提示找不到模板的方法如下(注意:此方法…...