写在前面

权重这个概念,相信对许多进行过前端开发的小伙伴来说肯定并不陌生,有时候一个样式添加不上,我们就会一个 !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. NLP(六) 分块、句法分析、依存分析

    内置分块器 分块:从文本中抽取短语 import nltk text = 'Lalbagh Botanical Garden is a well known botanical garden in B ...

  2. python接口自动化测试之requests库详解

    前言 说到python发送HTTP请求进行接口自动化测试,脑子里第一个闪过的可能就是requests库了,当然python有很多模块可以发送HTTP请求,包括原生的模块http.client,urll ...

  3. JMeter特点&性能测试工具选型的原则&模拟压力的原理

    1.JMeter自身的特点 1)开源.轻量级.更适合自动化和持续集成(100M左右,LoadRunner 4G左右) 2)学习难度大 3)资料少.全英文 2. 性能测试工具选型的原则 1)成本 a.工 ...

  4. codeforces 864 E. Fire(背包+思维)

    题目链接:http://codeforces.com/contest/864/problem/E 题解:这题一看就很像背包但是这有3维限制也就是说背包取得先后也会对结果有影响.所以可以考虑sort来降 ...

  5. jQuery - 01. jQuery特点、如何使用jQuery、jQuery入口函数、jQuery和DOM对象的区别、jQuery选择器、

    this指的是原生js的DOM对象 .css(“”):只写一个值是取值,写俩值是赋值 window.onload   ===   $(document).ready(); $(“”):获取元素   标 ...

  6. Linux入门基础之一

    Linux 入门基础 一.Linux 系统安装 安装方法网上很多,请自行百度 二.Linux 基本操作 2.1.GNOME图形界面基本操作 操作类似于Windows系统操作 打开每一个文件夹都会打开一 ...

  7. Android studio初次安装启动时弹出unable to access android sdk add-on list提示的解决方法

    一.问题描述 初次安装Android Studio,启动后,报错如下: unable to access android sdk add-on lis 如图: 二.原因分析 AS启动后,会在默认路径下 ...

  8. Session的创建和设置

    1.Session的获取: (1)无参的方法: protected void doGet(HttpServletRequest request, HttpServletResponse respons ...

  9. 即时聊天APP(五) - 聊天界面

    设置界面没什么好说的,无非也就是加了个对话框来二次提醒用户,现在来讲讲聊天界面. 聊天界面初始化时会得到一个参数,就是对方的id,并设置在标题栏的位置,此界面也是使用RecyclerView来展示聊天 ...

  10. Linux 笔记 - 第十八章 Linux 集群之(三)Keepalived+LVS 高可用负载均衡集群

    一.前言 前两节分别介绍了 Linux 的高可用集群和负载均衡集群,也可以将这两者相结合,即 Keepalived+LVS 组成的高可用负载均衡集群,Keepalived 加入到 LVS 中的原因有以 ...