CSS-0_1 CSS和层叠(样式优先级、内联样式、选择器 用户代理样式)

CSS 的本质就是声明规则

——《深入解析CSS》

文章目录

  • CSS
  • 层叠和优先级
    • 用户代理样式
      • 请和用户代理样式和谐相处
    • 选择器
      • 单选择器的优先级
      • 选择器组的优先级
      • 关于选择器的其他
        • 源码顺序
        • 尽可能的选择优先级低的选择器
    • 内联样式
      • 内联样式和JavaScript
    • !important
      • 多个 !important
    • 碎碎念
      • 常用选择器
        • 单独选择器
        • 组合选择器

CSS

CSS,全称为:Cascading Style Sheets,翻译过来叫 层叠样式表

顾名思义,CSS由 层叠样式表 两部分构成

样式表很好理解,CSS会给引用他的文档内的元素设定各种各样的样式,这些样式通常以键值对的形式出现。这使得CSS看起来就像是一份样式对照表一样,所以叫样式表

但是层叠是什么玩意呢?


层叠,汉语里被用来形容东西都堆在同一个地方的状态

由此可知,CSS的意思是:堆叠在一起作用于同一批元素上的N个样式表

也就是说,CSS的规则是叠加的,元素最终呈现出来的样式是多个CSS样式共同作用的结果。当这些CSS样式之间存在对同一个属性的指定,则需要应用优先级最高的那个,这就是层叠




层叠和优先级

先从最简单的开始,先看这段代码:

<body><h1>我是写在h1里面的文字</h1><p>我是p</p>
</body>

这段代码长这样:

在这里插入图片描述

这两段文字并没有紧贴到左上角,不过我们不会因此觉得奇怪,因为我们知道不同的HTML标签就是会展示出不同默认样式。实际上,默认样式这个称呼不标准,这个东西应该叫:用户代理样式



用户代理样式

用户代理(User Agent) ,是指你用来渲染这个HTML文档的计算机程序,最常见的当然就是浏览器了

所以用户代理样式说白了就是你用的那个浏览器给HTML标签的基础样式

这个样式会随着你所使用的浏览器不同呈现出不同的效果,比如上面那个例子是我在 chrome 里运行的效果,如果把浏览器换成 Firefox,她就会变成这样:

在这里插入图片描述


请和用户代理样式和谐相处

如你所见,不同的浏览器对同一种标签有不同的处理的方式,因此很多人将用户代理样式看作洪水猛兽,恨不得整个界面都用div+span写成以避开用户代理样式带来的影响

事实上,虽然各个浏览器的用户代理样式不尽相同,但原则上是一致的。h1-h6是加粗后的标题,p标签是带margin的独段文字,button是一个审美落后的按钮。HTML之所以要存在这么多标签,不是为了让浏览器给他们写个完美的用户代理样式,而是为了增强代码的可读性,让维护这段代码的其他人理解这个元素的意义,而不是对着一堆div做解谜游戏



选择器

用户代理样式是无法修改的,不过好在她的优先级是最低的,你写的任何css代码都可以轻易的覆盖她,就像这样:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><h1 class="normal_word">我是写在h1里面的文字</h1><p>我是p</p></body>
</html><style>.normal_word {font-weight: normal;}p {font-size: 4em;}
</style>

在这里插入图片描述

我们在style标签中让h1的文字失去的加粗,让p标签中的文字变成了原来的4倍

这种写法,行话叫用 选择器声明样式。由于本文不是主要说明选择器的,所以只在本文最后简单枚举一下常用的选择器


单选择器的优先级

对于 单选择器 来说,优先级遵循以下规律

ID选择器 > 类选择器 = 属性选择器 = 伪类选择器 > 标签选择器 > 通用选择器(*)

用户编写的css规则优先级的本质,其实就是比较所能影响的范围大小。所能影响的范围越小,元素越明确,那他的优先级越高

对单选择器来说:

  • ID选择器 因为在同一个页面中id是唯一的,所以id选择器只指定一个元素,优先级最高
  • 类选择器、属性选择器和伪类选择器 都是可以改变属性/状态一致的一批元素,所以优先级一致,排第二
  • 标签选择器 就更多了,只要是html标签是指定的标签,就都会受到影响,所以优先级更低
  • 通用选择器,所有的元素都会受到影响,几乎没有优先级可言

伪元素属于不同赛道的优先级,他必须依赖其他选择器存在,而且也必须用这种方式去指定他的样式,就像这样:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div id="d"><h1 class="green_word">我是div1中的文字</h1>
</div>
</body>
</html><style>.green_word::after{display: block;content: "我是伪元素";color: red;}#d{color: green;}
</style>

在这里插入图片描述
在这里插入图片描述

虽然我用id选择器要求div下的所有前景色变成绿色,但是使用类选择器+伪元素的前景色属性优先级还是比他高


选择器组的优先级

但是如果是选择器组,情况看起来就会复杂一点

就像这样:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div class="normal_word"><h1 id="h">我是div1中的文字</h1>
</div>
</body>
</html><style>.normal_word {font-weight: normal;}.normal_word h1 {color: green;}#h {color: blue;}
</style>

在这里插入图片描述

类名+标签 的组合让这句话的文字变成绿色,但是 ID选择器 要求这句话的文字变成蓝色

最终的结果显然是ID选择器胜出了


你玩过德州扑克吗?简单来说就是玩家用自己手里的牌凑牌型,然后用凑出的牌型比大小,如果对方手里有比你大的牌型,那你手里的牌点数多大都是输。当双方牌型一样了,那我们就来比谁的点数大

选择器组在比较优先级时候的思路是一样的,选择器组相当于牌型,单选择器相当于点数。先看牌型,如果我有一个id选择器,那即使你手里有一万个类选择器优先级也没有我高


所以上例如果要让文字变成绿色应该这样做:

.normal_word {font-weight: normal;
}.normal_word #h {color: green;
}#h {color: blue;
}

.normal_word #h 的牌型是:类选择器+id选择器,#h 的牌型是 id选择器

id选择器和id选择器互相抵消,前者还有一个类选择器,后者什么都没有了,所以前者胜出,就像这样:

在这里插入图片描述


关于选择器的其他

源码顺序

还有一种情况的优先级值得说明一下,那就是当两者的选择器优先级完全一致的时候,写在后面的样式会覆盖前面的样式,就像这样:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div class="blue_word" id="d"><h1 id="h" class="green_word">我是div1中的文字</h1>
</div>
</body>
</html><style>.blue_word #h {color: blue;}#d .green_word{color: green;}    
</style>

两个选择器的都是 id选择器+类选择器,优先级完全一致,此时文字的颜色由写在后面的样式决定

所以他是绿色的:

在这里插入图片描述

把位置对调你就可以得到蓝色的文字

这个原则更多是用于你在一个页面上引用多个css文件的时候,把针对性越强的内容放在越后面引用,可以保证在选择器优先级一致的情况下应用针对性更强的样式


尽可能的选择优先级低的选择器

这个原则同样是在多个css文件共同工作时体现效力,如果你在前面的css文件中使用优先级太高的样式,会导致后面的针对性样式写起来很别扭



内联样式

你肯定知道,除了上文提到的那种指定元素样式的方式以外,你还可以通过把样式直接声明在元素的 style 属性中以指定这个元素的样式。这种写法我们将其称之为:内联样式

根据上文我们推出来的优先级本质,内联样式的优先级一定是极高的,因为他只能对一个元素生效,所以他比所有的选择器样式优先级都要高

就像这样:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div class="green_word"><h1 id="d" style="color: purple;">我是div1中的文字</h1>
</div>
</body>
</html><style>h1{color: red;}.green_word *{color: blue;}#d {color: green;}
</style>

在这里插入图片描述

我们分别用 标签选择器、类+通用选择器 以及 id选择器指定了文字的不同颜色,但是最终生效的却是元素style属性里面定义的样式。这是内联样式高于所有选择器样式(或者说外部样式)的结果

那你会说了,不对啊,id选择器也是只对一个元素生效,为什么他的优先级没有内联样式高呢?

因为同一个页面里只能有一个ID这个效果,是我们给他加上的,并不是硬性要求,就像这样:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1 id="d">我是div1中的文字</h1><h1 id="d">我是div2中的文字</h1>
</body>
</html><style>#d {color: green;}
</style>

在这里插入图片描述

编辑器会提示你这种写法有问题,但是浏览器是接受的


内联样式和JavaScript

在实际开发中,我们经常会遇到使用JavaScript去修改元素样式的情况

这时候如果你用 element.style.…… 的方式去修改样式,其实你是在给这个元素添加内联样式,这会让所有与之相关的选择器失效

如果是针对性很强的JavaScript代码倒是问题不大,可如果考虑到复用性,这会导致所有引用你的JavaScript包的人想要修改这个元素的样式时感到很别扭

所以更优雅的做法应该是定义一个类选择器,然后在JavaScript中去维护这个元素的类列表



!important

有的时候,我们需要无视前面的所有规则,把某一条规则的优先级提到最高,这就是 !important 的领域了

就像这样:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1 class="red" style="color: blue">我是写在h1里面的文字</h1>
</body>
</html><style>.red {color: red;}h1 {color: green;}
</style>

很显然,根据前面我们已经讲过的规则,我们会得到一段蓝色的文字,就像这样:

在这里插入图片描述


这是因为内联样式优先级最高导致的,可是如果我在h1这个标签选择器的规则中添加 !important,那结果就会截然不同,就像这样:

h1 {color: green !important;
}

在这里插入图片描述

明明是刚刚那段代码中优先级最低的标签选择器的样式,被应用了

这就是 !important 标识的作用,他可以无视所有规则,要求指定的这条规则优先级提升到最高


多个 !important

那你会说了,既然如此,那如果 !important 也层叠了,那怎么办呢?就像这样:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1 class="red" style="color: blue !important;">我是写在h1里面的文字</h1>
</body>
</html><style>.red {color: red;}h1 {color: green !important;}
</style>

不只是标签选择器了,现在连内联选择器也有 !important 了

还记得我们前面提到过的“牌型理论”吗?我们现在把 !important 也当作一个牌型,最大的牌型。所以抵消掉之后,内联样式>标签选择器,所以我们会得到一段蓝色的文字

结果也印证了我们的猜想:

在这里插入图片描述



碎碎念

讲完了,最后整理一下CSS的层叠优先级

  • 首先,CSS样式分两种,一种叫 用户代理样式,一种是 作者样式
    • 用户代理样式是浏览器自带的样式,他的优先级永远比你写的作者样式优先级低
  • 作者样式 又分有两种,一种是 通过选择器选中元素进行指定的外部样式,一种是 直接写在元素内的style属性里的内联样式
    • 内联样式优先级默认比外部样式优先级高
    • 外部样式之间则通过比较选择器的优先级来决定谁的优先级更高
    • 伪元素属于另一个优先级赛道的选择器
  • 当选择器优先级完全一致的时候,应用哪个样式由书写顺序决定
  • 当你想要无视一切优先级规则强制应用一个样式时,可以使用 !important

常用选择器

单独选择器
形式选择器名选择范围
*通用选择器选择所有元素
p元素选择器选择所有指定元素
.className类选择器选择所有class属性中包含className的元素
#IDID选择器选择所有id属性为ID的元素
*[attr=value]属性选择器选择所有attr属性为value的元素
p:hover伪类选择器选定所有p元素的hover状态
p::after伪元素选择器选定所有p元素后面的逻辑元素(没有实体的)
组合选择器
形式选择器名选择范围
A,B选择器列表(分组选择器)选中所有A所有B
A B后代选择器选中A的所有B
A>B直接后代选择器选中A的所有直接子代B
A~B兄弟选择器选择同个父元素下所有排在A后面的同级B(无论是否紧挨A)
A+B接续兄弟选择器选择同个父元素紧挨在A后面的同级B




万分感谢您看完这篇文章,如果您喜欢这篇文章,欢迎点赞、收藏。还可以通过专栏,查看更多与【CSS笔记】有关的内容

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

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

相关文章

【计算机毕业设计】230疫苗预约weixin小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【Linux】Jenkins Pipeline流水线详解及基于Jenkins流水线实现自动更新项目(实战)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

用这个神级提示词插件,能让你的AI绘画工具Stable diffusion提示词直接写中文!

大家好&#xff0c;我是设计师阿威 最近&#xff0c;有同学在使用AI绘画工具 Stable Diffusion的时候和我说&#xff1a;老师&#xff0c;我英文不好&#xff0c;能不能直接让我写中文提示词啊&#xff1f;最好可以直接在SD的输入框就能直接写中文&#xff0c;不用切换网页或者…

Git--Part4--多人协作

theme: nico 在之前的Git博客中&#xff0c;已经把Git本地相关的操作以及远程操作的介绍完了。如下&#xff1a; Git–Part1–基础操作 - 掘金 (juejin.cn)Git–Part2–分支管理 - 掘金 (juejin.cn)Git–Part3–远程操作 & 配置 & 标签管理 - 掘金 (juejin.cn) 这篇文…

vue大作业-端午节主题网站

vue大作业-端午节主题网站介绍 端午节&#xff0c;又称为龙舟节&#xff0c;是中国的传统节日之一&#xff0c;每年农历五月初五庆祝。这个节日不仅是纪念古代爱国诗人屈原的日子&#xff0c;也是家人团聚、共享美食的时刻。今天&#xff0c;我们非常高兴地分享一个以端午节为…

本地运行大语言模型(LLMs)

用例 像PrivateGPT、llama.cpp、Ollama、GPT4All、llamafile 等项目的流行度凸显了本地&#xff08;在您自己的设备上&#xff09;运行大型语言模型&#xff08;LLMs&#xff09;的需求。 这至少有两个重要的好处&#xff1a; 1.隐私&#xff1a;您的数据不会发送给第三方&a…

模拟 IQ 方法的知识

模拟 IQ 调制器&#xff08;用于发射器&#xff09;和 IQ 解调器&#xff08;用于接收器&#xff09;已经使用了数十年&#xff08;[1] 至 [3]&#xff09;。 近推出了新的A/D和D/A转换器&#xff0c;可以直接对1至4 GHz的IF进行采样&#xff1b;在第二、第三和第四奈奎斯特区…

1. zookeeper分布式协调者

zookeeper分布协调者 一、zookeeper介绍1、软件设计架构1.1 单体架构1.2 SOA架构/分布式1.3 微服务架构 二、zookeeper角色1、角色2、选举机制3、znode类型 三、zookeeper集群部署1、环境规划2、安装jdk3、安装配置zookeeper3.1 安装zookeeper3.2 编辑配置文件3.3 创建myid文件…

Navicat for MySQL 11软件下载及安装教程

软件简介&#xff1a; Navicat for SQL Server 是一套专为 SQL Server设计的全面的图形化数据库管理及开发工具&#xff0c;可进行创建、编辑和删除全部数据库对象&#xff0c;例如表、视图、函数、索引和触发器&#xff0c;或运行 SQL查询和脚本&#xff0c;查看或编辑 BLOBs…

彩色图像批处理实例

在数字图像处理过程中&#xff0c;经常需要对一批图像进行处理&#xff0c;下面以自然场景下花背景分割为例&#xff0c;给出其主要处理过程和处理结果。 处理的主要步骤&#xff1a;1. 六张彩色图像存放在flower文件夹中&#xff0c;图像文件名为1.jpg 2.jpg 3.jpg 4.jpg 5.j…

物联网技术-第4章物联网通信技术-4.1计算机网络

目录 1.1计算机网络拓扑与组成 &#xff08;1&#xff09;全连通式网络 &#xff08;2&#xff09;星型网 &#xff08;3&#xff09;环形网 &#xff08;4&#xff09;总线网 &#xff08;5&#xff09;不规则型网 1.2数据交换类型 &#xff08;1&#xff09;电路交换网 &…

supOS数据集成

为解决企业数据孤岛问题&#xff0c;supOS对外提供了天湖能力&#xff0c;APP应用集成到supOS后可以使用supOS的天湖&#xff0c;所有数据归集到天湖&#xff0c;利用supOS的ESB消息总线能力实现各个业务系统的服务注册&#xff0c;对外提供统一消息总线能力&#xff0c;从而解…

GD32调试篇:STLINK驱动下载安装

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 向上代码兼容GD32F450ZGT6中使用 后续项目主要在下面该专栏中发布&#xff1a; https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转…

LabVIEW在SpaceX的应用

结合真实的资料介绍LabVIEW在SpaceX的应用&#xff0c;涵盖自动化测试系统、数据采集与监控、可视化与分析、模块化设计与扩展&#xff0c;以及效率与可靠性的提高。 ​ 自动化测试系统 LabVIEW在SpaceX的自动化测试系统中发挥了关键作用。自动化测试是确保SpaceX火箭及其子系…

Flutter项目,Xcode15, 编译正常,但archive报错

错误提示 PhaseScriptExecution [CP]\ Embed\ Pods\ Frameworks /Users/目录/Developer/Xcode/DerivedData/Runner-brgnkruocugbipaswyuwsjsnqkzm/Build/Intermediates.noindex/ArchiveIntermediates/Runner/IntermediateBuildFilesPath/Runner.build/Release-iphoneos/Runner…

目标检测数据集 - 手机屏幕表面表面缺陷检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;手机屏幕表面缺陷检测数据集&#xff0c;真实采集高质量手机屏幕表面含缺陷图片数据&#xff0c;数据集含多款不同型号和品牌的手机屏幕表面图片数据&#xff0c;包括苹果手机屏、三星手机屏、华为手机屏等数据。数据标注标签包括 Bubble 气泡/水滴、Scr…

openGauss 6.0高可用测试,系统上线前很关键

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

5-10位工程师如何共享工作站算力和软件

在当今数字化快速发展的时代&#xff0c;算力共享已经成为工程师们提高工作效率、优化资源配置的重要手段。 在数字化和信息化的推动下&#xff0c;共享工作站的算力和软件正逐渐成为机械工程师们提升工作效率、优化资源配置的重要途径。那么5-10位工程师如何共享工作站算力和…

等保一体机:多种防护机制,让等保合规简单高效!

自1994年国务院颁布《中华人民共和国计算机信息系统安全保护条例》规定计算机信息系统实行安全等级保护以来&#xff0c;等级保护工作经过了近25年的发展历程&#xff0c;成为了我国网络安全保护的重要举措之一。 2019年12月1日等保2.0正式开始实施&#xff0c;我国网络安全行业…

低压电器航空插座端子

低压电器航空插座的定义和功能 低压电器航空插座通常指在交流电压1200V或直流电压1500V以下工作的电器&#xff0c;其主要功能是连接或断开电路&#xff0c;以实现对电路或非电对象的切换、控制、保护、检测、变换和调节。航空插座具有多种芯数和配置&#xff0c;例如2芯、3芯…