【CSS in Depth 2 精译】2.6 CSS 自定义属性(即 CSS 变量)+ 2.7 本章小结

news2024/11/15 18:04:40

文章目录

    • 2.6 自定义属性(即 CSS 变量)
      • 2.6.1 动态变更自定义属性
    • 2.7 本章小结

当前内容所在位置

  • 第一章 层叠、优先级与继承
  • 第二章 相对单位
    • 2.1 相对单位的威力
    • 2.2 em 与 rem
    • 2.3 告别像素思维
    • 2.4 视口的相对单位
    • 2.5 无单位的数值与行高
    • 2.6 自定义属性 ✔️
    • 2.7 本章小结 ✔️
  • 第三章 文档流与盒模型

2.6 自定义属性(即 CSS 变量)

自定义属性(Custom properties 可以实现更高水准的基于上下文的动态样式设计。自定义属性的功能在很多方面都与变量(variables)相似;CSS 可以声明一个变量并赋值,然后在整个样式表中引用该值。这样不仅能减少样式表中的重复,而且还有其他好处,稍后会举例说明。

注意

如果用了 CSS 预处理器(如 Sass 或 Less)自带的变量,那么您可能会忽略 CSS 变量。千万别这么干。由于 CSS 变量有着本质上的区别,它比任何一款预处理器具备的变量功能都要强大得多。因此我更倾向于称其为“自定义属性”,而不是变量,以强调它们和预处理器变量的不同。

定义一个自定义属性,需要像其它 CSS 属性一样进行声明,如下方代码所示。新建一个示例页和样式表,并添加如下 CSS:

:root {
  --main-font: Helvetica, Arial, sans-serif;
}

该代码定义了一个名为 --main-font 的变量,并将变量的值设为一组常见的无衬线字体(sans-serif)。变量名须以两个连字符(--)开头,以便与其他 CSS 属性作区分;然后再加上要声明的任何合法名称。

CSS 变量必须在声明块中声明。这里用到了 :root 选择器,表示为整个页面设置了该变量,原因稍后解释。

该变量声明只有在被调用时才会在页面看到效果。将它应用到某个段落,则效果如图 2.14 所示:

图 2.14 使用变量设置无衬线字体的普通段落图 2.14 使用变量设置无衬线字体的普通段落

调用函数 var() 就能使用该变量。使用该函数引用刚才定义的 --main-font 变量。按如下代码更新样式,将变量用起来:

代码清单 2.18 使用自定义属性

:root {
  --main-font: Helvetica, Arial, sans-serif;
}
p { /* 将段落字体设置为 Helvetica, Arial, sans-serif */
  font-family: var(--main-font); 
}

自定义属性可以将值定义到某处作为“单一数据源”,然后在整个样式表中复用该值。这种方式特别适合反复出现在页面上的值,比如颜色值。代码清单 2.19 添加了一个名为 brand-color 的自定义属性,之后整个样式表都能多次调用该变量;后续即便要改,也只需改动这一个地方即可。

代码清单 2.19 使用自定义颜色属性

:root {
  --main-font: Helvetica, Arial, sans-serif;
  --brand-color: #369; /* 定义一个蓝色的 brand-color 变量 */
}
p {
  font-family: var(--main-font);
  color: var(--brand-color);
}

var() 函数还能接受一个非必填的第二参数作备用值。如果第一参数设置的变量未定义,则启用第二个备用值。

代码清单 2.20 提供备用值

:root {
  --main-font: Helvetica, Arial, sans-serif;
  --brand-color: #369;
}
p {
  /* 指定备用值为 sans-serif */
  font-family: var(--main-font, sans-serif);
  /* 变量 secondary-color 未定义,因此启用备用值 blue */
  color: var(--secondary-color, blue);    
}

上述样式代码在两个不同的声明中指定了备用值。在第一个声明中,--main-font 被定义为 Helvetica, Arial, sans-serif,因此使用该值;而第二个声明中,变量 --secondary-color 未定义,因此启用备用值 blue

注意

如果 var() 函数算出的结果为无效值(invalid value),该属性将被设置为初始值(initial value)。例如,如果 padding: var(--brand-color) 中的变量值为一个颜色值,对于内边距 padding 而言就是一个无效值。此时 padding 的值将被设置为 0

2.6.1 动态变更自定义属性

在前面的示例中,自定义属性仅仅是为减少大量冗余代码提供了一种便捷方式;而它真正的意义在于,自定义属性的声明也适用 CSS 层叠与继承规则:只要在多个选择器中定义相同的变量,就能让该变量在页面不同位置拥有不同的取值。

例如,将一个变量定义为黑色,然后在特定容器内将其重新定义为白色。这样依赖,任何基于该变量的样式在容器外都将被动态解析为黑色,而容器内则为白色,如图 2.15 所示。

图 2.15 自定义属性会根据本地变量值生成不同颜色的面板图 2.15 自定义属性会根据本地变量值生成不同颜色的面板

该示例与之前创建的面板效果类似,只是多了一个深色版本。其 HTML 结构如代码清单 2.21 所示。它有两个面板实例:一个在 body 元素内,另一个在深色的 section 元素内。按如下代码更新示例页。

代码清单 2.21 同一页面不同环境下的两个面板

<body>
  <div class="panel"> <!-- 网页中的一个普通面板 -->
    <h2>Single-origin</h2>
    <div class="body">
      We have built partnerships with small farms
      around the world to hand-select beans at the
      peak of season. We then careful roast in
      small batches to maximize their potential.
    </div>
  </div>
 
  <aside class="dark">
    <div class="panel"> <!-- 深色容器内的另一个面板 -->
      <h2>Single-origin</h2>
      <div class="body">
        We have built partnerships with small farms
        around the world to hand-select beans at the
        peak of season. We then careful roast in
        small batches to maximize their potential.
      </div>
    </div>
  </aside>
</body>

接下来,通过变量来设置文字颜色与背景色,从而重新定义面板样式。在样式表中添加如下代码,将背景色设置为白色,文字设置为黑色。具体工作原理待面板变为深色版本后再作解释。

代码清单 2.22 使用变量定义面板颜色

:root { /* 分别将背景色和文字颜色变量定义为白色和黑色 */
  --main-bg: #fff;
  --main-color: #000;
}
.panel {
  font-size: 1rem;
  padding: 1em;
  border: 1px solid #999;
  border-radius: 0.5em;
  /* 在面板样式中使用变量 */
  background-color: var(--main-bg);
  color: var(--main-color);
}
.panel > h2 {
  margin-top: 0;
  font-size: 0.8em;
  font-weight: bold;
  text-transform: uppercase;
}

这一次同样使用 :root 选择器定义变量——这一点很重要——它意味着这些变量值是为根元素(即整个页面)中的所有内容设置的。当根元素的后代元素调用它们时,浏览器也会解析到这些值。

两个面板准备就绪,尽管看上去效果是一样的。接下来再次定义变量,但选择器和刚才不一样了。以下代码为深色容器设置了深灰色背景,以及少量的内外边距(paddingmargin)。此外还重新定义了两个变量。将这些代码更新到样式表中:

代码清单 2.23 深色容器的样式

.dark {
  margin-top: 2em; /* 给深色容器与前面的面板之间加上外边距 */
  padding: 1em;
  background-color: #999; /* 给深色容器加上深灰色背景 */
  /* 在容器内重新定义变量的取值: */
  --main-bg: #333;
  --main-color: #fff;
}

重新加载页面后,第二个面板变为深色背景、白色文字。这是因为当面板使用这些自定义属性时,浏览器会解析在深色容器上定义的变量值,而非根元素上的值。注意,这里无需重新设计面板样式,也不用借助任何其他的样式类。

本例定义了两次自定义属性:先是根元素(此时 --main-color 为黑色),然后是深色容器(此时 --main-color 为白色)。自定义属性是一种带作用域的变量,其值会被后代元素继承。在深色容器中,--main-color 解析为白色;而在页面其他位置,则解析为黑色。

自定义属性是一种用途极为广泛的工具,其用途不胜枚举。本书后续章节还将继续介绍自定义属性的各种应用。

(第一版中曾介绍的第二小节内容:使用 JavaScript 改变自定义属性,在新版中被舍弃了)

2.7 本章小结

  • 相对单位可用于指定与字号或视口大小相适应的尺寸。
  • em 单位制基于该元素字号来定义长度;若用于指定字号本身,则基于该元素继承的字号来定义长度。
  • rem 单位制基于 <html> 根元素上设置的字号来定义长度。
  • 在响应式设计中缩放根元素字号,则页面上用 emrem 定义的元素也会同步缩放。
  • 视口相对单位基于视口的宽度或高度来定义长度。
  • 用无单位数值定义的行高,在继承到子元素时其可预测性更强。
  • 自定义属性的工作原理虽然与变量类似,但可以通过层叠和继承规则实现动态调整。

(本章完)

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

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

相关文章

【日常记录】【插件】js 获取浏览器信息、操作系统等相关信息

文章目录 1. 原生方式2. 插件的方式2.1 Bowser 的基本使用2.2 UAParser2.3 Platform.js 参考链接 1. 原生方式 原生方式可以通过 navigator.userAgent 来获取 需要写一个正则来匹配&#xff0c;获取相关的信息 2. 插件的方式 获取浏览器版本相关信息的库主要有以下几个 Bowser&…

从零开始做题:easycap

题目 给出一个pcap文件 解题 注&#xff1a;传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议 .pcap文件需要用Wireshark打开 用Wireshark打开easycap.pcap文…

leetcode--层数最深叶子节点的和

leetcode地址&#xff1a;层数最深叶子节点的和 给你一棵二叉树的根节点 root &#xff0c;请你返回 层数最深的叶子节点的和 。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5,null,6,7,null,null,null,null,8] 输出&#xff1a;15 示例 2&#xff1a; 输入&#xff…

16张支付牌照将到期,新规落地以来,支付牌照的首次续展。

7月9日&#xff0c;包括瑞银信、乐刷、畅捷支付在内的16家第三方支付机构的支付牌照将到期&#xff0c;这些公司面临续展的重大考验。 这是《非银行支付机构监督管理条例》实施以来&#xff0c;支付牌照的首次续期。 其中&#xff0c;最受瞩目的可能是瑞银信。在范一飞落马后&a…

AI绘画:艺术与科技的交融,创新浪潮与无限可能

在科技日新月异的当下&#xff0c;AI 绘画作为人工智能领域的一颗璀璨新星&#xff0c;正以惊人的速度在国内崭露头角&#xff0c;引发了艺术与技术交融的全新变革。随着人工智能技术的飞速发展&#xff0c;AI绘画已成为艺术与科技交融的新宠。2024年&#xff0c;AI绘画行业在国…

最新版萌新Python看过最好的电子书?

我之前写过一篇 Python 入门看哪些书的文章&#xff0c;文章中罗列了 5 位大佬的书单推荐&#xff0c;在这个基础上我总结了自己看过的书单。你要是不知道学 Python 看什么书好&#xff0c;不妨参考一下&#xff1a; 一晃就到了月末&#xff0c;2020年也过去了 2 个月&#xf…

mysql数据库中的视图view的概念和详细说明

目录 一、定义 二、视图view的分类 &#xff08;一&#xff09;按功能和特性分类 1、普通视图&#xff08;Regular View/Standard View&#xff09; 2、索引视图&#xff08;Indexed View&#xff09; 3、分割视图&#xff08;Partitioned View/Distributed Partitioned …

【pytorch23】MNIST测试实战

理解 训练完之后也需要做测试 为什么要做test&#xff1f; 上图蓝色代表train的accuracy 下图蓝色代表train的loss 基本上符合预期&#xff0c;随着epoch增大&#xff0c;train的accuracy也会上升&#xff0c;loss也会一直下降&#xff0c;下降到一个较小的程度 但是如果只看…

世上最懂交易原理的是佛学

僧肇《肇论不空真论》思想非有非無逻辑 价值观矛盾冲突时&#xff08;不落两边&#xff09;&#xff0c;血性即行迹逻辑&#xff08;俗谛&#xff09;&#xff0c;才气即逻辑心证&#xff08;真谛&#xff09;&#xff1b;意气即是美&#xff0c;美即是意气&#xff1b;一切以…

使用bypy丝滑传递百度网盘-服务器文件

前言 还在为百度网盘的数据集难以给服务器做同步而痛苦吗&#xff0c;bypy来拯救你了&#xff01;bypy是一个强大而灵活的百度网盘命令行客户端工具。它是基于Python开发的开源项目&#xff0c;为用户提供了一种通过命令行界面与百度网盘进行交互的方式。使用bypy&#xff0c;…

仿写SpringIoc

1.SpringIoc简单注解 1.1 Autowired package com.qcby.iocdemo1.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.FIEL…

Git 快速上手

这个文档适用于需要快速上手 Git 的用户&#xff0c;本文尽可能的做到简单易懂 ❤️❤️❤️ git 的详细讲解请看这篇博客 Git 详解&#xff08;原理、使用&#xff09; 1. 什么是 Git Git 是目前最主流的一个版本控制器&#xff0c;并且是分布式版本控制系统&#xff0c;可…

音视频开发—FFmpeg处理流数据的基本概念详解

文章目录 多媒体文件的基本概念相关重要的结构体操作数据流的基本步骤1.解复用&#xff08;Demuxing&#xff09;2.获取流&#xff08;Stream&#xff09;3. 读取数据包&#xff08;Packet&#xff09;4. 释放资源&#xff08;Free Resources&#xff09;完整示例 多媒体文件的…

聚焦云技术,探讨 AGI 时代的云原生数据计算系统

6月22日&#xff0c;开源中国社区在上海举办了 OSC 源创会活动&#xff0c;本期活动以「云技术」为主题&#xff0c;邀请了来自华为 openEuler、字节跳动、AutoMQ 等厂商的技术大咖进行分享&#xff0c;拓数派作为云原生数据计算领域的引领者&#xff0c;受邀参与了本次活动&am…

智慧城市可视化页面怎么做?免费可视化工具可以帮你

智慧城市是一个综合性的概念&#xff0c;广泛应用于各个领域&#xff0c;如基础设施建设、信息化应用、产业经济发展、市民生活品质等。 可视化页面的制作也是一个综合性的过程&#xff0c;需要确定展示内容、数据收集与处理、设计可视化元素等多个环节紧密配合。 1. 明确展示…

MySQL Innodb存储引擎中,当页默认的大小是16K时,页中最多存放多少行的记录?

1、题目引入 Innodb存储引擎是面向行的(row-oriented)&#xff0c;也就是说数据的存放按行进行&#xff0c;每页存放的行记录是有硬性定义的&#xff0c;当页默认的大小是16K时&#xff0c;页中最多存放多少行的记录&#xff1f; A、1600 行B、8192 行C、16383 行D、7992 行 …

occ geo

随笔 - 12 文章 - 18 评论 - 117 阅读 - 13万 opencascade造型引擎功能介绍 现今的CAD 系统大多通常都基于CAD 系统提供的二次开发包&#xff0c;用户根据要求定制符合自己要求的功能。AutoCAD就提供了AutoLISP、ADS 等都是比较通用的开发工具包。UG 也提供了多种二次开发…

温州海经区管委会主任、乐清市委书记徐建兵带队莅临麒麟信安调研

7月8日上午&#xff0c;温州海经区管委会主任、乐清市委书记徐建兵&#xff0c;乐清市委常委、副市长叶序锋&#xff0c;乐清市委办主任郑志坚一行莅临麒麟信安调研&#xff0c;乐清市投资促进服务中心及湖南省浙江总商会相关人员陪同参加。麒麟信安董事长杨涛、总裁刘文清热情…

grafana数据展示

目录 一、安装步骤 二、如何添加喜欢的界面 三、自动添加注册客户端主机 一、安装步骤 启动成功后 可以查看端口3000是否启动 如果启动了就在浏览器输入IP地址&#xff1a;3000 账号密码默认是admin 然后点击 log in 第一次会让你修改密码 根据自定义密码然后就能登录到界面…

机器学习笔记:初始化0的问题

1 前言 假设我们有这样的两个模型&#xff1a; 第一个是逻辑回归 第二个是神经网络 他们的损失函数都是交叉熵 sigmoid函数的导数&#xff1a; 他们能不能用0初始化呢&#xff1f; 2 逻辑回归 2.1 求偏导 2.1.1 结论 2.1.2 L对a的偏导 2.1.3 对w1&#xff0c;w2求偏导 w2同…