CSS样式特异性5层次详解

news2024/10/6 20:41:12

你好,我是云桃桃。

一个希望帮助更多朋友快速入门 WEB 前端的程序媛。

云桃桃-大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端工具”,可获取 Web 开发工具合集

293篇原创内容-更多前端系列内容可以go公众.h:云桃桃

后台回复“前端工具”可获取开发工具,持续更新中

后台回复“前端基础题”可得到前端基础100题汇总,持续更新中

后台回复“前端电子书”可获取20+本精选电子书

前言

在 CSS 中,特异性(Specificity)是一个决定页面中哪些样式规则应用到特定元素的规则集。当多个规则都适用于同一个元素时,特异性决定了哪个规则将被应用。理解特异性对于编写清晰、可预测的 CSS 代码至关重要。

那我们一起来看看吧。

特异性的层次

特异性有 5 个层次,从高到低依次是:

  • 内联样式:直接在 HTML 元素的style属性中声明的样式,特异性最高。

  • ID 选择器:使用#定义的,如#header

  • 类选择器、属性选择器和伪类:使用.定义的类选择器,如.highlight,使用[attribute]定义的属性选择器,如[type="text"],以及伪类,如:hover

  • 元素和伪元素选择器:元素选择器,如pdiv,以及伪元素选择器,如::before

  • 通用选择器(*):*。

也就是一个优先级公式:内联样式 > ID 选择器 > 类选择器、伪类、属性选择器 > 元素选择器、伪元素选择器 > 通用选择器(*)

假设我们有以下 CSS 规则:

p {
  color: blue;
}

#main p {
  color: green;
}

p.highlight {
  color: red;
}

效果如下:

图片

也就是说,如果一个<p>元素同时拥有id="main"class="highlight",那么它的文本颜色将会是绿色,因为 ID 选择器的特异性高于元元素和类选择器。

计算特异性的规则

特异性是通过计算每个选择器的层次值来确定的。具体来说,特异性的计算规则如下:

  • 内联样式:加 1000 个特异性值。

  • ID 选择器:每个 ID 加 100 个特异性值。

  • 类、属性和伪类选择器:每个类、属性或伪类加 10 个特异性值。

  • 元素和伪元素选择器:每个元素或伪元素加 1 个特异性值。

  • 通用选择器(*):加 0 个特异值。

如果有多个选择器,它们的特异性值会相加。

例子:以下 CSS 规则,如注释说明,所以文字显示的是,蓝色。

/* 特异性:101 */
#content p {
  color: green;
}

/* 特异性:11 */
p.highlight {
  color: red;
}
<div class="content">
  <!-- 特异性 1000 -->
  <p class="highlight" style="color: blue">This is text.</p>
</div>

特异性是 CSS 中一个复杂但功能强大的概念。掌握了特异性,你就可以更精确地控制页面的样式,避免许多常见的样式冲突问题。

那如果两个或更多具有相同特异性的样式规则应用于同一个元素时,是什么规则呢?遵循以下 2 点:

  • 后者优先:如果有多个相同特异性的规则,最后一个出现的规则会生效。

  • 重要的是优先:如果使用了!important,则该规则会覆盖其他所有非!important规则,它的特异值可以理解为是 10000。比如,上面 css 的最后我们再加入一个规则。

/* 特异性:10001 = p标签是1 + important是10000 */
p {
  background-color: #13dada;
  font-size: 20px;
  color: #fff !important;
}

效果就会变成我们新写的样式了。

图片

虽然!important在 CSS 中是一个强大的声明,它允许你强制浏览器忽略掉其他所有 CSS 规则,使得使用!important的样式规则具有最高优先级。然而,!important也被认为是一种万不得已的糟糕做法...

为什么不建议用 important?

因为它违背了 CSS 的层叠性(Cascading)和特异性原则,使得样式表难以维护和理解。以下是一些可能会考虑使用!important的情况:

  1. 临时覆盖:在紧急情况下快速修复问题,尤其是当你没有时间或权限去修改更具体的选择器或结构时。

  2. 第三方样式覆盖:有时你可能需要覆盖第三方库或框架的样式,而这些样式往往使用了非常具体的选择器。在这种情况下,使用!important可能是一个折衷方案。

  3. 交互状态:在某些情况下,为了确保元素在特定交互状态下(如:hover:active:focus)的样式表现,开发者可能会使用!important

  4. JavaScript 生成的样式:如果 JavaScript 动态生成的样式与 CSS 有冲突,有时候不得不使用!important来确保样式被应用。

  5. 特定类型的修复:在一些罕见的情况下,可能需要修复浏览器的特定 bug 或兼容性问题,这时可能会用到!important

尽管有上述情况,通常建议尽可能避免使用!important。如果发现自己需要频繁使用!important,这通常是一个信号,表明 CSS 代码需要重构。

更好的做法是使用更具体的选择器、利用 CSS 的层叠性原则,或者重新考虑 HTML 结构来自然地达到所需的样式效果。

OK,以上本文完。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FANUC机器人SOCKET断开KAREL程序编写

一、添加一个.KL文件创建编辑断开指令 添加一个KL文件用来创建karel程序中socket断开指令 二、断开连接程序karel代码 PROGRAM SOC_DIS %COMMENT SOCKET断开 %INCLUDE klevccdf VAR str_input,str_val : STRING[20] status,data_type,int_val : INTEGER rel_val : REALBEGING…

全球首发!龙蜥社区助力 Intel SPR 加速器上云

编者按&#xff1a;云原生平台下芯片的竞争力日渐增强&#xff0c;加速器如何在赛道上体现竞争力。龙蜥社区开发者、阿里云高级研发工程师易兴睿介绍运用龙蜥操作系统提供的解决方案&#xff0c;依靠 Intel SPR 平台专用硬件加速器&#xff0c;实现云原生场景下 Envoy 网关加速…

微信小程序 request 配置了服务器域名后 发布体验版无法访问

问题描述 在微信小程序公众平台配置了测试服务器域名后&#xff0c;发布了体验版进行测试&#xff0c;发现网络请求不通&#xff0c;打开调试也依然无法访问。 解决步骤&#xff1a; 1.首先根据小程序文档网络模块的使用说明&#xff0c;一步步排查域名证书是否符合规范&…

Llama3 mac本地部署教程

1.下载的软件清单&#xff1a; ollama下载&#xff1a; Download Ollama on macOS nodejs下载&#xff1a; Node.js — Download Node.js 2.安装 安装Ollama 下载之后打开&#xff0c;直接点击Next以及Install安装ollama到命令行。安装完成后界面上会提示ollama run llam…

在Docker中部署Java应用:Java版本隔离的实践案例

在Docker中部署Java应用&#xff1a;Java版本隔离的实践案例 人生就是一场又一场的相遇&#xff0c;一个明媚&#xff0c;一个忧伤&#xff0c;一个华丽&#xff0c;一个冒险&#xff0c;一个倔强&#xff0c;一个柔软&#xff0c;最后那个正在成长。 背景需求 在软件开发和部…

18 python定制篇-开发平台Ubuntu

第 18 章Linux 之 Python 定制篇-Python 开发平台 Ubuntu 18.1 Ubuntu 介绍 Ubuntu&#xff08;友帮拓、优般图、乌班图&#xff09;是一个以桌面应用为主的开源 GNU/Linux 操作系统&#xff0c;Ubuntu 是基于 GNU/Linux&#xff0c; 支持 x86、amd64&#xff08;即 x64&…

PG修改端口号与error: could not connect to server: could not connect to server 问题解决

刚开始学习PG修改端口号之后数据库端口号没变。 修改端口号&#xff1a;/usr/local/pgsql/data中的postgresql.conf中 修改后并不能直接生效需要重启PG&#xff1a; /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/logfile restart重启后新…

如何免费生成文本二维码?文字生成二维码的方法

随着信息技术的不断发展&#xff0c;文本二维码作为一种简便、高效的信息分享方式&#xff0c;受到了越来越多人的关注和应用。文本二维码是将文本信息编码成二维码的形式&#xff0c;通过扫描二维码即可快速获取文本内容&#xff0c;为信息分享和传播提供了全新的可能性。 便…

美富特 | 邀您参加2024全国水科技大会暨技术装备成果展览会

王涛 四川美源环能科技有限公司 技术总监 报告题目&#xff1a;绿色智慧水岛如何助力工业园区污水及再生水资源化利用降碳增效 拥有十余年的环保行业从业经验&#xff0c;对各类前沿物化、生化及膜技术均有丰富的研发、设计及应用经验&#xff0c;先后参与多项重点核心技术…

跨境电商亚马逊、虾皮等平台做测评要用什么IP?

IP即IP地址&#xff0c;IP地址是指互联网协议地址&#xff08;英语&#xff1a;Internet Protocol Address&#xff0c;又译为网际协议地址&#xff09;&#xff0c;是IP Address的缩写&#xff0c;IP地址是IP协议提供的一种统一的地址格式 功能&#xff1a;它为互联网上的每一…

密码学python库PBC安装使用

初始化 使用环境云服务器&#xff08;移动云可以免费使用一个月&#xff09; 选择ubuntu18.04-64位 第一次进入linux命令行之后是没有界面显示的&#xff0c;需要在命令行下载。 这里按照其他云平台操作即可&#xff1a;Ubuntu18.04 首次使用配置教程(图形界面安装) 记录好登录…

软件工程物联网方向嵌入式系统复习笔记--嵌入式系统基础

1 嵌入式系统基础 1.1 嵌入式系统基础 1.1.1 嵌入式系统概念 嵌入式系统一般定义 是指以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 就像一般的计算机系统包括软件和硬件一样&#xff0c;…

Python: Regular expressions

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; 正则表达式用法 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 311 # Datetime : 2024/4/28 10:37 # User : geovindu # Prod…

德思特手持式频谱分析仪加速公共无线事业的运行

一、公共无线事业中无线电的重要性 提起无线电&#xff0c;许多人或许觉得这是非常老旧的观念。实际上&#xff0c;无线电在我们的生活中占据着非常重要的地位。当前&#xff0c;无线电早已成为受众最广泛的大众媒介。据工业和信息化部资料显示&#xff0c;全球95%的人口都可以…

视频高效批量剪辑,批量调整视频尺寸至1280*720,让视频管理更轻松

视频内容已成为我们日常生活中不可或缺的一部分。无论是社交媒体上的短视频&#xff0c;还是企业宣传的长篇大论&#xff0c;视频都以其直观、生动的形式吸引着我们的注意力。然而&#xff0c;随着视频数量的不断增加&#xff0c;如何高效地管理和剪辑这些视频成为了一个亟待解…

Airmail 5 for Mac:高效电子邮件管理软件

Airmail 5 for Mac作为一款功能强大的电子邮件客户端软件&#xff0c;为Mac用户带来了全新的邮件管理体验。其高效、直观的操作界面&#xff0c;使得用户可以轻松管理各类邮件&#xff0c;提升工作效率。 Airmail 5 for Mac v5.7.4中文激活版 首先&#xff0c;Airmail 5支持多个…

在Ubuntu 22.04上部署WendaSNS

一、前提条件 由于WendaSNS不支持PHP8&#xff0c;因此这里再安装php 7.4版本 1. 增加ondrej/php PPA&#xff0c;提供了多个PHP 版本(会因为网络原因&#xff0c;下载较慢) sudo add-apt-repository ppa:ondrej/php 2.更新包列表 sudo apt update 3.安装 PHP 7.4 及相关…

前端自定义封装图片预览组件(支持多张图片预览 缩放):

封装图片预览组件&#xff1a; <template><div ref"previewWrapper" class"image-preview"><div class"overlay" v-if"showOverlay" click"closePreview"></div><div class"preview-conta…

C语言 | Leetcode C语言题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; #define max(a, b) (((a) > (b)) ? (a) : (b))bool canJump(int* nums, int numsSize){int cover 0;int i;// 只可能获取cover范围中的步数&#xff0c;所以i<coverfor(i 0; i < cover; i) {// 更新cover为从i出发能到达的最大…

OSPF大作业

一&#xff0c;拓扑 二&#xff0c;要求 1&#xff0c;r4为ISP上只配ip&#xff0c;r3与其他设备之间只使用公有IP 2&#xff0c;r3-r5/6/7为MGRE环境&#xff0c;r3为中心 3&#xff0c;整个OSPF的ip地址基于172.16.0.0/16划分 所以设备都可以访问r4的环回 4减少LSA的数量加快…