CSS:var变量的局部作用域(继承)特性

一、CSS变量非全局

最近做项目,发现CSS变量一个有意思的特性,那就是变量作用域非全局。

举个例子,如下HTML和CSS:

<div class="box">
    <div class="a">测试a</div>
    <div class="b">测试b</div>
    <div class="c">测试c</div>
</div>
.box {
    --color: red;
    color: var(--color);
}
.a {
    --color: green;
    color: var(--color);
}
.b {
    --color: blue;
    color: var(--color);
}
.c {
    --color: yellow;
}

虽然整个CSS公用一个上下文文档,但是,对于CSS变量,却是有作用域概念的,变量只能作用于自身以及后代元素,兄弟元素,祖先元素都不能享用。

因此,这里最终的颜色是:绿、蓝和红。如下截图:



所以,如果你的变量是全局享用的,则建议放在:root上,例如:

:root {
    --color: red;
}

当然,也可以使用body或者html标签:

body {
    --color: red;
}

如果你的变量是局部享用的,则设置在模块盒子元素上即可。

.module {
    --color: red;
}

实际上,抛开变量这个词。我们可以理解为具有继承特性的自定义CSS属性。

二、CSS变量局部特性用途

由于CSS变量的局部作用特性,于是,我们可以放心大胆使用CSS变量给伪元素传参了。

例如,一个多图上传页面,有很多loading进度条,此时,就可以使用CSS变量将加载进度传给伪元素,这样,一个标签就能实现完整的进度效果了,代码简洁又高效,而在过去,我们一定要嵌套HTML标签才能实现。HTML代码如下:

<label>图片1:</label>
<div class="bar" style="--percent: 60;"></div>
<label>图片2:</label>
<div class="bar" style="--percent: 40;"></div>
<label>图片3:</label>
<div class="bar" style="--percent: 20;"></div>

我们只需要在style属性中更新当前上传进度变量就可以了。

然后,我们就可以把这个变量转换成我们需要的伪元素数值以及宽度大小,CSS代码如下:

.bar {
    height: 20px; width: 300px;
    background-color: #f5f5f5;
}
.bar::before {
    counter-reset: progress var(--percent);
    content: counter(progress) ‘%\2002‘;
    display: block;
    width: calc(300px * var(--percent) / 100);
    font-size: 12px;
    color: #fff;
    background-color: #2486ff;
    text-align: right;
    white-space: nowrap;
    overflow: hidden;
}

web前端开发学习Q-q-u-n: 767273102 ,分享开发工具,零基础,进阶视频教程,希望新手少走弯路 

CSS边框数值可以记住counter计数器呈现,宽度则可以借助calc()转换成带px的值。其它一些实现细节不展开,有疑问可以评论,我会解答。最终实现的效果如下图所示:

CSS也越来越具有动态特性了。

原文地址:https://blog.51cto.com/14458119/2422582

时间: 2024-10-22 05:47:09

CSS:var变量的局部作用域(继承)特性的相关文章

强大的CSS:var变量的局部作用域(继承)特性

一.CSS变量非全局 最近做项目,发现CSS变量一个有意思的特性,那就是变量作用域非全局. 举个例子,如下HTML和CSS: <div class="box"> <div class="a">测试a</div> <div class="b">测试b</div> <div class="c">测试c</div> </div> .box

php中在局部作用域内访问全局变量

php中,由于作用域的限制,导致变量的访问限制: 1.局部作用域内不能访问全局变量 2.全局作用域内不能访问局部变量 对于第一种情况,如下代码将不能正常运行: <?php //局部作用域(函数内)使用全局变量 $a = 1;//在全局作用域内的变量 function test() { echo "a = {$a}<br />";//在局部作用域中访问全局作用域变量 } test(); /* 运行结果: Notice: Undefined variable: a in

[ python ] 全局和局部作用域变量的引用

全局与局部变量的引用 (a)locals(b)globals 这里还需要在补充2个关键字一起比较学习,关键字:(c)nonlocal(d)global locals 和 globals locals: 打印当前可用的变量的字典    globals: 返回一个描述当前全局变量的字典 提示:locals 是获取当前的可用变量,而 globals 是获取全局的变量 在使用 locals() 和 globals() 会出现以下三种表现形式: (1)当locals 和 globals 都在全局作用域的时

第 13 条:使用立即调用的函数表达式创建局部作用域

第 13 条:使用立即调用的函数表达式创建局部作用域这段程序(Bug 程序)输出什么? function wrapElements(a) { var result = [], i, n; for (i = 0, n = a.length; i < n; i++) { result[i] = function() { return a[i]; }; } return result; } var wrapped = wrapElements([10, 20, 30, 40, 50]); var f

深入理解Javascript的var变量和闭包

今天无意间看到阮一峰校友写的一个关于ES6新特性let.let的出现,就是为了弥补var的不足.由此,写下这篇博客重新回顾一下Javascript老生常谈的闭包和它的一个作用域的诟病. 闭包的概念我就不说了,很多书上都又说明和解释,就是在一个函数内部可以访问函数外的上下文.今天重点来说以下var变量.因为平时开发的时候,如果不对这个关键字有一个很深刻的认识,很容易产生很多坑和错觉. 本文要阐明的观点是:由var定义的变量,它作用域在一个函数体内,而不是我们其他语言理解的大括号{ }内. 下面又几

javascript var变量删除

var有三种声明的情形: var声明的全局变量 var在函数范围内声明的局部变量 eval中声明的全局变量. 首先, 1.2种情形var声明的变量是无法删除的. 尽管var声明的全局变量是属于window对象的属性(在浏览器中),但依然是无法删除的,因为这种属性的configurable=false,因此不能delete掉. 局部变量就更不用说了,连var变量依附的对象都不知道在哪里,肯定无法删除. 而eval('var a = 1')看似和直接var是一样的效果(当然是在全局作用执行eval)

[Effective JavaScript 笔记] 第13条:使用立即调用的函数表达式创建局部作用域

function wrapElements(a){ var res=[],i,n; for(i=0,n=a.length;i<n;i++){ res[i]=function(){return a[i]}; } return res; } var wrapped=wrapElements([10,20,30,40,50]); var f=wrapped[0]; f();//undefined 这个可以由之前的闭包来讲,res里的每个函数都是一个闭包,它们都可以访问上一个函数的作用域内的变量,所以每

创建自己的AngularJS - 作用域继承(一)

作用域 作用域继承(一) Angular作用域继承机制直接建立在Javascript原型继承基础上,并在其根部加入了一些内容.这意味着当你理解了Javascript原型链后,将对Angular作用域继承有深入了解. 根作用域 到目前为止,我们一直在和一个作用域对象打交道,该作用域使用Scope构造函数创建: var scope = new Scope(); 根作用域就是这样创建的.之所以称之为根作用域,是因为他没有父作用域,它是典型的一个由所有作用域组成的树的根. 在现实中,你永远不用用这种方式

javascript变量声明 及作用域

javascript变量声明提升(hoisting) http://openwares.net/js/javascript_declaration_hoisting.html 可能要FQ一下 javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看一段代码 1 2 3 4 5 var v = "hello"; (function(){   console.log(v);   var v = &qu