CSS 基础 - Cascade and Inheritance

MDN学习笔记:https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance

CSS是开放网络的核心语言之一,由W3C规范实现跨浏览器的标准化。CSS被分为不同等级:CSS1现已废弃,CSS2.1是推荐标准,CSS3分成多个小模块且正在标准化中。

学习目标

掌握三个基础概念:层叠 cascade、优先级 specificity、继承 inheritance。

层叠 cascade

多个样式应用于同一个元素的时候,层叠的规则决定了发生冲突时应该使用哪条样式。其中有个非常重要的概念就是优先级。

了解层叠的规则需要考虑三个因素(重要程度由高到低):

  1. 重要程度
  2. 优先级
  3. 资源顺序

资源顺序

样式层叠最基本的规则:简单地说就是相同级别(优先级)的规则应用到同一个元素时,实际使用的是最后面的规则。

  1. <style>
  2. h1 {
  3. color: red;
  4. }
  5. h2 {
  6.     color: blue;
  7. }
  8. </style>

  9. <h1>I'm blue.</h1>

  10.  

优先级

当有多个规则同时应用于一个元素时,“范围更小”的规则优先级更高。

  1. <style>
  2. /* 优先级:id > class > elemet */
  3. #orange {
  4. color: orange
  5. }
  6. .class-blue {
  7.     color: blue;
  8. }
  9. h1 {
  10.     color: yellow;
  11. }
  12. </style>

  13. <h1 id="orange" class="class-blue">hello, orange.</h1>

  14. <h1 class="class-blue">hello, blue.</h1>

  15.  
如何计算优先级

使用选择器定义样式的时候,不同的选择器会有不同的优先级。如何计算优先级(优先级由高到低):

  1. 在 style 中声明的内联样式。

  2. 外联样式,选择器

    level 1. ID选择器

    level 2. 类选择器、属性选择器、伪类选择器

    level 3. 元素选择器、伪元素选择器

    通配符(*),组合符(+, >, ~, ''),和否定伪类(:not)不参与优先级计算

优先级 选择器 level 1 | 2 | 3 描述
1 <h1 style="color: blue">   内联样式
2 #identifier { color: blue } 1 | 0 | 0 ID选择器
3 li > a[href*="en-US"] > .inline-warning { color: blue } 0 | 2 | 2 属性选择器,类选择器,元素选择器*2
4 h1 + p::first-letter { color: blue } 0 | 0 | 3 元素选择器*2,伪元素选择器
5 h1{ color: blue } 0 | 0 | 1 元素选择器
避免重复

优先级的作用可以避免重复的CSS,通常给基本元素定义通用的样式,给不同的元素创建对应的类。

  1. <style>
  2. /* <p>定义通用的样式,author定义特定的类。 */
  3. p {
  4. color: orange;
  5. font-size: 20px;
  6. font-family: 宋体;
  7. }
  8. .author {
  9.     font-size: 16px;
  10. }
  11. </style>

  12. <p class="author">作者:王之涣</p>

  13. <p>白日依山尽,黄河入海流。</p>

  14. <p>欲穷千里目,更上一层楼。</p>

  15.  

!important

!important 是个特殊的CSS属性,可以强制覆盖所有其他属性。如下代码,内联样式,id选择器,clss选择器定义在同一个元素上,但是优先级最低的class选择器中的color属性因为定义了!important,拥有最高优先级,覆盖了其他color属性。

  1. <style>
  2. #idSelector {
  3. color: yellow;
  4. }
  5. .class-selector {
  6.     color: orange !important;
  7. }
  8. </style>

  9. <p style="color: green;" id="idSelector" class="class-selector">

  10. I'm orange.

  11. </p>

  12.  

注意,在大型样式表中 !important 会使得阅读和调试 CSS 更困难,除非迫不得已,尽可能避免使用它。尤其是你编辑通用CSS模块或者核心CSS模块的时候,要更加慎重,因为它会导致别人调用你代码的时候,无法覆盖样式。

CSS位置的影响

层叠的规则的作用范围是开发者定义的样式,实际上浏览器会有默认样式,用户也可以自定义样式,它们之间的优先级由低到高:

  1. 用户代理样式表中的声明。(例如:浏览器默认样式,例如 p h1 等标签都有默认样式)
  2. 用户样式表中的常规声明。(由用户设置的自定义样式,这个我也不懂)。
  3. 作者样式表中的声明(这些是web开发人员设置的样式,就是刚才说的内联样式,外联样式的选择器的优先级)
  4. 作者样式表中的 !important 声明
  5. 用户样式表中的 !important 声明

1. 用户代理样式

用户代理样式(user agent stylesheet),就是浏览器默认样式。

参考:

https://www.w3.org/TR/CSS21/cascade.html#cascade

https://www.w3.org/TR/CSS21/sample.html

https://stackoverflow.com/questions/12582624/what-is-a-user-agent-stylesheet

用户代理(user agent),在 web 开发语境中,指的就是浏览器。

参考:https://en.wikipedia.org/wiki/User_agent

每个浏览器都有一个默认样式,比如 <p> 标签默认样式有上下间距,<h1> 标签默认样式是大号字体,这个样式表的级别是最低的,有任何其他声明的样式,都会覆盖这个默认样式。

要注意的是不同的浏览器甚至同一个浏览器的不同版本,可能默认样式是不一样的。

2. 用户样式表

https://superuser.com/questions/594358/modify-chrome-user-agent-stylesheet

用户样式就是用户可以自己设置一个默认的样式,我感觉使用这种方式的人很少,而且它的优先级比开发者样式要低,所以基本不影响我们开发CSS。chrome 的用户样式我也没设置成功,所以我打算直接跳过这里的内容。

继承

一些设置在父元素上的css属性是可以被子元素继承的(如color和font-family),有些则不能(如width)。

哪些属性属于默认继承很大程度上是由常识决定的,使用多了自然会有感觉。

  1. <!-- color会继承,border、padding 不会继承 -->
  2. <style>
  3. .class-1 {
  4. color: orange;
  5. border: 3px solid greenyellow;
  6. padding-top: 30px;
  7. }
  8. </style>
  9. <ul class="class-1">
  10. <li>第一章</li>
  11. <li>第二章 <ul>
  12. <li>2.1</li>
  13. <li>2.2</li>
  14. <li>2.3</li>
  15. </ul>
  16. </li>
  17. <li>第三章</li>
  18. </ul>
  1. <!-- background-color 不会继承 -->
  2. <style>
  3. .class-1 {
  4. border: 3px solid greenyellow;
  5. padding: 50px 0px 0px 50px;
  6. width: 100px;
  7. height: 100px;
  8. background: orange;
  9. }
  10. .class-2 {
  11.     border: 3px solid blue;
  12.     width: 150px;
  13.     height: 150px;
  14. }
  15. </style>

  16. 注意 background-color 也不会继承,只不过默认是透明的,所以嵌套的div看上去像是继承了 background-color

  17. <div class="class-1">

  18. div-1

  19. <div class="class-2">

  20. div-2

  21. </div>

  22. </div>

  23.  

控制继承

https://www.w3.org/TR/css-cascade-3/#inherit-initial

有4个值:

initial(初始):定义成CSS规范中默认的属性,也就是强制(原本会继承的)属性不继承来自父类的值,而是使用()默认的值。

inherit(继承):使当前 CSS 属性的值使用来自父类的值。

unset: 恢复成原来的 inital 或 inherit。原本是 initial 的属性则变成 initial,原本是 inherit 的属性则变成 inherit,其结果不是 initial 就是 inherit。它的作用可以删除级联(cascade)中较早出现的所有其他声明值。

revert: 将属性的值重置为浏览器在其UA样式表中的默认值,就好像该属性没有设置任何CSS一样。该属性值在 caniuse 上比 MDN 上解释更清晰直接:https://caniuse.com/css-revert-value

(然而,在实际测试中,chrome对 unset 和 revert 的显示和 W3C 中的定义是相反的)

  1. <!-- 测试 initial -->
  2. <div style="color: orange;font-size: 30px;">
  3. 外层div设置了color 和 font-size,这2个属性都是可以继承的。
  4. <div>嵌套的div默认继承了 color 和font-size</div>
  5. <div style="color: initial;font-size: initial;">这个 div 设置了 initial</div>
  6. </div>
  1. <!-- 测试 inherit -->
  2. <div style=" border: 10px solid black;padding: 10px;">
  3. 外层 div 设置了 border 和 padding,这两个属性默认不会继承。
  4. <div>嵌套d iv1 没有继承父元素的 border 和 padding 属性</div>
  5. <div style="border: inherit;padding: inherit;">嵌套 div2 开启继承(inherit)</div>
  6. </div>

设置 initial 会把原本不继承的属性强制继承父类,原本就继承的那就没有变化,似乎对于原本就继承的属性设置 initial 和不设置 initial 是一样的,但要注意,你的CSS可能在别的地方被修改,但你可以使用 initial 覆盖级联中其他的值,特别是一些元素自带样式,比如 h1 a标签。

  1. <div style="font-size: 30px;">
  2. 外层div设置了font-size: 30px;
  3. <h1>h1有自己的font-size,覆盖了父元素的font-size</h1>
  4. <h1 style="font-size: inherit;">这个h1被设置了font-size: inherit;</h1>
  5. </div>
  1. <!-- 测试 unset -->
  2. <style type="text/css">
  3. .class-color {
  4. color: orange;
  5. font-size: 30px;
  6. }
  7. .class-color-initial {
  8.     color: initial;
  9.     font-size: initial;
  10. }
  11. .class-color-inherit {
  12.     color: inherit;
  13.     font-size: inherit;
  14. }
  15. .class-color-unset {
  16.     color: unset;
  17.     font-size: unset;
  18. }
  19. div {
  20.     padding-left: 30px;
  21. }
  22. </style>

  23. <div class="class-color">

  24. div 1: set color and font-size

  25. <div>

  26. div 1-1: default

  27. </div>

  28. <div class="class-color-initial">

  29. div 1-2: set initial

  30. <div class="class-color-unset">

  31. div 1-2-1: set unset,父div已经initial,而unset根据父元素

  32. </div>

  33. </div>

  34. <div class="class-color-inherit">

  35. div 1-3: set inherit

  36. <div class="class-color-unset">

  37. div 1-3-1: set unset,父div是inherit,而unset根据父元素

  38. </div>

  39. </div>

  40. <div class="class-color-unset">

  41. div 1-4: set unset

  42. </div>

  43. </div>

  44.  
  1. <!-- 对比 unset 和 revert,在 chrome 中效果令人惊讶 -->
  2. <style>
  3. /* 用带边框的 div 包围 p,是因为这样可以看清楚 p 的 margin */
  4. div {
  5. border: 1px solid black;
  6. margin-bottom: 10px;
  7. }
  8. </style>
  9. <div>
  10. <p>默认p标签,自带margin</p>
  11. </div>
  12. <div>
  13. <p style="margin:unset">margin:unset, 可以看出 unset 是连 p 标签的内置样式都取消</p>
  14. </div>
  15. <div>
  16. <p style="margin:revert">margin:revert, 而 revert 是回复原来,这更像是W3上对 unset 的描述 </p>
  17. </div>

重设所有值

CSS 的 shorthand 属性 all 可以用于同时将这些继承值中的一个应用于(几乎)所有属性。

  1. <!-- 测试 all -->
  2. <div style="color: orange; border: 1px solid black;">
  3. <p>我继承了父元素的 color 和 border</p>
  4. <p style="all: initial;">糟糕,我被 initial 了</p>
  5. </div>

END.

CSS 基础 - Cascade and Inheritance的更多相关文章

  1. CSS基础知识筑基

    01.CSS 简介 CSS 指层叠样式表 (Cascading Style Sheets),对HTML网页内容进行统一外观样式设计和管理,给网页进行各种装饰,让她变得美观,是HTML的化妆师.(Cas ...

  2. 前端开发:css基础知识之盒模型以及浮动布局。

    前端开发:css基础知识之盒模型以及浮动布局 前言 楼主的蛮多朋友最近都在学习html5,他们都会问到同一个问题 浮动是什么东西?  为什么这个浮动没有效果?  这个问题楼主已经回答了n遍.今天则是把 ...

  3. CSS基础总结

    CSS基础总结链接地址:http://segmentfault.com/a/1190000002773955

  4. CSS基础篇之了解CSS和它的基本属性

    CSS是什么? CSS英文全名是Cascading Style Sheets翻译过来就是层叠样式表,它主是把网页表现与内容分离的一种样式设计语言.这种语言能优化我们编程,把东西简化和优化写法,而且不同 ...

  5. HTML5 -入门 (---css样式-------------(css基础与css选择器)---------------------—)

    ---恢复内容开始--- 一css基础入门与css选择器 CSS英文全拼:cascading style sheet 层叠样式表. 在html中使用:要在head中写style标签,所有样式放在sty ...

  6. css 基础---选择器

    1.css基础 selector {property: value} eg: h1 {color:red; font-size:14px;} p { text-align: center; color ...

  7. 妙味课堂——HTML+CSS基础笔记

    妙味课堂的课程讲得非常的清楚,受益匪浅.先把HTML和CSS基础课程部分视频的学习笔记记录如下: padding #PS基础 ##前端需要的PS技能 - PS技能(前端需要):切图.修图.测量 - P ...

  8. WEB前端开发CSS基础样式全面总结

    Web前端开发css基础样式全面总结 颜色和单位的使用 颜色 用颜色的名字表示颜色,比如:red 用16进制表示演示 比如:#FF0000 用rgb数值表示颜色,rgb(红,绿,蓝),每个值都在0-2 ...

  9. css基础不扎实

    写了两周的网页,发现自己的css基础还是很差的,当时培训学习的时候就发现了,我做的页面都特别的别扭和丑吧,在班级上应该是垫底的: 原先只知道用float,不会使用定位,网页连固定定位也不会,现在发现, ...

随机推荐

  1. 洛谷4103 HEOI2014大工程(虚树+dp)

    又是一道虚树好题啊 我们建出来虚树,然后考虑dp过程,我们分别令\(sum[x],mndis[x],mxdis[x],size[x]\)为子树内的路径长度和,最短链,最长链,子树内关键点个数. 对于一 ...

  2. js 面向对象 动态添加标签

    有点逻辑 上代码 thml布局 点击查看代码 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  3. 【NXOpen.UF扩展】修改表达式

    public static class UFExpEx { /// <summary> /// 修改当前部件的表达式 /// </summary> /// <param ...

  4. python中的信号通信 blinker

    信号: 信号是一种通知或者说通信的方式,信号分为发送方和接收方.发送方发送一中信号,接收方收到信号的进程会跳入信号处理函数,执行完后再跳回原来的位置继续执行.常见的linux中的信号,通过键盘输入Ct ...

  5. Scrum Meeting 0531

    零.说明 日期:2021-5-31 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 完成后端管 ...

  6. stm32直流电机驱动与测速

    stm32直流电机驱动与测速 说实话就现在的市场应用中stm32已经占到了绝对住到的地位,51已经成为过去式,32的功能更加强大,虽然相应的难度有所增加,但是依然阻止不了大家学习32的脚步,不说大话了 ...

  7. 认真讲说static关键字

    static 关键字主要有以下四种使用场景 修饰成员变量和成员方法 静态代码块 修饰类(只能修饰内部类) 静态导包(用来导入类中的静态资源,1.5之后的新特性) 修饰成员变量和成员方法(常用) 被 s ...

  8. web性能检测工具lighthouse

    About Automated auditing, performance metrics, and best practices for the web. Lighthouse 可以自动检查Web页 ...

  9. opencv学习(一)——图像入门

    图像入门 一.读取图像 在opencv中使用cv.imread(filename, flags)函数读取图像.filename参数表示读取图像的路径.读取图像的路径应完整给出,且不能含有中文,否则在调 ...

  10. Linux上的多进程间通信机制

    最近项目需要一个类似于Android上广播通信机制,方便多进程间相互通信,可以是一对多,多对一,或者多对多. 大致如下 Linux现有的进程间通信能用的只有 管道 消息队列 信号量(这个还只能算同步机 ...