CSS回顾-CSS样式优先级规则详解

一、引言

在之前梳理 CSS 选择器的文章(CSS 回顾 - CSS 选择器详解)中,我们对 CSS 选择器有了全面的认识。此刻,不妨思考这样一个问题:倘若众多不同类型的选择器均针对 h1 标签设定样式,究竟会呈现何种结果?带着这份疑惑,让我们一同深入探究 CSS 样式优先级的规则奥秘。

二、样式优先级的核心意义

当我们构建复杂的网页布局和设计丰富的交互界面时,样式冲突是难以避免的问题。不同的 CSS 选择器可能会同时作用于一个元素,若没有明确的优先级规则,样式的应用将变得混乱无序。当多个选择器针对同一个元素的同一个属性进行不同的样式设置时,CSS 选择器优先级规则就像一位公正的裁判,决定着最终的样式呈现。

三、基础优先级规则

  1. 重要性声明(!important):使用!important的样式优先级最高,能无视其他规则,但应谨慎用,因其会破坏常规层级,致样式难调试维护,如p { color: red!important; }
  2. 内联样式:写在 HTML 元素style属性中,优先级仅次于!important,与 HTML 耦合紧,不利于复用管理,像<p style="color: blue;">
  3. ID 选择器:无!important和内联样式冲突时优先级高,定位独特元素有效,但过度依赖会使样式调整复杂,如#header { background-color: gray; }
  4. 类选择器、属性选择器与伪类选择器:三者优先级相同且低于 ID 选择器。类选择器可复用,属性选择器依属性选元素,伪类选择器针对特定状态。如.highlight[type="text"]a:hover,冲突时依样式表顺序等综合定优先级。
  5. 元素选择器:基于 HTML 标签名,优先级低,易被覆盖,如p { line-height: 1.5; }
  6. 通配符选择器与继承样式:通配符选所有元素,常用于全局重置,易冲突且可能影响性能,如* { margin: 0; padding: 0; };子元素继承父元素部分样式,自身定义相同属性样式可覆盖,如父设font-family,子可改。

四、优先级计算的规则

4.1 选择器间计算规则

  1. !important拥有最高的优先级(谨慎使用)
  2. 内联样式计算值为1000
  3. ID 选择器计算值为100
  4. 类、属性、结构、伪类选择器计算值为10
  5. 标签选择器计算值为1
  6. 通配符选择器计算值为0

计算值的作用就是为了我们更好的去计算样式的权重大小,权重大的样式就会生效。请看下面的实例:

页面结构:

<div id="box">
  <ul class="list">
    <li><span>标签</span></li>
  </ul>
</div>

样式示例:

/* 基础样式 权重:类 + 后代 + 标签 = 21 */
.list li {
  background-color: red;
}
/* 第一种情况 权重:属性 + 后代 + 标签 = 21 */
[class] li {
  /* 生效:权重相同则后设置的会覆盖 */
  background-color: yellow;
}
/*  第二种情况 权重:标签 + 类 + 后代 + 标签 = 22 */
ul.list li {
  /* 生效:增加了一个标签选择器,权重增加 */
  background-color: red;
}

注意:慎用!important、内联、ID选择器权重太高不好做样式覆盖。

4.2 样式表的顺序

即便各个选择器拥有各自的计算权重值,但当权重值相同的情况出现时,样式表中的顺序将成为决定胜负的关键因素。即靠后的样式规则将优先生效。在涉及多个 CSS 文件引入的复杂场景中,合理安排样式表的加载顺序显得尤为重要,需精心规划,确保样式的预期效果得以准确实现。

4.3 样式的继承(扩展知识)

在 CSS 的样式世界里,部分样式具备默认的继承特性,宛如家族血脉的传承,父元素设定的某些样式将自然而然地传递给子元素。

4.3.1 文本相关样式
  • color:这是最常见的继承样式之一。例如,如果在父元素(如<body>)中设置了color: #333;,那么所有子元素(如<p><div>内的文本等)默认会继承这个文本颜色。这使得整个页面的文本颜色能够保持一致性,除非子元素有自己的color属性设置来覆盖继承的值。
  • font - family:字体家族也会继承。如果在<html>元素上设置了font - family: Arial, sans - serif;,那么所有后代元素的文本字体都会按照这个设置来显示,除非在某个特定的子元素中重新定义了font - family
  • font - size:字号同样可以继承。比如,当<body>元素设置了font - size: 16px;,子元素的文本字号默认会继承这个值,当然,也可以在子元素中单独调整字号大小。
  • font - style:如font - style: italic;这种斜体样式会被继承。如果父元素是斜体,子元素的文本也会默认呈现斜体,不过子元素可以通过将font - style设置为normal来取消继承。
  • font - weight:字体粗细属性也能继承。例如,若父元素设置为font - weight: bold;,子元素文本会继承加粗的样式,同样可以在子元素中重新设置该属性来改变样式。
  • line - height:行高属性具有继承性。它用于控制文本行之间的间距,当在父元素中设置了line - height值后,子元素会继承这个间距设置,有助于保持文本排版的一致性。
  • text - align:文本对齐方式(如text - align: center;)会被继承。这在创建居中对齐的文本块或容器时很有用,子元素会继承父元素的对齐方式,当然也可以单独为子元素设置不同的对齐方式。
  • text - indent:首行缩进属性会继承。例如,在<p>元素的父元素中设置了text - indent: 2em;,那么<p>元素的首行文本会默认缩进两个字符宽度。
  • text - transform:包括text - transform: uppercase;(转换为大写)、text - transform: lowercase;(转换为小写)等文本转换方式会被继承。如果父元素设置了文本转换,子元素文本也会进行相同的转换,除非子元素重新定义该属性。
  • letter - spacing:字间距属性是可继承的。它用于调整字符之间的间隔,当在父元素中设置了letter - spacing值后,子元素会继承这个字间距设置。
  • word - spacing:词间距属性同样可以继承。如果父元素设置了word - spacing,子元素会继承这个用于控制单词之间间隔的属性。
4.3.2 列表相关样式
  • list - style - type:这个属性用于定义列表项的标记类型(如disccirclesquare等用于无序列表,decimallower - roman等用于有序列表),它会被继承。如果在<ul><ol>的父元素中设置了列表样式类型,子列表会继承这个标记样式。
  • list - style - position:用于确定列表项标记的位置(如insideoutside),它会被继承。这有助于保持列表的一致性,子列表会继承父列表标记的位置设置。
4.3.3 表格相关样式
  • caption - side:用于指定表格标题的位置(如topbottom),它会被继承。如果在<table>的父元素中设置了标题位置,子表格会继承这个设置。
  • border - collapse:用于控制表格边框是否合并,它会被继承。当在父表格中设置了border - collapse属性后,子表格会继承这个边框合并的设置,以保持表格样式的一致性。
4.3.4 其他样式
  • visibility:这个属性用于控制元素是否可见(如visibility: hidden;visibility: visible;),它会被继承。不过需要注意的是,当一个元素设置为visibility: hidden;时,它虽然不可见,但仍然占据页面空间,而子元素也会继承这种不可见状态,除非子元素重新设置visibilityvisible

五、样式优先级冲突的最佳实践

在实际开发过程中,当多个样式针对同一属性设定,且权重恰好相同,样式优先级冲突便悄然降临,往往导致页面效果偏离预期。为有效规避此类问题,我们可从以下几个方面着力:

  1. 合理规划选择器:优先用类选择器,避免过度依赖 ID 选择器。如按钮用.button类设基本样式,可扩展.button-primary等。
  2. 模块化样式设计:按功能或区域划分样式,模块内用低特异性选择器,如头部菜单用.header-menu类。
  3. 利用计算权重技巧:覆盖样式时适当增加权重值,避免过度嵌套,可借助 CSS 预处理器特性,如 Sass 的&符号。
  4. 遵循样式表组织规范:控制加载顺序,团队协作建立统一命名和结构规范。

六、总结

CSS 选择器优先级是 CSS 样式设计中一个核心但又复杂的概念。理解内联样式、不同类型选择器的优先级、特异性计算方法、! important规则以及继承对优先级的影响,能够帮助我们更好地控制网页元素的样式。在实际开发中,合理地运用这些规则,避免过度依赖! important,可以创建出清晰、可维护且高质量的 CSS 样式表,让网页的视觉效果更加完美。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922853.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码管理之Gitlab

文章目录 Git基础概述场景本地修改未提交&#xff0c;拉取远程代码修改提交本地&#xff0c;远程已有新提交 GitIDEA引入Git拉取仓库代码最后位置 Git基础 概述 workspace 工作区&#xff1a;本地电脑上看到的目录&#xff1b; repository 本地仓库&#xff1a;就是工作区中隐…

【FPGA】Verilog:利用 4 个串行输入- 串行输出的 D 触发器实现 Shift_register

0x00 什么是寄存器 寄存器(Register)是顺序逻辑电路中使用的基本组成部分之一。寄存器用于在数字系统中存储和处理数据。寄存器通常由位(bit)构成,每个位可以存储一个0或1的值。通过寄存器,可以设计出计数器、加法器等各种数据处理电路。 0x01 寄存器的种类 基于 D 触发…

HTML实现 扫雷游戏

前言&#xff1a; 游戏起源与发展 扫雷游戏的雏形可追溯到 1973 年的 “方块&#xff08;cube&#xff09;” 游戏&#xff0c;后经改编出现了 “rlogic” 游戏&#xff0c;玩家需为指挥中心探出安全路线避开地雷。在此基础上&#xff0c;开发者汤姆・安德森编写出了扫雷游戏的…

微信小程序+Vant-自定义选择器组件(单选带筛选

实现效果 筛选是filter&#xff0c;搜索框如有显隐需要&#xff0c;需自行添加配置显隐参数弹出层高度样式需要手动修改&#xff0c;需自行添加配置高度参数.json文件配置"component": true, 实现代码 组件代码 <van-popup show"{{ show }}" posit…

【Linux课程学习】:环境变量:HOME,su与su - 的区别,让程序在哪些用户下能运行的原理,环境变量具有全局性的原因?

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 HOME环境变量&#xff1a; PWD环境变量&#…

Java基础 设计模式——针对实习面试

目录 Java基础 设计模式单例模式工厂模式观察者模式策略模式装饰器模式其他设计模式 Java基础 设计模式 单例模式 单例模式&#xff08;Singleton Pattern&#xff09; 定义&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。适用场景&…

QRCode.toDataURL() vue3 uniapp h5在 Android环境下二维码显示不出来

“qrcode”: “^1.5.4” 修改前&#xff08;在浏览器里面是可以加载的&#xff09;&#xff1a; 查资料好像是Android上加载的是canvas&#xff0c;不是加载的img。 修改后&#xff1a; 这里val其实打印出来是svg代码&#xff0c;所以用v-html就好了。

数据结构——排序算法第一幕(插入排序:直接插入排序、希尔排序 选择排序:直接选择排序,堆排序)超详细!!!!

文章目录 前言一、排序1.1 概念1.2 常见的排序算法 二、插入排序2.1 直接插入排序2.2 希尔排序希尔排序的时间复杂度 三、选择排序3.1 直接选择排序3.2 堆排序 总结 前言 时间很快&#xff0c;转眼间已经到数据结构的排序算法部分啦 今天我们来学习排序算法当中的 插入排序 和 …

第32周:猴痘病识别(Tensorflow实战第四周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 1.3 查看数据 二、数据预处理 2.1 加载数据 2.2 可视化数据 2.3 再次检查数据 2.4 配置数据集 2.4.1 基本概念介绍 2.4.2.代码完成 三、构建CNN网络 四、编译 五、训练模型 六、模型评估 6.1 Loss和Accuracy…

【创建型设计模式】工厂模式

【创建型设计模式】工厂模式 创建型设计模式第二期&#xff01;本期介绍简单工厂模式和工厂方法模式。 简单工厂模式 简单工厂模式&#xff08;又叫作静态工厂方法模式&#xff09;&#xff0c;其属于创建型设计模式&#xff0c;简单工厂模式不属于设计模式中的 23 种经典模…

【Linux】安装cuda

一、安装nvidia驱动 # 添加nvidia驱动ppa库 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update# 查找推荐版本 sudo ubuntu-drivers devices# 安装推荐版本 sudo apt install nvidia-driver-560# 检验nvidia驱动是否安装 nvidia-smi 二、安装cudatoolkit&…

上天入地 灵途科技光电技术赋能空间感知

近来&#xff0c;人工智能技术频频亮相各大马拉松赛事&#xff0c;成为引人注目的科技亮点。 11月3日&#xff0c;杭州马拉松首次启用了机器狗作为配速员&#xff0c;以稳定的节奏为选手提供科学的跑步节奏。 11月11日&#xff0c;亦庄半程马拉松的终点处&#xff0c;人形机器…

Java三大特性:封装、继承、多态【详解】

封装 定义 隐藏对象的属性和实现细节&#xff0c;仅对外公开接口&#xff0c;控制在程序中属性的读取和修改的访问级别便是封装。 在开发中造一个类就是封装&#xff0c;有时也会说封装一个类。封装可以隐藏一些细节或者包含数据不能被随意修改。 比如这是一个敏感的数据&a…

40分钟学 Go 语言高并发:【实战】并发安全的配置管理器(功能扩展)

【实战】并发安全的配置管理器&#xff08;功能扩展&#xff09; 一、扩展思考 分布式配置中心 实现配置的集中管理支持多节点配置同步实现配置的版本一致性 配置加密 敏感配置的加密存储配置的安全传输访问权限控制 配置格式支持 支持YAML、TOML等多种格式配置格式自动…

【ChatGPT大模型开发调用】如何获得 OpenAl API Key?

如何获取 OpenAI API Key 获取 OpenAI API Key 主要有以下三种途径&#xff1a; OpenAI 官方平台 (推荐): 开发者用户可以直接在 OpenAI 官方网站 (platform.openai.com) 注册并申请 API Key。 通常&#xff0c;您可以在账户设置或开发者平台的相关页面找到申请入口。 Azure…

苹果系统中利用活动监视器来终止进程

前言 苹果系统使用的时候总是感觉不太顺手。特别是转圈的彩虹球出现的时候&#xff0c;就非常令人恼火。如何找到一个像Windows那样任务管理器来终止掉进程呢&#xff1f; 解决办法 Commandspace 弹出搜索框吗&#xff0c;如下图&#xff1a; 输入“活动”进行搜索&#xff…

实战项目负载均衡式在线 OJ

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能自己实现负载均衡式在线 OJ。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1…

python Flask指定IP和端口

from flask import Flask, request import uuidimport json import osapp Flask(__name__)app.route(/) def hello_world():return Hello, World!if __name__ __main__:app.run(host0.0.0.0, port5000)

burp suite-1

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

【Spring boot】微服务项目的搭建整合swagger的fastdfs和demo的编写

文章目录 1. 微服务项目搭建2. 整合 Swagger 信息3. 部署 fastdfsFastDFS安装环境安装开始图片测试FastDFS和nginx整合在Storage上安装nginxnginx安装不成功排查:4. springboot 整合 fastdfs 的demodemo编写1. 微服务项目搭建 版本总结: spring boot: 2.6.13springfox-boot…