前端深入之css篇|你真的了解“权重”吗?
写在前面
权重这个概念,相信对许多进行过前端开发的小伙伴来说肯定并不陌生,有时候一个样式添加不上,我们就会一个 !important 怼上去,一切就好像迎刃而解了。但还有的时候,!important也并不能解决我们的问题,下面请跟随我来详细了解一下css的权重吧!
探索权重
指某一因素或指标相对于某一事物的重要程度,其不同于一般的比重,体现的不仅仅是某一因素或指标所占的百分比,强调的是因素或指标的相对重要程度,倾向于贡献度或重要性。
以上是摘自百度百科对“权重”的解释。css中权重就相当于不同选择器之间的排名,那么权重是怎样计算的呢?
- 标签选择器 1
- 类选择器 10
- id选择器 100
- 行内样式 1000
- !important ∞(正无穷)
这也就是为什么我们更改样式不起作用的时候喜欢用!important的原因了,因为放上去就是无穷大,仿佛所有样式都可以正常使用了。但!important真的有这么神奇吗?不妨往下看。
简单练习
分析以下代码中文字的最终颜色。
<div class="myClass" id="myId" style="color:yellow; /* 权重1000 */">不是酸柠檬</div>
<style>
div{
color: pink; /* 权重1 */
}
.myClass{
color: red; /* 权重10 */
}
#myId{
color: blue; /* 权重100 */
}
</style>
通过代码,可以很清楚的了解到权重最大的是1000,所以当前文字应该现在为yellow黄色。
接下来我们加大难度试试。
<div class="myClass" id="myId" style="color:yellow; /* 权重1000 */">不是酸柠檬</div>
<style>
div{
color: pink; /* 权重1 */
}
.myClass{
color: red !important; /* 权重 ? */
}
#myId{
color: blue !important; /* 权重 ?*/
}
</style>
这里文字会显示会显示为blue蓝色,因为此时类选择器的权重是∞+10,id选择器的权重是∞+100所以显示为id选择器的颜色。
那如果我就想让他显示红色呢?我尝试以下代码
.myClass{
color: red !important !important; /* 权重 ? */
}
sorry,!important这样用会造成报错,!important的作用是给当前样式加权重,但不能多次叠加。
深入思考
<div class="myClass" id="myId" style="color:yellow;">不是酸柠檬</div>
<button onclick="document.querySelector('#myId').style.color='green'">改变颜色</button>
<style>
div{
color: pink;
}
.myClass{
color: red !important;
}
#myId{
color: blue !important;
}
</style>
如果不点击按钮,那么文字的颜色将会是id选择器的颜色蓝色,但是点击按钮后是要给元素添加颜色的,此时会显示什么颜色呢?
其实多思考以下就能想到,我们通过id找到了这个元素,然后修改他的颜色,所以本质上修改的是这个div的颜色,也就是行内元素,但是此时id选择器的权重最大,所以点击按钮之后是不会修改成我们想要的绿色的。
那么如果在js中修改时给绿色加权重呢,不妨试一下以下代码
<button onclick="document.querySelector('#myId').style.color='green !important'">改变颜色</button>
sorry,!important也不能这样使用,这不符合js的语法规则,所以无论如何点击,颜色都不会改变的。
结论
通过以上实例,我们了解到了,简单好用的!important在一些场景里也是不好用的,尤其是当你随手拿来一个库使用的时候,你了解不到它内部的权重分布,所以样式操作起来也不能够得心应手。
当然你也不用纠结,一个优秀的库或者框架都是很少使用!important的,当你发现你的样式作用不上的时候,完全可以利用id选择器来增加权重,实现你想要的效果。
!important虽好,也不要乱用哦~
结语
以上就是本文章的全部内容了,如果有不正确的地方欢迎指正。
感谢您的阅读,如果感觉有用不妨点赞/转发。
前端深入系列是一个踩坑系列,是由我本人对工作和学习中所遇到的问题和踩过的坑的一个探索与总结,在此记录分享出去,同时也是对自我技能的一个反思和追问。
前端路漫,踩坑不断。
前端深入系列持续更新中……
以上2019-9-27。
前端深入之css篇|你真的了解“权重”吗?的更多相关文章
- 前端深入之css篇丨2020年前,彻底掌握css动画【animation】
写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...
- 前端深入之css篇丨初探【transform】,手把手带你实现1024程序员节动画
写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...
- 前端深入之css篇丨2020年前,彻底掌握css动画
马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所以就导致了 ...
- [转] Web前端优化之 CSS篇
原文链接: http://lunax.info/archives/3097.html Web 前端优化最佳实践第四部分面向 CSS.目前共计有 6 条实践规则.另请参见 Mozilla 开发者中心的文 ...
- 前端开发之css篇
一.css简介 css(Cascading Style Sheets)层叠样式表,是一种为html文档添加样式的语言,主要有两个功能:渲染和布局.使用css主要关注两个点:查找到标签,属性操作 二.c ...
- 前端深入之css篇|link和@import到底有什么区别?
写在前面 在真正的前端开发中,我们很少去写行内样式和内嵌样式,通常都是去引用外部样式. 而在我们学习之初的外部样式表都是用link引入的,但是当后来我们学习的逐渐深入,发现@import也可以引入样式 ...
- 前端深入之css篇丨2020年前,彻底掌握css动画【transition】
写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...
- 前端开发之CSS篇四
一.相对定位 二.绝对定位 三.固定定位 四.z-index 前言 定位有三种:1.相对定位 2.绝对定位 3.固定定位 这三种定位,每种都暗藏玄机,所以要每个单独剖析. 1️⃣ 相对定位 1.三 ...
- 前端开发之CSS篇三
主要内容: 一.CSS布局之浮动 二.清除浮动带来的问题 三.margin塌陷问题和水平居中 四.善用父级的的padding取代子级的margin 五.文本属性和字体 ...
随机推荐
- Windows平台python验证码识别
参考: http://oatest.dragonbravo.com/Authenticate/SignIn?returnUrl=%2f http://drops.wooyun.org/tips/631 ...
- hdu-6579 Operation
题目链接 Operation Problem Description There is an integer sequence a of length n and there are two kind ...
- VS2017 之 MYSQL实体数据模
Photon Server 和 Unity3D 数据交互: Photon Server 服务端编程 Unity3D 客户端编程 VS2017 之 MYSQL实体数据模 一.新建数据库连接后,点击下一步 ...
- Kubernetes集群部署核心步骤
目录 前言 一.所有节点安装docker 二.所有节点安装kubeadm 三.安装master节点 四.部署网络插件 五.安装node节点 六.运行一个demo 前言 这里使用环境:Ubuntu 18 ...
- 在docker上编译openjdk8
以前曾经试过在VMware上安装linux,再在linux上编译openjdk8,但是每次都不顺利,例如linux环境,预装依赖软件,openjdk源码的选择等环境都会遇到问题,一旦失败再重新开始挺费 ...
- Http和Https相关问题
Http和Https Http(默认端口号80) 超文本传输协议(Http,HyperText Transfer Protocol)是互联网上使用最为广泛的一种网络协议(应用层).设计Http最初的目 ...
- puttdy连接服务器报错No supported authentication methods available (server sent:publickey,gassapi-keyex,gassapi-with-mic)
No supported authentication methods available (server sent:publickey,gassapi-keyex,gassapi-with-mic) ...
- [币严区块链]ETH搭建节点区块数据同步的三种模式:full、fast、light
ETH 全节点Archive(归档)模式数据量增长图 上述图表可通过链接查看:https://etherscan.io/chartsync/chainarchive 通过上表,可以看到截止2019年 ...
- cssrelative
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Java线程的几种状态(基于Oracle jdk 1.8)
Java中线程的状态定义在java.lang.Thread类中的一个枚举中. public enum State { /** * Thread state for a thread which has ...