css——优先级(权重)

阅读本文需要一定的css基础如有需要可以先了解一下:css选择器

首先来说一下我们的核心CSS:

层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种 样式表 语言,用来描述 HTML 或 XML(包括如 SVG、MathML、XHTML 之类的 XML 分支语言)文档的呈现。CSS 描述了在屏幕、纸质、音频等其它媒体上的元素应该如何被渲染的问题。
CSS 是开放网络的核心语言之一,由 W3C 规范 实现跨浏览器的标准化。CSS节省了大量的工作。 样式可以通过定义保存在外部.css文件中,同时控制多个网页的布局,这意味着开发者不必经历在所有网页上编辑布局的麻烦。CSS 被分为不同等级:CSS1 现已废弃, CSS2.1 是推荐标准, CSS3 分成多个小模块且正在标准化中。——https://developer.mozilla.org/zh-CN/docs/Web/CSS

css所谓前端三大件中的一员,只要是做前端的,应该都写过css。虽然现在的ui库已经比较完善了,各种设计方案也是符合主流,但是也总有避免不了的需要自定义样式的需求,这时候就展示了我们css功底的时候到了。

在实际项目中有些人对于一些样式的优先级一直很困惑,为什么这个是优先的?为什么那个没有生效?最后不得不采用了一些比较“极端”的方案:内联样式Important。但是一旦这些方案使用的多了,对于后期维护的开发人员来说是极其可怕的:基于现在的Important不得不继续Important下去,最后使得项目的样式权重只会越来越糟。

其实只要了解了css的优先级是如何计算的,根本不用写那么多的Important也能增加你的样式权重,来覆盖之前的样式。目前来说,我认为需要用到Important的场景只有两种:
1、覆盖内联样式的时候
2、编写全局固定样式的时候

那不适用Important的时候我们如何增加我们的css权重呢?多增加我们的选择器描述选择程度:

.myDiv{
  color:red;
}
[id="box"].myDiv{  
  color:green
}
<div id="box" class="myDiv">box</div>    <!-- red -->
<div id="case" class="myDiv">case</div>  <!-- green -->

细心的同学可能已经注意到了上面的id选择器没有直接用#box的方式来作为css的选择器而是使用了属性选择器来匹配。那为什么要这么做呢?可以看下面:

[id="box"]{  
  color:green
}
.myClass{  
  color:red 
}

#case{  
  color:green
}
.myDiv{  
  color:red 
}
<div id="box" class="myClass">box</div>  <!-- red -->
<div id="case" class="myDiv">case</div>  <!-- green -->

是因为id选择器的权重比类选择器和属性选择器都高,而类选择器和属性选择器的权重在同一级别。在使用了属性选择器之后可以使用同一权重的类选择器来覆盖样式,但是id选择器之后无法使用同一权重以下的选择器来增加其权重了。这样一来那又如何增加我们的id选择器的权重呢?

[id="box"]{  
  color:green
}
.myClass{  
  color:red 
}

#case{  
  color:green
}
#case.myDiv{  
  color:red 
}
<div id="box" class="myClass">box</div>  <!-- red -->
<div id="case" class="myDiv">case</div>  <!-- red -->

类似这样,使用组合器在我们id选择器原基础上增加其他选择器来增加权重比。

说到这里,当前的选择器权重比等级是怎么分划的呢?我这里列一下:

类型选择器(例如:h1)和伪元素(例如:::before)<
类选择器 (例:.example),属性选择器(例:[type=“radio”])和伪类(例如::hover)(此处注意:is() 和 :not() 是例外,这俩自身没有权重等级)<
ID 选择器(例:#example) <
内联样式<
important(例:.example!important)

在这里我们使用MDN的方式来说css的权重就是所谓的四位数:

已经知道一个元素选择器比类选择器的优先级更低会被其覆盖。本质上,不同类型的选择器有不同的分数值,把这些分数相加就得到特定选择器的权重,然后就可以进行匹配。
一个选择器的优先级可以说是由四个部分相加 (分量),可以认为是个十百千四位数的 (分离的) 四个位数:

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

注: 通用选择器 (*),组合符 (+, >, ~, ’ '),和否定伪类 (:not) 不会影响优先级。

为什么说分离的四个位数呢?因为虽然这里用了个十百千的说法,但是它们没有进位,低位选择器使用了再多权重分也不会超过高位权重,只会超过同位及更低的权重。

下面写几个例子来说明上面的说法:


.test:hover  {} /* 权重 0011*/
#test:hover  {} /* 权重 0101*/
#test.test:hover  {} /* 权重 0111*/
.a.b.c.d.e.f.g.h.i.j.k{}/* 权重 00(11)0   
这里是我个人理解的写法,无法进位,只在当前位置有11个权重分*/

那么important呢?我看到的说法是无限大。可比无限大,也就是说,∞<∞+0001.。

最后再写一个css 内关于优先级的点吧,缩写方式的优先级更高:margin: 20px > margin-left: 10px

本文资料来源:https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#specificity_2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值