写在前面

权重这个概念,相信对许多进行过前端开发的小伙伴来说肯定并不陌生,有时候一个样式添加不上,我们就会一个 !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篇|你真的了解“权重”吗?的更多相关文章

  1. 前端深入之css篇丨2020年前,彻底掌握css动画【animation】

    写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...

  2. 前端深入之css篇丨初探【transform】,手把手带你实现1024程序员节动画

    写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...

  3. 前端深入之css篇丨2020年前,彻底掌握css动画

    马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所以就导致了 ...

  4. [转] Web前端优化之 CSS篇

    原文链接: http://lunax.info/archives/3097.html Web 前端优化最佳实践第四部分面向 CSS.目前共计有 6 条实践规则.另请参见 Mozilla 开发者中心的文 ...

  5. 前端开发之css篇

    一.css简介 css(Cascading Style Sheets)层叠样式表,是一种为html文档添加样式的语言,主要有两个功能:渲染和布局.使用css主要关注两个点:查找到标签,属性操作 二.c ...

  6. 前端深入之css篇|link和@import到底有什么区别?

    写在前面 在真正的前端开发中,我们很少去写行内样式和内嵌样式,通常都是去引用外部样式. 而在我们学习之初的外部样式表都是用link引入的,但是当后来我们学习的逐渐深入,发现@import也可以引入样式 ...

  7. 前端深入之css篇丨2020年前,彻底掌握css动画【transition】

    写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...

  8. 前端开发之CSS篇四

    一.相对定位 二.绝对定位 三.固定定位 四.z-index 前言 定位有三种:1.相对定位 2.绝对定位 3.固定定位 这三种定位,每种都暗藏玄机,所以要每个单独剖析. 1️⃣   相对定位 1.三 ...

  9. 前端开发之CSS篇三

    主要内容:  一.CSS布局之浮动     二.清除浮动带来的问题     三.margin塌陷问题和水平居中     四.善用父级的的padding取代子级的margin     五.文本属性和字体 ...

随机推荐

  1. P3469 [POI2008]BLO-Blockade 割点 tarjan

    题意 给定一个无向图,问删掉点i,图中相连的有序对数.(pair<x, y> , x != y);求每个点对应的答案 思路 首先我们可以发现,如果这个点不是割点,那么答案就是n-1,如果是 ...

  2. HDU 1003 Max Sum * 最长递增子序列(求序列累加最大值)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  3. 天梯杯 L2-023 图着色问题

    L2-023. 图着色问题 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 图着色问题是一个著名的NP完全问题.给定无向图 G ...

  4. Java内部类的使用小结 形参为什么要用final

    部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文 ...

  5. Java网络编程 -- Netty入门

    Netty简介 Netty是一个高性能,高可扩展性的异步事件驱动的网络应用程序框架,它极大的简化了TCP和UDP客户端和服务器端网络开发.它是一个NIO框架,对Java NIO进行了良好的封装.作为一 ...

  6. Seaborn数据可视化入门

    在本节学习中,我们使用Seaborn作为数据可视化的入门工具 Seaborn的官方网址如下:http://seaborn.pydata.org 一:definition Seaborn is a Py ...

  7. Tomcat9控制台中文乱码的解决方案

    1.网上大部分都是这种方法 注释掉 tomcat 9 安装目录下的conf里的 logging.properties 找到 java.util.logging.ConsoleHandler.encod ...

  8. pageable多字段排序问题

    Sort sort = new Sort(Sort.Direction.DESC, "createdate") .and(new Sort(Sort.Direction.AES, ...

  9. CentOS7 常用命令

    常用命令 1.文件与目录操作 命令 解析 cd /home 进入 ‘/home’ 目录 cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd - 返回上次所在目录 cp file1 fi ...

  10. Vue学习之todolist组件拆分

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...