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

文章目录

    • 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 farmsaround the world to hand-select beans at thepeak of season. We then careful roast insmall 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 farmsaround the world to hand-select beans at thepeak of season. We then careful roast insmall 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.mzph.cn/bicheng/46279.shtml

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

相关文章

SunnyUI中UIAvatar的使用

在SunnyUI控件库中&#xff0c;UIAvatar 控件是用来显示头像或图标的小部件&#xff0c;通常用于用户界面中代表用户或角色的图像。下面是如何在你的应用程序中使用 UIAvatar 的步骤&#xff1a; 1. 引入 SunnyUI 控件库 确保你的项目已经包含了 SunnyUI 控件库。如果是通过 …

PGCCC|【PostgreSQL】PCA+PCP+PCM等IT类认证申报个税退税指南

小编特将PostgreSQL证书申报个税退税流程&#xff0c;编辑成文&#xff0c;供大家申报参考哦~ 1.申报专项附加扣除 第一步&#xff1a;打开个人所得税APP&#xff0c;选择“专项附加扣除填报”&#xff1a; 第二步&#xff1a;“扣除年度”选择您要申报的年度&#xff0c;并…

Python input NameError: name ‘xxx‘ is not defined.

chiami.py name input("Come ti chiami?")type(name) print(name) $ python chimi.py Come ti chimi? xxx Traceback (most recent call last): File "chimi.py", line 1, in <module> name input("Come ti chiami?") …

script标签type属性

script标签中的type的使用 type MDN&#xff1a;该属性定义script标签元素包含或src应用的脚本语言&#xff0c;属性的值为MINE类型&#xff0c;也叫媒体类型。支持的为text/javascript,application/javascript,text/ecmascript,application/ecmascript,application/json,mod…

Windows 默认以管理员运行打开CMD

winr 默认以管理员打开运行CMD 需求&#xff1a;在运行页面输入cmd 希望是可以直接通过管理员方式打开的。 winr 打开运行 输入secpol.msc 打开本地安全策略&#xff08;注意家庭版是没有这个的&#xff09; 找到本地策略–安全选项–用户帐户控制: 以管理员批准模式运行所有管…

【网络编程】select函数

select的优点是跨平台的&#xff0c;缺点是因为是轮询查询的&#xff0c;相对效率不高 使用 select 同时监听多个文件描述符, 将监控的操作交给内核去处理&#xff0c;当有监控操作时返回。select可以完成一个进程对多个客户端的处理 #include <sys/select.h> #include…

基于Python thinker GUI界面的股票评论数据及投资者情绪分析设计与实现

1.绪论 1.1背景介绍 Python 的 Tkinter 库提供了创建用户界面的工具&#xff0c;可以用来构建股票评论数据及投资者情绪分析的图形用户界面&#xff08;GUI&#xff09;。通过该界面&#xff0c;用户可以输入股票评论数据&#xff0c;然后通过情感分析等技术对评论进行情绪分析…

前端数据加密方式

1、Base64加密 一、原生加解密 const btoa window.btoa(123) // 编码console.log(加密后,btoa)const atob window.atob(bota) // 解码console.log(解密后,atob) 二、base64插件 npm install --save js-base64 <script lang"ts"> import { defineCompon…

JavaScript 中 await 永远不会 resolve 的 Promise 会导致内存泄露吗?

前言 在 JavaScript 中&#xff0c;await 关键字用于等待一个 Promise 完成&#xff0c;它只能在异步函数&#xff08;async function&#xff09;内部使用。当 await 一个永远不会 resolve 的 Promise 时&#xff0c;它确实会阻塞异步函数的进一步执行&#xff0c;但不会直接…

Matlab中产生高斯白噪声信号的方法和其功率计算

Matlab中产生高斯白噪声信号的方法和其功率计算 matlab中计算信号能量&#xff1a; p o w e r ∑ n 1 N x 2 ( n ) power \sum_{n1}^Nx^2(n) powern1∑N​x2(n) ​ 功率为 P 1 N ∑ n 1 N x 2 ( n ) P \frac{1}{N}\sqrt{\sum_{n1}^Nx^2(n)} PN1​n1∑N​x2(n) ​ 对应ma…

C1W1.Assignment: Logistic Regression

理论课&#xff1a;C1W1.Sentiment Analysis with Logistic Regression 文章目录 前期准备导入包导入数据处理推文文本 Part 1: Logistic regressionPart 1.1: Sigmoid实现 sigmoid 函数Logistic regression: regression and a sigmoid Part 1.2 Cost function and GradientUp…

Python 使用proto 发送socket数据

import socket import binascii import struct from SensingMonitoring_pb2 import Command, CommandNamesif __name__ "__main__":client socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(("192.168.1.100", 22295))# 发送数据comman…

软件模块的初始化

什么是初始化&#xff1f; 软件的初始化&#xff08;Initialization&#xff09;是指软件启动或重新配置时执行的一系列步骤和过程&#xff0c;旨在准备软件运行环境、加载必要的配置信息、检查系统依赖项、分配资源&#xff08;如内存、文件句柄等&#xff09;&#xff0c;以及…

Microsoft Build 2024 推出 .NET 9:Tensor<T>、 OpenAI Collaboration和.NET Aspire

在 Microsoft Build 2024 上&#xff0c;.NET 9 4 发布&#xff0c;引入了用于深度学习的 Tensor 类型以及与 OpenAI Collaboration实现GPT4o和Assistants v2等功能。这些最新改进还带来了 .NET Aspire&#xff0c;简化了云原生应用开发。更新涵盖 ASP.NET Core、Blazor 和 .NE…

5、Hacker_Kid-v1.0.1

中等难度 目标root权限 先进行一波IP地址发现 netdiscover -i eth0 -r 192.168.1.1/24 发现存在的靶机ip 进行一波端口的探测 发现是一个apache的服务和一个tornado的网站 这里有个细节部分&#xff0c;53端口常见的情况都是走的udp协议做的域名解析&#xff0c;这里查询出来…

【ARM】CCI缓存一致性整理

目录 1.CCI500提供的功能 2.CCI500在SOC系统中所处的位置​编辑 3.CCI500内部结构​编辑 4.功能描述 1.CCI500提供的功能 2.CCI500在SOC系统中所处的位置 3.CCI500内部结构 Transaction Tracker&#xff08;TT&#xff09;是用来解决一致性和ordering问题的&#xff0c;它…

完成SSH连接与端口映射并运行hello_world.py以及创建conda环境

完成SSH连接与端口映射并运行hello_world.py 第一步&#xff1a; 使用vscode打开连接开发机如图 第二步&#xff1a; 端口映射 ssh -p 37367 rootssh.intern-ai.org.cn -CNg -L {本地机器_PORT}:127.0.0.1:{开发机_PORT} -o StrictHostKeyCheckingno 如&#xff1a; ssh -…

牛客周赛51 F(静态区间最大连续子段和)

题面 题目地址 原题是SPOJ 1043。本文中我介绍的是维护前缀和的写法&#xff0c;如果你想要了解其他写法&#xff0c;可以搜索原题题解。 题目大意&#xff1a; 给定长度为n的数组a&#xff0c;q次查询&#xff0c;每次询问[l,r]中连续子段和的绝对值最大是多少 1 < n, q&l…

SpringBoot整合 Kaptcha 验证码

文章目录 1 Kaptcha 验证码1.1 引言1.2 Kaptcha1.2.1 pom.xml1.2.2 配置类1.2.2.1 Redis配置类RedisConfig1.2.2.2 验证码配置类KaptchaConfig 1.2.3 验证码控制层1.2.4 登录控制层 1 Kaptcha 验证码 1.1 引言 为防止验证系统被暴力破解&#xff0c;很多系统都增加了验证码效…