CSS 之层叠规则(权级、权重、顺序)详解

2023-11-16

参考

项目 描述
MDN WEB Docs 优先级
Amily_mo 令人烦恼的css选择器权值问题 - Amily_mo
深入解析CSS 基思·J.格兰特 / 黄小、高楠 译
MDN WEB Docs :not()

描述

项目 描述
Edge 110.0.1587.50 (正式版本) (64 位)
在线流程图制作工具 ProcessOn ProcessOn

定义

在开始相关介绍前,请允许我在此对后续所出现的部分术语进行描述。

项目 描述
声明 CSS 属性及其属性值被称为一个声明(当然,还包括末尾的英式分号)。
方式 选中被描述目标的方式(通过各种选择器、内联样式等),方式包含了单一方式及复杂方式。
复杂方式 选中被描述目标时采用了多种单一方式的方式。
单一方式 选中被描述目标的方式(仅使用 单个 选择器或 使用内联样式等方式选中目标)。

注:

此处的定义描述在阅读本文前不必第一时间清除明白,但请了解,以便在本文后续内容中出现相关定义时知道在何处查询该定义的含义。

层叠

层叠与冲突

CSS 是一系列的样式声明,当多个 CSS 片段对同一目标的同一CSS 属性进行赋值操作时,将发生冲突。CSS 层叠提出了一系列规则,它决定了如何解决冲突,是 CSS 语言的基础。对于冲突,请参考如下示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS 之层叠、权级跃迁问题</title>
    <!-- 样式 -->
    <style>
        /* 使用通配符选择器覆盖(部分)
        浏览器提供的用户代理样式表 */
        * {
            margin: 0px;
            padding: 0px;
            box-sizing: border-box;
        }

        div {
            width: 150px;
            height: 150px;
        }

        #container {
            background-color: salmon; /* 浅橙色 */
        }
        
        .container {
            background-color: dodgerblue; /* 闪蓝色、道奇蓝 */
        }
    </style>
</head>

<body>
    <div class="container" id="container"></div>
</body>

</html>

执行结果

#container.container 选择器对同一目标的 background-color 属性进行描述时,样式发生了冲突。CSS 层叠 决定了位于 #container 选择器中的 background-color 的属性值将生效。

注:

冲突发生在 CSS 声明之间,而非方式(选中被描述目标的方式,通过各种选择器、内联样式等)之间。因此,当发生样式冲突时,落选声明所处的方式中的其它所有声明并不会都因此而失效。对此,请参考如下示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS 之层叠、权级跃迁问题</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
            box-sizing: border-box;
        }

        div {
            width: 150px;
            height: 150px;
        }

        #container {
            /* 存在冲突的声明 */
            background-color: salmon; /* 浅橙色 */
        }

        /* 样式冲突发生时,落选声明所处的方式 */
        .container {
            /* 不存在冲突的声明 */
            border-radius: 50%;
            /* 存在冲突的声明 */
            background-color: dodgerblue; /* 闪蓝色、道奇蓝 */
        }
    </style>
</head>

<body>
    <div class="container" id="container"></div>
</body>

</html>

执行结果

可见,虽然 .container 中与 background-color 有关的声明在发生样式冲突后失效了,但这并没有导致该方式下的其它声明失效,比如 border-radius (你可以为该属性指定一个属性值作为半径,该属性将依据该属性值为目标设置圆角边框样式)。

规则

CSS 的层叠规则主要有三类,即权重、顺序以及权级。

权重(优先级)

你采用何种方式为目标添加样式将影响声明在样式存在冲突的情况下该声明所具有的权重。对于方式与权重的对应关系,请参照下表:

项目 权重
!important 10000
内联样式 1000
id 选择器 100
class 选择器、伪类选择器、属性选择器 10
元素选择器、伪元素选择器 1
通配符选择器 (*)、关系选择符 (+、 >、 ~、空格)、否定伪类选择器 (:not() 0

注:

否定伪类选择器 :not() 可以将一个或多个以逗号分隔的选择器列表(不得为另一个否定选择器或伪元素)作为其参数,位于 :not() 选择器的参数列表中的选择器所描述的目标将不会被选择。

虽然否定伪类选择器对声明的权重值毫无影响,但其参数列表中的选择器能够对样式的权重造成影响。对此,请参考如下示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS 之层叠、权级跃迁问题</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
            box-sizing: border-box;
        }

        div {
            width: 150px;
            height: 150px;
        }

        #container {
            background-color: salmon; /* 浅橙色 */
        }

        /* 选中 class 属性值为 container 且元素的 id 属性值不得为 test 的元素 */
        .container:not(#test) {
            background-color: dodgerblue; /* 闪蓝色、道奇蓝 */
        }
    </style>
</head>

<body>
    <div class="container" id="container"></div>
</body>

</html>

执行结果

权重值的叠加

采用不同方式对同一样式进行描述时,相关声明所获得的权重值可以发生叠加。对此,请参考如下示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS 之层叠、权级跃迁问题</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
            box-sizing: border-box;
        }

        div {
            width: 150px;
            height: 150px;
        }

        #container div {
            background-color: salmon; /* 浅橙色 */
        }

        #container .box {
            background-color: dodgerblue; /* 闪蓝色、道奇蓝 */
        }
    </style>
</head>

<body>
    <div id="container">
        <div class="box"></div>
    </div>
</body>

</html>

执行结果

在对权重值进行累加后,#container div 中的声明的权重值为 100 + 1 = 101。而 #container .box 中的声明的权重值为 100 + 10 = 110。由于 #container box 的权重值更高,在发生样式冲突后,将优先使用 #container box 中的声明。

顺序

发生样式冲突后,若在多个方式中的声明的权重值相同,那么后面的 CSS 声明将覆盖前面的 CSS 声明。对此,请参考如下示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS 之层叠、权级跃迁问题</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
            box-sizing: border-box;
        }

        div {
            width: 150px;
            height: 150px;
        }

        .container_1{
            background-color: salmon; /* 浅橙色 */
        }

        .container_2{
            background-color: dodgerblue; /* 闪蓝色、道奇蓝 */
        }
    </style>
</head>

<body>
    <div class="container_1 container_2"></div>
</body>

</html>

执行结果

权级

权级

使用不同的方式为目标赋予样式将为相关的声明赋予相应的权级。方式与权级及权重值的对应关系,请见下表:

项目 权重值 权级
!important 10000 5
内联样式 1000 4
id 选择器 100 3
class 选择器、伪类选择器、属性选择器 10 2
元素选择器、伪元素选择器 1 1
通配符选择器 (*)、关系选择符 (+、 >、 ~、空格)、否定伪类选择器 (:not() 0 0

注:

CSS 声明的权级由复杂方式中出现的权级最高的单一方式所决定,例如:

/* 该复杂方式中的声明的权级由单一方式 id 选择器决定,
   故该复杂方式的权级为 3 */
#id .class div{} 

/* 该复杂方式中的声明的权级由单一方式 id 选择器决定,
但由于该方式中与 background-color 的相关声明使用了
!important 规则,故声明 color: 'salmon'; 的权级为 3,而
background-color: 'dodgerblue' !important; 的权级为 5。*/
#id .class div{
    color: 'salmon';
    background-color: 'dodgerblue' !important;
}
层叠规则的运用
顺序

在对声明的进行优先级判断(在样式冲突发生时,使用哪一个声明)时,层叠规则的使用是具有一定顺序的。

首先,你将使用 CSS 层叠规则中的 权级规则对声明的优先级进行判断。在判断无果后,你将使用权重规则对声明的优先级进行判断。若仍旧没有结果,那么你将使用顺序规则对声明的优先级进行判断。具体的流程,请见位于下方的流程图:

尾声

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSS 之层叠规则(权级、权重、顺序)详解 的相关文章

  • 绝对定位的表头 (th) - 哪个浏览器是错误的?

    这个带有一个绝对定位列的简单表格在 Firefox 和 IE 中的呈现方式与在 Chrome 和其他基于 Webkit 的浏览器 中的呈现方式不同 http jsfiddle net WZ6x8 http jsfiddle net WZ6x
  • CSS 中的边框图像开头

    MDN 是这样定义的边框图像开始 https developer mozilla org en docs Web CSS border image outset border image outset 属性描述了边框的数量 图像区域超出边框
  • Img srcset 和尺寸属性

    我正在尝试制作一个简单的网站img标签 将使用新的srcset属性 主要思想是根据屏幕分辨率更改图像 src 工作示例 http pixelteam pl surprise some files index html 问题在于sizes 正
  • 手机上猫头鹰轮播的高度

    我有一个使用 Owl Carousel 覆盖桌面上整个屏幕的图像 当我在手机设备上查看相同的图像时 它仅占用屏幕尺寸的三分之一 我如何调整高度 使其比手机上当前的高度更高 我读过一些帖子 但作为猫头鹰旋转木马的新手 我不确定我是否做错了什么
  • :target 伪类在 Firefox 中无法正常工作

    我正在使用 target 伪类制作一个具有 CSS 灯箱类型效果的页面 当您单击图像时 会弹出一个包含信息的框 当您单击任意位置时 该框会再次消失 它在 Chrome 和 IE 中运行良好 但在 Firefox 中存在一个奇怪的错误当您将鼠
  • 具有一个 css 类的堆叠图标

    在新的 FontAwesome 4 0 0 中 堆叠项目有 css 样式 span class fa stack i class fa fa square o fa stack 2x i i class fa fa twitter fa s
  • 理解

    我正在尝试在网站中使用所选的图像 假设我有一个简单的网站 用户可以使用以下命令从系统中选择图像
  • Javascript 放大/缩小到鼠标 x/y 坐标

    我设法让鼠标拖动来滚动div 但是用鼠标放大 缩小不完整 它有效 但我希望鼠标指针将图像保持在该位置并同时缩放它 如下所示 我需要使用scrollBy 将滚动返回到缩放之前的上一点 有人知道该怎么做吗 这是某人制作的小提琴https jsf
  • $(this) 在 jQuery 中如何工作

    jQuery 标签是如何实现的 this 到底工作吗 我知道如何使用它 但是 jQuery 如何知道哪个元素是 活动的 用于获取当前项目的原始 Javascript 标签是什么 还是只是 jQuery The this是一个简单的 java
  • Twitter 的 Bootstrap 是否像 Skeleton 一样适合移动设备?

    骨架经过缩放以适应移动浏览器 遵循以下原则响应式网页设计 http www abookapart com products responsive web design Bootstrap 提供同样的功能吗 还没有 http groups g
  • 获取画布上下文的最后一个点的坐标

    我想创建一个arrowTo功能与CanvasRenderingContext2D prototype 为此 我需要获取最后一个点的坐标 例如 var ctx someCanvas getContext 2d ctx moveTo 10 40
  • css 字体 twitter 像关闭按钮一样,我错过了什么?

    twitter 有一个关闭按钮 它是单个字符 x 我需要类似的东西 但是在我检查之后 span x span 我按照 firebug 告诉我的那样创建 css 规则 close button font family Tahoma Arial
  • Rails Active Admin css 与 Twitter Bootstrap css 冲突

    我对 Rails 资产管道有点陌生 所以我可能做错了什么 我正在尝试为我的后端使用 Active Admin 为我的前端应用程序使用 twitter bootstrap css 我将 bootstrap css 添加到 应用程序 资产 样式
  • 数据表“footerCallback”函数未在页脚中显示结果

    我尝试获取每列的总和并将结果显示在页脚中 我在用着 页脚回调 https datatables net reference option footerCallbackDatatables提供的功能 但是它在页脚中没有显示任何内容 数据表解释
  • CSS:如何在模糊的背景上剪切文本?

    我想重新创建以下样式 我想出了以下内容 问题是剪切不会影响模糊滤镜 我不知道如何解决它 这是我的 HTML 代码 glass width 40 height 100 position absolute background rgba 255
  • 阻止通过 GET 传递“提交”按钮值?

    我正在尝试通过 GET 传递表单信息 这很重要 这样人们就可以将表单选择中过滤后的数据发送给其他人 问题是 使用下面的代码 它不仅传递过滤器信息 还传递提交表单值 如下所示 index php month filter Feb year f
  • 获取 byte[]

    我有一个 html 画布 如下所示 output is a base64string of image data var oldImage new Image oldImage onload function var resizeRatio
  • window.open 使用 css 样式

    我想设计我的 window open 目前 我的网页上有一些项目由于解析了某个类而打开 然后在新窗口中打开指定的文本 我想更改字体大小 字体和填充等 这是我的 JavaScript 代码
  • tr 元素周围的边框不显示?

    Chrome Firefox 似乎不渲染边框tr 但如果选择器是 它会渲染边框table tr td 如何在 tr 上设置边框 我的尝试 不起作用 table tr border 1px solid black table tbody tr
  • IE9-11 检测变换样式:preserve-3d

    我为一个项目制作了一个 3d 类型的菜单 自然 IE 会引起问题 因为 IE10 即使 3d 变换工作 也不支持变换样式 preserve 3d 我尝试了解决方法 通过对 3d 菜单容器的每个子元素应用变换 但至少可以说 动画看起来很糟糕

随机推荐

  • vue3 父子组件传参

    父向子传参 父组件
  • bootstrap table复选框选多页勾选

    bootstrap table复选框选多页勾选 在项目中发现 bootstrap table的复选框选中后 翻页操作会导致上一页选中的丢失 api中的 bootstrapTable getSelections 只能拿到当前页的复选框 js
  • 正则表达式大全

    1 匹配中文 u4e00 u9fa5 2 英文字母 a zA Z 3 数字 0 9 4 匹配中文 英文字母和数字及下划线 u4e00 u9fa5 a zA Z0 9 同时判断输入长度 u4e00 u9fa5 a zA Z0 9 4 10 5
  • (Java)leetcode-236 Lowest Common Ancestor of a Binary Tree(二叉树的最近公共祖先)

    题目描述 给定一个二叉树 找到该树中两个指定节点的最近公共祖先 百度百科中最近公共祖先的定义为 对于有根树 T 的两个结点 p q 最近公共祖先表示为一个结点 x 满足 x 是 p q 的祖先且 x 的深度尽可能大 一个节点也可以是它自己的
  • MTK多国语言相关经验总结

    MTK多国语言相关经验总结 一 移植多国语言移植多国语言主要牵涉到对mmi features h 整个工程的宏控定义文件 fontres c 字体资源文件 的修改 并添加相应的字库文件 1 语言宏控的修改在mmi features h文件中
  • 使用C#语言,基于OpenCvSharp 开发摄像头后台,移动物体位置识别 (一)

    刚刚入门OpenCvSharp 也是小白一枚 教程很少 慢慢摸索 边学边记录 文末附链接 效果 要求 Visual Studio 2017 摄像头x1 准备工作 新建一个 Net Framework 控制台应用 右击解决方案 gt 管理解决
  • 京城游戏人-Day13: 获取被点击的 Button 以及其上的文字内容

    京城游戏人 Day13 获取被点击的 Button 以及其上的文字内容 作者 大锐哥 地址 http blog csdn net prevention 获取被点击的 button var button UnityEngine EventSy
  • Centos + docker,Ubuntu + docker介绍安装及详细使用

    docker笔记 常用命令 设置docker开机自启 sudo chkconfig docker on 查所有镜像 docker images 删除某个镜像 docker rmi CONTAINER ID 容器ID 删除所有镜像 docke
  • Linux命令大全!

    系统信息 arch 显示机器的处理器架构 1 uname m 显示机器的处理器架构 2 uname r 显示正在使用的内核版本 dmidecode q 显示硬件系统部件 SMBIOS DMI hdparm i dev hda 罗列一个磁盘的
  • Grid 布局实现九宫格图片动画

    前言 Grid 布局实现九宫格 background position设置背景图像起始位置 速速来Get吧 文末分享源代码 记得点赞 关注 收藏 1 实现效果 2 实现步骤 定义css变量 九宫格中每个宫格的长 宽为w 宫格之间的间距为ga
  • STL容器的线程安全

    众所周知 STL容器不是线程安全的 对于vector 即使写方 生产者 是单线程写入 但是并发读的时候 由于潜在的内存重新申请和对象复制问题 会导致读方 消费者 的迭代器失效 实际表现也就是招致了core dump 另外一种情况 如果是多个
  • firefox os_如何在电视上测试Firefox OS应用

    firefox os One of my responsibilities in my new role in Partner Engineering at Mozilla is testing HTML5 powered apps and
  • 解决git中出现的“bash syntax error near unexpected token ’(‘”错误

    今天来分享一篇关于我在git使用过程中出现的一个错误 错误信息 bash syntax error near unexpected token 翻译过来就是提示我在 这里有错误 而这个错误是我在使用git commit提交时候产生的 我当时
  • 4. Docker 构建镜像

    Docker 构建镜像 docker制作镜像通常是通过两种方式来实现的 第一种是通过容器的 commit 第二种是通过 Buildfile来实现的 docker commit 打包镜像 容器在运行过程中我们难免会做一些修改 比如运行的mys
  • 程序框架---缩进(Python)

    缩进 类定义 函数定义 选择结构 循环结构 with块 行尾的冒号表示缩进的开始 python程序是依靠代码块的缩进来体现代码之间的逻辑关系的 缩进结束就表示一个代码块结束了 同一级别代码块的缩进量必须相同 一般而言 以4个空格或一个TAB
  • OLED透明屏:在广告领域中的应用,为品牌注入更强的视觉冲击

    OLED透明屏作为一项引人注目的技术创新 其独特的透明度和高清晰度为各行各业带来了全新的展示和创意空间 本文将详细介绍其透明度 高对比度 超薄柔性设计以及强大的颜色表现力 并探讨其在零售 汽车和建筑等领域的应用前景 一 透明度 开启全新的透
  • 聊透spring @Configuration配置类

    本章节我们来探索Spring中一个常用的注解 Configuration 我们先来了解一下该注解的作用是 用来定义当前类为配置类 那啥是配置类啊 有啥用啊 这个我们得结合实际使用场景来说 通常情况下 加了 Configuration的配置类
  • 机器学习——决策树(Decision Trees)

    决策树 决策树是机器学习中一种最为常见的算法 顾名思义 决策树是基于树结构来进行决策的 这恰是人类在面对决策问题时一种很自然的处理机制 决策树的生成算法可以说是信息论的一种应用 但它其实只用到了信息论中的一小部分思想 因此对信息论有个基础性
  • Python系列教程-目录

    转载至 http www cricode com 3086 html Python初级教程 Python快速教程 手册 Python基础01 Hello World Python基础02 基本数据类型 Python基础03 序列 Pytho
  • CSS 之层叠规则(权级、权重、顺序)详解

    文章目录 参考 描述 定义 层叠 层叠与冲突 规则 权重 优先级 权重值的叠加 顺序 权级 权级 层叠规则的运用 顺序 尾声 参考 项目 描述 MDN WEB Docs 优先级 Amily mo 令人烦恼的css选择器权值问题 Amily