热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CSS变量的作用域和默认值

CSS变量的作用域和默认值-CSS变量的作用域是什么?变量作用域,变量的可用性范围。变量并不总是有效可用的,而限定变量的可用性范围就是变量的作用域。而CSS变量在CSS层次结构中声

CSS变量的作用域是什么?

变量作用域,变量的可用性范围。变量并不总是有效可用的,而限定变量的可用性范围就是变量的作用域。而CSS变量在CSS层次结构中声明的位置,决定了它在整个层次结构中的可用性范围。

通常来说,CSS变量仅对声明它的元素的子元素可见。比如下面的例子中,--bgColor变量对child元素可见:


parent
child

.parent {
--bgColor: pink;
}
.child {
background: var(--bgColor);
}


但如果反过来则不可见:

.child {
--bgColor: pink;
}
.parent {
background: var(--bgColor);
}

作用域类型

CSS变量遵循词法作用域(静态作用域)规则,有两种作用域类型——全局作用域局部作用域

全局作用域

:root中声明的CSS变量即全局作用域的变量,即可以在CSSOM中任意位置使用。

/* 定义全局变量 */
:root{
--primary-color: pink;
}
/* 任意位置都可以访问全局变量 */
.wrapper{
background: var(--primary-color);
}

局部作用域

而在其他CSS层级中声明的变量仅对该CSS层级以及它的子级可见。


parent
child

.parent {
--fontSize: 24px;
--lineHeight: 1.8;
}
.child {
--fontSize: 18px;
--lineHeight: 1.6;
}
.text {
font-size: var(--fontSize);
line-height: var(--lineHeight);
}


在上面对例子中,可以用相同的命名在不同的CSS块中声明和访问变量。
局部作用域总是可以访问外层作用域或者全局作用域的变量,相反则不可。

变量提升

和Javascript一样,CSS变量生命可以被提升,即CSS变量可以再声明之前使用他们。在浏览器渲染相应的HTML元素样式前,会将CSS变量的声明提升并移动到CSSOM的最顶部。

body {
background-color: var(--bgColor);
}
:root {
--bgColor: pink;
}

body {
background-color: var(--bgColor);
}
:root {
--bgColor: pink;
}

如上面的例子中,CSS变量--bgColor可以在:root 伪类选择器声明之前使用。CSS变量可以先访问再声明这一特性,使得CSS变量成为一个非常强大的功能点。

变量默认值

如下面的例子中,被逗号分隔后的第二个值1.2为默认值,即如果--scale未被赋值则使用1.2这个数值。

.bigger {
transform: scale(var(--scale, 1.2));
}

当使用var()函数时,可以分配一个或多个回退的属性值(使用逗号分隔),比如设置字体:

html {
font-family: var(--fonts, Helvetica, Arial, sans-serif);
}

还可以使用一连串的变量回退,但需要使用var()嵌套起来:

.bigger {
transform: scale(var(--scale, var(--secondFallbackScale, 1.2));
}

如果--scale未被定义,会尝试下一个值即--secondFallbackScale。如果--secondFallbackScale也未被定义,最终会回退到1.2。

模块化

CSS变量的强大之处在于,作用域的特性有助于设计一个代码整洁、模块化的系统。

当我们想要主题化某一模块时,可以在该模块的根元素中设置CSS变量,以便于变量可以向下传递,而不影响该模块以外的元素。





段落 1




段落 2



.mod {
--modBgColor: pink;
--modMainColor: blueviolet;
}
p {
background: var(--modBgColor);
color: var(--modMainColor);
}

.mod中声明的CSS变量将对

元素的“段落 1”可见,它是类名是mod节点的子元素,因此设置的背景色和字体色会对“段落 1”生效。

元素的“段落2”样式不会受到影响,因为它不属于.mod或其子元素,CSS变量--modBgColor--modMainColor对它不可见。

这就是CSS变量作用域的强大之处。

变量赋值变量

CSS变量也可以使用变量赋值变量,下面的例子中,使用CSS变量渲染渐变背景色:


:root {
--color1: pink;
--color2: aquamarine;
--bg: linear-gradient(to right, var(--color1), var(--color2));
}
.gradient {
margin: 10px auto;
width: 200px;
height: 100px;
background: var(--bg);
}

变量不生效问题

现在,如果想让第二个模块渐变色变成从粉色过渡到薰衣草色,那就简单粗暴地给第二个模块加个类名theme-2,同时给变量—color2赋值薰衣草色:

.theme-2 {
--color2: lavender;
}

然而变量并没有生效,问题在于--bg是在:root中被声明且被赋值了红到绿的渐变值,可以使用这个变量是因为它是全局变量可访问,在theme-2中修改的—-color2的值并不会更新—-bg的值,转换成js语句就容易理解了:

let color1 = 'red';
let color2 = 'aquamarine';
let bg = `${color1}-${color2}`;
function gradient() {
color2 = 'lavender';
console.log(bg);
}
gradient(); // red-aquamarine

解决方法:在使用变量的层级赋值

:root {
--color1: pink;
--color2: aquamarine;
}
.gradient {
--bg: linear-gradient(to right, var(--color1), var(--color2));
background: var(--bg);
}
.theme-2 {
--color2: lavender;
}

—-bg变量的赋值放到.gradient层级中,—-color2变量就生效了:

需要合理使用

:root {
--prop1: lol;
--prop2: var(--prop1) var(--prop1);
--prop3: var(--prop2) var(--prop2);
--prop4: var(--prop3) var(--prop3);
...
--prop30: var(--prop29) var(--prop29);
}

如果无限制地渲染和运行,上面的代码段会导致浏览器尝试创建大约十亿个—-prop1值('lol')的实例,这足以让大多数系统内存不足。这个例子在2019年的时候使用32gb RAM的MacBook Pro进行测试,30秒运行后Safari停止响应。那时候所有WebKit内核的浏览器都容易通过CSS变量受到攻击,现在的浏览器已对该情况做相应的处理,被变量引用赋值超过65536次的变量会被当作无效值处理。

实战演练(举个?)

我们可以在不同场景下妙用CSS变量的作用域这一特性,以下例子中演示了如何使用CSS变量实现一个可切换主题的开关。

https://codepen.io/bobolovecat/pen/vYZJPop

我们创建了2个作用域范围,分别是代表明亮主题的.theme-bright和暗黑主题的.theme-dark。在这两个局部作用域中使用相同的变量名,各个变量只对主题相应的模块生效。

小结

利用CSS变量的作用域特性和var()的变量回退,有助于我们设计一个代码整洁、模块化的系统。但也要注意作用域层级和合理运用CSS变量赋值,避免代码结构过于复杂以及影响页面渲染性能。

参考

The Big Gotcha With Custom Properties
A Complete Guide to Custom Properties
Understanding the Scope in CSS Variables - Part 2 - Webkul Blog




推荐阅读
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
夕阳的春天8989_110
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有