【CSS in Depth2精译】1.2 继承~1.3 特殊值

文章目录

    • 1.2 继承
    • 1.3 特殊值
      • 1.3.1 `inherit` 关键字
      • 1.3.2 `initial` 关键字
      • 1.3.3 `unset` 关键字
      • 1.3.4 `revert` 关键字

1.2 继承

除了层叠,还有一种给元素设置样式的方式:继承。经常有人把层叠与继承的概念弄混淆。它们虽然有关联,但也应该分辨清楚各自的特点。

如果一个元素的特定属性没有层叠值,则可能会继承某个祖先元素的样式值。在 <body> 元素上设置字体系列 font-family 是很常见的做法。之后其内部的所有元素都将继承该字体,省去了给每个元素手动指定的麻烦。图 1.8 展示了继承是如何沿着 DOM 树向下传播开来的:

图 1.8 被继承的属性从父节点顺着 DOM 树传递至后代节点
图 1.8 被继承的属性从父节点顺着 DOM 树传递至后代节点

然而,并非所有属性都会被继承。默认情况下通常只有那些特定的、我们希望看到的属性被继承下来,主要与文本相关,如:colorfontfont-familyfont-sizefont-weightfont-variantfont-styleline-heightletter-spacingtext-aligntext-indenttext-transformwhite-space 以及 word-spacing

此外也包括一些其他属性,比如列表相关的属性:list-stylelist-style-typelist-style-position 以及 list-style-image;表格边框相关的属性 border-collapseborder-spacing 也会被继承。注意,这些属性控制的是表格的边框行为,表格元素边框以外的常规属性不受影响。(没人希望一个 <div> 元素将其边框样式传递给每一个后代元素吧。)虽然上面罗列的属性算不上最完整,但也基本够用了。

您可以在充分利用继承来设计页面样式,比如在 body 元素上设置字体,让后代元素继承这些样式(如图 1.9 所示)。

图 1.9 给 body 设置 font-family,让其后代元素继承该样式

图 1.9 给 body 设置 font-family,让其后代元素继承该样式

将如下代码添加到您的示例样式表顶部,让继承的样式生效。

代码清单 1.13 将 font-family 应用到父元素

body {font-family: sans-serif; /* 被继承的属性值会传递到后代元素上 */
}

这样添加到 body 的样式会在整个页面生效。若将样式指定到特定元素,则该样式只会被其后代元素继承。被继承的样式会逐级传到后代元素,直到被某个层叠值覆盖。

使用开发者工具

被继承与覆盖的属性值在错综复杂的嵌套结构下会很快变得难以追踪。如果您还不熟悉浏览器的开发者工具,请务必养成使用它们的习惯。

DevTools 开发者工具可以精准查看哪些元素应用了哪些样式规则,以及为什么呈现这些样式。层叠和继承都是抽象的概念;而 DevTools 是目前已知最好的样式追踪手段。在一个页面元素上单击鼠标右键,选择弹出菜单中的 检查(Inspect)或 检查元素(Inspect Element)就能打开该工具。如图 1.x 所示。

图 1.x 浏览器的 DevTools 开发工具是查看元素样式的最佳方式

图 1.x 浏览器的 DevTools 开发工具是查看元素样式的最佳方式

样式检查器显示了目标元素的每个选择器,并按优先级进行排列。选择器样式的下方是继承的所有属性。元素所有的层叠规则与继承样式都一目了然。

还有很多功能细节可以帮助开发人员弄清目标元素当前样式的来龙去脉。靠近顶部的样式会覆盖掉下方的样式。被覆盖的样式会被划掉;右侧给出了每个规则集的样式表名称与行号,以便快速定位到源代码位置。这样就能准确知晓哪个元素继承了哪些样式,以及这些样式的具体来源。此外,还可以在顶部的 Filter 筛选框中筛选出目标样式,同时隐藏其他无关内容。


1.3 特殊值

还有一些特殊的声明值,可以赋给元素的任意属性,以便更好地控制层叠,分别是:inheritinitialunsetrevert。下面逐一进行考察。

细心的您可能已经注意到了,代码清单 1.12 给出的超链接样式与平常略有不同,文字颜色由传统的蓝色改为了白色字体、蓝色背景。这么做正是为了演示上述关键字的效果。

1.3.1 inherit 关键字

有时,当继承的样式被层叠值中断后,又想让继承样式重新生效。此时可以使用 inherit 关键字来实现,强制目标元素从父元素继承所需样式。

假设要在示例页添加了一个浅灰色的页脚,页脚内有一些超链接,但不希望它们太显眼,毕竟页脚不是示例页的重点。这就要把页脚内的超链接设置为深灰色(如图 1.10 所示)。

图 1.10 继承灰色文本的使用条款链接

图 1.10 继承灰色文本的使用条款链接

代码清单 1.14 给出了此页脚的 HTML 结构。将其添加到页面末尾,即关闭标签 </body> 的前面。普通网页在页脚和页头之间会显示更多内容,这里方便演示就不展开了。

代码清单 1.14 带链接的页脚

<footer class="footer">&copy; 2023 Wombat Coffee Roasters &mdash;<a href="/terms-of-use">Terms of use</a>
</footer>

早些时候给示例页上所有的超链接都设置了一些样式,它们也将对《使用条款》的超链接生效。要让页脚内的链接变为灰色,需要用以下代码覆盖原有样式。

代码清单 1.15 inherit 值的应用

.footer {color: #666;  /* 页脚文本设置为灰色 */background-color: #ccc;padding: 15px 0;text-align: center;font-size: 14px;
}
.footer a {color: inherit;  /* 指定文字颜色从页脚继承 */background-color: transparent;  /* 覆盖蓝色背景为透明 */text-decoration: underline;
}

上述代码的第二个规则集用一个名为 inherit 的层叠值覆盖了页脚超链接本来的颜色。这样就继承了父元素 <footer> 的颜色。

这么做的好处是,一旦页脚的样式发生任何改动(例如修改第二个规则集,或者被其他样式覆盖),页脚超链接的样式也会同步跟进。例如,页脚文字在某些页面是较深的灰色,其中的超链接也会随之切换为深灰色。

此外,还可以使用 inherit 关键字来强制继承一个通常不会被继承的属性,比如边框或内边距,尽管在实际开发过程中鲜有用武之地。

1.3.2 initial 关键字

有时可能需要撤销某个元素的样式,正如代码清单 1.15 中撤销背景色那样的效果。此时就可以用关键字 initial 来实现目标。

每一个 CSS 属性都有一个初始值或默认值。如果将样式属性赋值为 initial,则可以将其手动设为该属性的默认样式,好比硬复位了该样式。

设置透明背景不要写成 background-color: transparent,而是使用 initial 值。根据以下代码更新样式。由于 transparent 是背景色属性 background-color 的初始值,最终效果将与上一段代码相同:

代码清单 1.16 initial 值的应用

.footer a {color: inherit;background-color: initial;  /* 将背景色重置为初始值 */text-decoration: underline;
}

这样做的好处是不必考虑太多:想移除一个元素的边框,使用 border: initial 即可;想让元素恢复为默认宽度,使用 width: initial 就搞定了。

可能您已经习惯了用 auto 值来实现诸如此类的重置效果;事实上使用 width: auto 确实也行,因为 width 的默认值本就是 auto

但值得注意的是 auto 并非所有属性的默认值,对许多属性而言,auto 值甚至是无效的。例如 border-width: autopadding: auto 就是无效样式,因此看不到任何效果。您也可以花时间钻研一下这些属性的初始值,但使用 initial 更简单。

注意

样式 display: initial 等价于 display: inline,并且无论加到什么元素上,都不会产生 display: block 的效果。这是因为 initial 会重置为该属性(property)的初始值,而不是该元素(element)的初始值; inline 才是 display 属性的默认值。在这种情况下,应该考虑使用关键字 revert

1.3.3 unset 关键字

关键字 inheritinitial 对于清除继承或非继承属性上设置的样式都非常有用。unset 关键字则是二者的结合:用于继承属性时,其值就是 inherit;用于非继承属性时,其值就是 initial

当然,您也可以分别使用 inheritinitial 来实现目标,但是 unset 用起来更简单,可以避免用错关键字。在示例的页脚上,您可以使用 unset 来修复超链接的字体及背景颜色。

代码清单 1.17 unset 值的应用

.footer a {color: unset;  /* 给能被继承的属性一个 inherit 值 */background-color: unset; /* 给不能被继承的属性一个 initial 值 */text-decoration: underline;
}

这样,文字颜色就设为了 inherit,使其能够继承页脚的灰色字体;而背景色设为了 transparent,它刚好是 background-color 属性的初始值。

注意:恢复链接的下划线样式仍然需要通过 text-decoration: underline 来实现。此时 unset 并不生效,因为 text-decoration 属性的初始值是 none 而非 underline 。请务必牢记:CSS 属性(CSS property)本身的初始值始终保持不变;它不受目标元素具体类型的影响。要“撤消”之前设置的 text-decoration 样式,需要用到另外一个关键字。

1.3.4 revert 关键字

关键字 initialunset 基本上可以覆盖包括作者样式和用户代理样式表在内的所有样式。如果只想覆盖此前设置的作者样式,而保留用户代理样式不变。这就是关键字 revert 的用法。

示例页脚中,如果将所有三个属性设为 revert,则超链接的样式将变为带下划线的蓝色文字(即浏览器默认样式);但我们想要的是灰色字体,因此在关键字的选择上应该更仔细:仅将 revert 应用到 text-decoration 属性上。按照代码清单 1.18 更新样式并查看最终效果。

代码清单 1.18 revert 值的应用

.footer a {color: unset;background-color: unset;text-decoration: revert; /* 撤销为用户代理样式 */
}

在本例中,这些关键字可能看起来有些多余,因为这些属性对您而言可能非常熟悉,直接给它们赋上需要的样式值即可;但是,当使用较新的 CSS 功能或遇到像 flexbox 这样、具有多个关键字的样式属性时,可能就没那么容易知晓其对应的默认值了。这时,这些关键字就派上用场了。此外,这么做还有一个额外的好处:可以巧妙地提醒今后的样式开发人员,您这里的意图旨在有效地撤消样式表中其他地方的样式。

警告

这些关键字都是普通的层叠值,意味着当优先级更高的其他选择器也指向同一个元素时,其样式值仍然可以被新样式覆盖。

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

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

相关文章

创新实训(十二) 项目开发——历史对话增加查询功能

必要性 随着对话记录的增加&#xff0c;根据对话名称conv_name查询对话对用户来说非常有必要实现。 实现 原来的history_chats.vue中使用了getChatList() 在onMounted时直接获取用户的所有对话记录&#xff0c;如果要实现查询功能&#xff0c;需要增加两个变量&#xff1a; …

【STM32入门学习】基于DHT20温湿度传感器数据采集和显示

目录 一、软件I2C和硬件I2C 1.1硬件I2C 1.2软件I2C 二、创建工程&#xff08;基于HAL库&#xff09; 三、实物连线 3.1DHT20 3.2串口传输&#xff1a; 四、结果演示 4.1部署文件 4.2主要代码分析 五、心得体会 一、软件I2C和硬件I2C I2C 基本读写过程: 其中S表示由主…

Android Basis - Google Keybox

什么是Keybox Android O 开始谷歌要求每台机器预制谷歌提供的 Attestion Key的需求&#xff0c;该需求要求,每台机器都预制谷歌提供的 key&#xff0c;因此需要 oem 厂商在工厂完成预制。没有预制该key 将直接导致机器 cts 相关测试项失败。Google attestation key的集合又称作…

Spring AI 介绍以及与 Spring Boot 项目整合

Spring AI 项目旨在简化使用 Spring Boot 开发包含人工智能功能的应用程序&#xff0c;提供抽象和支持多种模型提供商及矢量数据库提供商。 Spring AI 的功能特点 支持主流模型提供商&#xff1a;如 OpenAI、Microsoft、Amazon、Google 和 Huggingface 等。支持多种模型类型&a…

Retrieval-Augmented Generation for Large Language Models A Survey

Retrieval-Augmented Generation for Large Language Models: A Survey 文献综述 文章目录 Retrieval-Augmented Generation for Large Language Models: A Survey 文献综述 Abstract背景介绍 RAG概述原始RAG先进RAG预检索过程后检索过程 模块化RAGModules部分Patterns部分 RAG…

phpcms网站模板收费下载站素材图片网站源码

★模板介绍★ 本套源码&#xff0c;主要针对资源下载&#xff0c;素材/图片/模板/源码/插件/ 我们已经对源码进行了多处二次开发&#xff0c;对模板进行了深度优化&#xff0c;没有多余的无用代码。更符合收费下载站行业的标准&#xff0c;保证每位站长购买后多能直接用上&am…

Python | Leetcode Python题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; L 10 bin {A: 0, C: 1, G: 2, T: 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n len(s)if n < L:return []ans []x 0for ch in s[:L - 1]:x (x << 2) | bin[ch]cnt defaultdict(int)for…

vue中用JSON格式查看数据(vue-json-viewer)

vue中把string用JSON格式展示数据 vue-json-viewer使用 官网地址&#xff1a;https://www.npmjs.com/package/vue-json-viewer 1. 安装插件vue-json-viewer //vue2 npm install vue-json-viewer2 --save //vue3 npm install vue-json-viewer3 --save2. 引入vue-json-viewer…

星闪指向遥控,做家电交互的破壁人

“面壁者罗辑&#xff0c;我是你的破壁人。” 科幻小说《三体》中&#xff0c;当人类的基础科学被三体人封锁&#xff0c;变得停步不前&#xff0c;人类启动了自救的面壁计划&#xff0c;通过一次又一次破壁&#xff0c;找到战胜三体人的办法。 现实中&#xff0c;有一点已经成…

Html去除a标签的默认样式

Html去除a标签的默认样式, a标签超链接字体默认蓝色带下划线; 去除可用: a{text-decoration:none;color:inherit;cursor:auto; }测试代码 <!DOCTYPE html> <html lang"zh-CN" dir"ltr"><head><meta charset"utf-8"/>&…

上海交大阿里巴巴推出虚拟试衣新里程碑式工作——AnyFit:任意场景、任意组合!

文章链接&#xff1a;https://arxiv.org/pdf/2405.18172 工程链接&#xff1a;https://colorful-liyu.github.io/anyfit-page/ 今天和大家一起学习的是一种名为AnyFit的新型虚拟试穿系统&#xff0c;旨在解决现有技术在处理不同场景和服饰组合时出现的衣物风格不匹配和质量下…

【MySQL】Linux中MySQL的使用及配置

一、字符集修改 1、MySQL8.0之前&#xff0c;字符集都默认是latin1&#xff0c;从MySQL8.0开始&#xff0c;字符集utf8mb4&#xff0c;这意味着&#xff0c;在默认情况下&#xff0c;MySQL8.0之前都是不支持中文的 # 查看字符集信息&#xff0c;主要是character_set_server和…

能正常执行但是 cion 标红/没有字段提示

ctrl q 退出 clion 找到工程根目录&#xff0c;删除隐藏文件 .idea 再重新打开 clion 标红消失&#xff0c;同时再次输入函数/类属性&#xff0c;出现字段提示 clion 的智能提示方案存储在 .idea 文件中&#xff0c;如果工程能够正常编译执行&#xff0c;那么说明是智能提示…

【JavaSE ⑧】P219 ~ 225 Date类‘’DateFormat类转化Date和字符串;Calendar类获得日历中某值,修改日历,日历转日期

目录 日期时间类1 Date类概述常用方法 2DateFormat类构造方法格式规则常用方法parse方法format方法 3 Calendar类概念获取方式常用方法get/set方法add方法getTime方法 ● 练习1.判断Date不同参数构造的输出2. 用日期时间相关的API&#xff0c;计算一个人已经出生了多少天。3. 获…

技术管理转型之战:解锁管理新境界——直觉决策的艺术与科学

文章目录 引言一、直觉决策的定义与特点二、直觉决策在管理中的价值三、直觉决策的来源1、潜意识的心里过程2、基于价值观或道德的决策3、基于经验的决策4、影响发动的决策5、基于认知的决策 四、如何培养直觉决策能力五、直觉决策的风险与应对结语 引言 在快速变化的商业环境…

[FreeRTOS 内部实现] 创建任务 xTaskCreate函数解析

文章目录 创建任务 xTaskCreate函数原型栈深度 usStackDepth 大小如何确定任务堆空间分配 任务控制块 TCB 创建任务 xTaskCreate函数原型 BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName,const configSTACK_DEPTH_TYPE usStackDepth,void *…

JVM专题三:Java代码如何运行

通过前面的第一篇文章&#xff0c;对JVM整体脉络有了一个大概了解。第二篇文章我们通过对高级语言低级语言不同特性的探讨引出了Java的编译过程。有了前面的铺垫&#xff0c;咱们今天正式进入Java到底是如何运行起来的探讨。 目前大部分公司都是使用maven作为包管理工具&#x…

lvgl_micropython development for esp32

​​​​​​上一篇博客已经编译源码生成了ESP32C3的固件lvgl_micropy_ESP32_GENERIC_C3-4.bin&#xff0c;这篇博客开发一个界面。 一、开发环境 1、安装开发工具 Windows安装Thonny工具&#xff0c;官网链接&#xff1a;Thonny, Python IDE for beginners。 参考博客:用M…

游戏开发丨基于Tkinter的五子棋小游戏

文章目录 写在前面Tkinter五子棋系列文章写在后面 写在前面 本期内容&#xff1a;基于tkinter的五子棋小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700190 实验环境 python3.11及以上pycharmtkinter Tkinter Tkinter是Python的一个标准…

文件创建与查看

touch touch命令用于创建一个新的文件。 语法&#xff1a;touch Linux路径 其中路径可以是相对路径、绝对路径或者特殊路径符都可以。 改图展示了通过 touch test.txt 命令创建了一个 test.txt文件&#xff0c;其中深色的代表文件夹&#xff0c;白色的代表文件。 使用 ls -lh…