作者:WangMin

格言:努力做好自己喜欢的每一件事

在讲CSS 选择器权重计算与优先级之前,我们先来了解一下CSS是用来干什么的?CSS是用来通过添加样式使网页更加美观,也就是说CSS是利用选择器来美化网页的,使用户可以在网页上更清晰地找到自己需要的东西。



CSS添加样式的方式:

  • 有内部样式(内部样式就是在html文件中通过标签来添加样式)
  • 外联样式(通过标签将外部的样式css文件引入到html文件中)
  • 还有行间样式,即在元素标签中通过style=" "添加样式;

而添加样式是通过CSS选择器选择指定的标签进行添加的,那么什么是CSS选择器呢?它是怎么起作用的呢?它们之间的优先级是怎样来区别的呢?

样式类型

1、行间样式

就是在一个标签内,直接添加一个 style=‘ ’ ,然后在这里面添加你说需要对标签描述的属性及属性值。格式如下:

<h1 style="font-size:12px;color:#000;">我是行间CSS样式。</h1>

2、内联样式

<head>头部标签中添加 <style type="text/css"> 标签,然后在里面添加对应选择器及其对选择器描述的属性及属性值。格式如下:

<style type="text/css">
h1{font-size:12px;
color:#000;
}
</style>

3、外部样式

单独将对选择器及其对选择器描述的属性及属性值写入到一个css文件中,然后将这个文件以以下方式引入到HTML文件的<head>头部标签中。

<link rel="stylesheet" href="css/style.css">

选择器的种类

选择器 表现形式
ID #id,例如:id="name",id="name_txt"
class .class,例如:class="name",class="name_txt"
标签 p,例如:body,div,p,ul,l
属性 [type='text']
伪类 :hover,例如:就是链接样式,a元素的伪类,4种不同的状态:link、visited、active、hover。
相邻选择器、子代选择器 > +,例如:div>p,带大于号>

css的权重

每一个css的选择器都有一个相对的重要程度值,也就是权重的值,简称“权值”。css通过css选择器的权重占比,来计算css选择规则的总权值,从而确定 定义样式规则的 优先级次序;也就是说css选择规则的优先级 是按照 css选择器的权值的比较 来确定的,选择器的权值越大就优先级就高,优先级越高就决定了该元素在页面中的最终呈现的效果。

css权重的计算规则

权值等级划分, 一般来说是划分4个等级:

类型 权重
内联样式 如: style=" ",权值为1000。
ID选择器 如:#name,权值为0100。
class类选择器,伪类和属性选择器 如.name,权值为0010。
标签选择器和伪元素选择器 如div p,权值为0001。

通配符、子选择器、相邻选择器等的。如: *、>、+,权值为:0000。

继承的样式没有权值,通配选择器定义的规则优先级高于元素继承过来的规则的优先级。

!important

!important 的作用是提升优先级,换句话说。加了这句的样式的优先级是最高的(比内联样式的优先级还高)。

css优先级规则

  • css选择规则的权值不同时,权值高的选择器优先;
  • css选择规则的权值相同时,后定义的选择器规则优先;
  • css属性后面加 !important 时,无条件绝对优先;

总体来说: !important>行间样式 > id选择器 > class选择器||属性选择器 > 标签选择器 > 通配符选择器,注意: !important规则被应用在一个样式声明中时,该样式声明会覆盖CSS中任何其他对该元素的声明,无论它处在声明列表中的哪个位置。但注意使用!important样式很难调试,因为它改变了你样式本来的权值规则。

权值如何进行比较

当两个权值进行比较的时候,是从高到低逐级将等级位上的权重值(如 权值 1000,0,0,0 对应--> 第一等级权重值,第二等级权重值,第三等级权重值,第四等级权重值)来进行比较的,而不是简单的 1000个数 + 100个数 + 10个数 + 1个数 的总和来进行比较的,换句话说,低等级的选择器,个数再多也不会越等级超过高等级的选择器的优先级的。

当两个权值进行比较时,从高位到低位逐位进行比较,从高等级开始比较,如果相同等级的权值相同,再继续进行下一个等级的比较。如果不相同,直接应用相同等级权值比较大的选择器对应的样式。而不是把四个等级的权值加起来进行比较。如果某个样式后面加了 !important,则绝对优先,比内联样式更优先。下面就来举例说明一下吧!

案例1:

<div id="box">
<p class="text">CSS 选择器权重计算与优先级</p>
</div>
#box p{
width:300px;
line-height: 30px;
color:#333;
background:#ccc;
}
div p{
width:300px;
line-height: 40px;
color:#fff;
background:#f00;
}

执行效果如下:



我这里给div中的p进行了两种方式的添加样式(ID选择器+标签选择器、标签选择器+标签选择器),这里根据以上权重值的比较,将第一种方式第一级ID选择器(#box)与第二种方式的第一级标签选择器进行权重比较,因为ID选择器(#box)的权重值为0100,而标签选择器(div)的权重值为0001,所以这里的#boxdiv 优先级要高,网页中显示的就#box p{...}中添加的样式。

案例2:

<div id="box">
<p class="text">CSS 选择器权重计算与优先级</p>
</div>
#box .text{
width:300px;
line-height: 30px;
color:blue;
background:lightgoldenrodyellow;
}
#box p{
width:300px;
line-height: 40px;
color:#fff;
background:#f00;
}

执行效果如下:





我这里给div中的p进行了两种方式的添加样式(ID选择器+类选择器、ID选择器+标签选择器),这里根据以上权重值的比较,将第一种方式的样式添加的第一级ID选择器(#box)与第二种方式的样式添加的第一级ID选择器(#box)进行权重比较,因为两个都是ID选择器,权重一致都是0100,所以我们要对两种方式第二级选择器进行比较,第一种方式的第二级选择器为类选择器(.text)权重为0010,第二种方式的第二级选择器为标签选择器(p)权重为0001,因为(.text)权重要大于(p)权重,所以网页中显示的就#box .text{...}中添加的样式。

案例3:

<div id="box">
<p class="text">CSS 选择器权重计算与优先级</p>
</div>
#box .text{
width:300px;
line-height: 30px;
color:blue;
background:lightgoldenrodyellow;
}
div p{
width:300px;
line-height: 40px;
color:#fff;
background:#f00!important;
}

执行效果如下:





这里我举的例子跟案例2是大致一样的,但细心的你们可能发现了我给第二种方式的background属性小小的改动了一下,给它添加了一个!important,根据上面css优先级规则的第三条:css属性后面加 !important 时,无条件绝对优先。所以即使第一种整体的权重值比第二种整体的权重值要高,但第二种方式中的background属性添加了 !important 比第一种方式中的background:lightgoldenrodyellow权重要高,所以网页中div的背景色采用的是第二种方式的background属性。

案例4:

<div id="box">
<p class="text">CSS 选择器权重计算与优先级</p>
</div>
#box .text{
width:300px;
line-height: 30px;
color:blue;
background:lightgoldenrodyellow;
}
#box .text{
width:300px;
line-height: 40px;
color:#fff;
background:#f00!important;
}

执行效果如下:



从上面css中可以看到两个选择器是一样的,所以它们的权重值是一样的。根据上面css优先级规则的二条:css选择规则的权值相同时,后定义的选择器规则优先,所以网页中显示的是后面定义的#box .text{...}中的样式。

案例5:

<div id="box">
<p class="text" style="background:blueviolet;line-height: 25px;color:#fff;">CSS 选择器权重计算与优先级</p>
</div>
#box .text{
width:300px;
line-height: 30px;
color:blue;
background:lightgoldenrodyellow;
}

执行效果如下:

上面的例子,我给p标签添加了行间样式,根据css优先级规则: !important>行间样式 > id选择器 > class选择器||属性选择器 > 标签选择器 > 通配符选择器,所以p标签的行间样式地优先级比#box .text{...}要高,页面显示的是p标签的行间样式的效果,又因为p标签的行间样式中没有width这个属性,所以页面显示的是#box .text{...}中width这个属性。也就是说行间样式和相应选择器中都有的属性,优先执行行间样式的属性,没有的属性就在相应选择器中去找。

以上我只对二级选择器之间的权重问题进行了举例说明,多级选择器之间的权重比较是一样的比较方式。


以上仅是个人见解,若有不足之处欢迎在下方评论指出,那就先分享到这里!! 后续继续更新!!

CSS 选择器权重计算与优先级的更多相关文章

  1. 前端极易被误导的css选择器权重计算及css内联样式的妙用技巧

    记得大学时候,专业课的网页设计书籍里面讲过css选择器权重的计算:id是100,class是10,html标签是5等等,然后全部加起来的和进行比较... 我只想说:真是误人子弟,害人不浅! 最近,在前 ...

  2. CSS 选择器权重计算规则

    其实,CSS有自己的优先级计算公式,而不仅仅是行间>内部>外部样式:ID>class>元素. 一.样式类型 1.行间 <h1 style="font-size: ...

  3. CSS 选择器权重计算规则(转)

    其实,CSS有自己的优先级计算公式,而不仅仅是行间>内部>外部样式:ID>class>元素. 一.样式类型 1.行间 <h1 style="font-size: ...

  4. CSS选择器权重计算

    CSS各种选择器的权重: 1.ID选择器  +100 2.类.属性.伪类选择器   +10 3.元素.伪元素选择器   +1 4.其他选择器   +0 如果有两个CSS样式都作用于某元素,如: #id ...

  5. CSS选择器权重计算规则

    从CSS代码存放位置看权重优先级:内嵌样式 > 内部样式表 > 外联样式表.其实这个基本可以忽视之,大部分情况下CSS代码都是使用外联样式表. 从样式选择器看权重优先级:important ...

  6. css系列,选择器权重计算方式

    CSS选择器分基本选择器(元素选择器,类选择器,通配符选择器,ID选择器,关系选择器), 属性选择器,伪类选择器,伪元素选择器,以及一些特殊选择器,如has,not等. 在CSS中,权重决定了哪些CS ...

  7. css选择器的分类及优先级计算方法总结

    首先声明一下CSS三大特性—— 继承. 优先级和层叠.继承即子类元素继承父类的样式;优先级是指不同类别样式的权重比较;层叠是说当数量相同时,通过层叠(后者覆盖前者)的样式. css选择符分类 首先来看 ...

  8. css选择器权重、样式继承、默认样式

    学过css的小伙伴都是指css选择器的权重 !important Infinity 行间样式 1000 id   100 class|属性|伪类 10 标签|伪元素 1 通配符 0 权重相同 相同cs ...

  9. css选择器万年不变的优先级和权重

    我们在使用CSS对网页元素定义样式时经常会遇到这种情况:要对一般元素应用一般样式,然后在更特殊的元素上覆盖它们.那么我们怎么样来保证我们所新定义的元素样式能覆盖目标元素上原有的样式呢? 在CSS中,会 ...

  10. css选择器权重问题

    important infinity 行间样式 1000(256进制) id 100 class/属性/伪类 10 标签/伪元素 1 通配符 0

随机推荐

  1. Unity UGUI的LayoutElement(布局元素)组件的介绍及使用

    Unity UGUI的LayoutElement(布局元素)组件的介绍及使用 1. 什么是LayoutElement组件? LayoutElement是Unity UGUI中的一个布局元素组件,用于控 ...

  2. Linux 命令:ps

    ps -ef ps -e f # 树形显示

  3. 安装.NET Framework4.5以上版本受阻怎么办?

    安装和卸载 .NET Framework 受阻疑难解答 - .NET Framework | Microsoft Learn Windows RT 8.1.Windows 8.1 和 Windows ...

  4. 我用WebGL打造了一款动态壁纸

    我用WebGL打造了一款动态壁纸 简述 最近在给自己电脑换壁纸的时候发现了一张很有特点的图(就是下面这张),于是我突发奇想,要是能把这张图变成一张动态的壁纸.那该多好.于是我打算用threejs开发一 ...

  5. 《SQL与数据库基础》04. SQL-DQL

    目录 DQL 基础查询 条件查询 分组聚合 聚合函数 分组查询 结果排序 分页限制 总结 本文以 MySQL 为例 DQL 语法结构: SELECT 字段列表 FROM 表名列表 WHERE 条件列表 ...

  6. Anaconda平台下从0到1安装TensorFlow环境详细教程(Windows10+Python)

    1.安装Anaconda Anaconda下载链接:Free Download | Anaconda 下载完成之后,开始安装,修改安装路径至指定文件夹下,由于安装过程比较简单,此处略过: 2.Tens ...

  7. React Native实现Toast轻提示和loading

    React Native 封装Toast 前言 使用react native的小伙伴都知道,官方并未提供轻提示组件,只提供了ToastAndroid API,顾名思义,只能再安卓环境下使用,对于ios ...

  8. Deep Transfer Learning综述阅读笔记

    这是一篇linkedin发表的深度迁移学习综述, 里面讲了一些对于search/recommend system中的迁移学习应用. 有不少指导性的方法, 看完后摘录出来 对于ranking方向的TL, ...

  9. 一款国产开源 Web 防火墙神器!

    随着开源 Web 框架和各种建站工具的兴起,搭建网站已经是一件成本非常低的事情,但是网站的安全性很少有人关注,以至于 WAF 这个品类也鲜为人知. 一.WAF 是什么? WAF 是 Web 应用防火墙 ...

  10. js获取当前月的天数

    //取得本月天数(实际代码:) var now=new Date(); var d = new Date(now.getFullYear(),now.getMonth()+1,0); var days ...