好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

html5教程-小tips:了解CSS/CSS3原生变量var

小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。

&nbs p;

一、变量是个好东西

在任何语言中,变量的有一点作用都是一样的,那就是可以降低维护成本,附带还有更高性能,文件更高压缩率的好处。

随着 CSS 预编译工具Sass/Less/Stylus的关注和逐渐流行,CSS工作组迅速跟进 CSS变量 的规范制定,并且,很多浏览器已经跟进,目前,在部分项目中已经可以直接使用了。

Ch rom e/Firefox/Safari浏览器都是绿油油的,兼容性大大超出我的预期,于是果断尝鲜记录下语法用法和特性。

二、CSS变量 VAR ()语法和用法和特性

CSS中原生的 变量定义 语法是: --* ,变量使用语法是: var(--*) ,其中 * 表示我们的 变量名 称。关于命名这个东西,各种语言都有些显示,例如CSS选择器不能是数字开头,JS中的变量是不能直接数值的,但是,在CSS变量中,这些限制通通没有,例如:

:root {   --1:  # 369; } body {   background-color: var(--1); }

结果背景色如下:

但是,不能包含 $ , [ , ^ , ( , % 等字符,普通字符局限在只要是“数字 [0-9] ”“字母 [a-zA-Z] ”“下划线 _ ”和“短横线 - ”这些组合,但是可以是中文,日文 或者 韩文,例如:

body {   --深蓝: #369;   background-color: var(--深蓝); }

所以,我们就可以直接使用中文名称作为变量,即使英语4级没过的小伙伴也不会有 压力 了,我们也不需要随时挂个 翻译 器在身边了。

无论是变量的定义和使用只能在声明块 {} 里面,例如,下面这样是无效的:

--深蓝: #369; body {   background-color: var(--深蓝); }

变量的定义,或者说声明跟CSS计数器的声明类似的,你 应该 摆脱Sass/Less等预编译工具语法先入为主的语法影响,把CSS的原生变量理解为一种 CSS属性 。

这样,你就对其权重和变量应用规则要容易理解地多。

例如下面这个例子:

 :root   {   --color  :  purple ;   }   div   {   --color  :  green ;   }   #alert   {   --color  :   red  ;   }   *   {   color  :   var  ( --color )  ;   }   <p> 我的紫色继承于根元素 </p> <div> 我的绿色来自直接设置 </div> <div id='alert'>    ID选择器权重更高,因此阿拉是 红色 !    <p> 我也是红色,占了继承的光 </p> </div> 

上面这个例子我们可以获得这些信息:

变量也是跟着CSS选择器走的,如果变量所在的选择器和使用变量的元素没有交集,是没有效果的。例如 #alert 定义的变量,只有 id 为 alert 的元素才能享有。如果你想变量全局使用,则你可以设置在 :root 选择器上; 当存在多个同样名称的变量时候,变量的覆盖规则由CSS选择器的权重决定的,但并无 !important 这种用法,因为没有必要, !important 设计初衷是干掉JS的 style 设置,但对于变量的定义则没有这样的需求。 CSS属性名可以走变量吗?

类似下面这样:

body {     --bc: background-color;         var(--bc): #369; }

答案是“不可以”,要是可以支持的话,那CSS的压缩可就要逆天了,估计所有的属性都会变成1~2个字符。

CSS变量支持同时多个声明吗?

类似下面这样:

不好 意思 ,类似不了,语法上就根本不支持。

CSS变量使用完整语法
CSS变量使用的完整语法为: var( [, ]? ) ,用中文表示就是: var( [, ,

意思就是,如果我们使用的变量没有定义(注意,仅限于没有定义),则使用后面的值作为元素的属性值。举个例子:

.box {   --1: #369; } body {   background-color: var(--1, #cd0000); }

则此时的背景色是 #cd0000 :

CSS变量不合法的缺省特性

请看下面这个例子:

body {   --color: 20px;   background-color: #369;   background-color: var(--color, #cd0000); }

请问,此时 <body> 的背景色是?

A. transparent    B. 20px     C. #369      D. #cd0000

答案是………………………… A. transparent

不知大家答对了没有!

这是CSS变量非常有意思的一个点,对于CSS变量,只要语法是正确的,就算变量里面的值是个乱七八糟的东西,也是会作为 正常 的声明解析,如果发现 变量值 是不合法的,例如上面背景色显然不能是 20px ,则使用背景色的缺省值,也就是默认值代替,于是,上面CSS等同于:
body {
--color: 20px;
background-color: #369;
background-color: transparent;
}

千万不能想当然得认为等同于 background-color:20px ,这也是为什么上面要强调CSS默认值的使用仅限于变量未定义的情况,并不包括变量不合法。

CSS变量的空格尾随特性

请看下面这个例子:

body {   -- Size:  20;      font -s ize: var(--size)px; }

请问,此时 <body> 的 font-size 大小是多少?

如果你以为是 20px 就太天真了,实际上,此处 font-size:var(--size)px 等同于 font-size:20 px ,注意, 20 后面有个空格,所以,这里的 font-size 使用的是 <body> 元素默认的大小。因此,就不要妄图取消就使用一个数值来贯穿全场,还是使用稳妥的做法:

body {   --size: 20px;      font-size: var(--size); }

或者使用CSS3 calc() 计算:

body {   --size: 20;      font-size: calc(var(--size) * 1px); }

此时, <body> 的 font-size 大小才是 20px ,

CSS变量的相互传递特性

就是说,我们在CSS变量定义的时候可以直接引入其他变量给自己使用,例如:

body {   --green: #4CAF50;      --backgroundColor: var(--green); }

或者更复杂的使用CSS3 calc() 计算,例如:

body {   --columns: 4;   --m arg ins: calc(24px / var(--columns)); }

对于复杂布局,CSS变量的这种相互传递和直接引用特性可以 简化 我们的代码和实现 成本 ,尤其和动态布局在一起的时候,无论是CSS的响应式后者是JS驱动的布局变化。

我们来看一个CSS变量与响应式布局的例子,您可以狠狠地点击这里:CSS变量与响应式布局实例demo

默认进去是4栏,如下图:

随着浏览器 宽 度减小, 4 栏可能就变成 3 栏, 2 栏甚至 1 栏,我们实际开发的时候,显然不仅仅是栏目数量变化,宽度小,往往意味着访问设备 尺寸 有限,此时我们往往会缩小空白间距以及文字 字号 大小,这样,有限屏幕才能显示更多内容。

也就是说,当我们响应式变化的时候, 改变 的CSS属性值不是1个,而是3个或者更多,如果我们有3个响应点,是不是就至少需要9个CSS声明?但是,由于我们有了CSS变量,同时,CSS变量可以传递,当我们遭遇响应点的时候,我们只需要改变一个CSS属性值就可以了。

下面就是本demo核心CSS代码(只需要改变 --columns 这一个变量即可):

.box {     --columns: 4;     --mar gin s: calc(24px / var(--columns));     --space: calc(4px * var(--columns));     --fontSize: calc(20px - 4 / var(--columns)); } @media screen and (max-width: 1200px) {     .box {         --columns: 3;     } } @media screen and (max-width: 900px) {     .box {         --columns: 2;     } } @media screen and (max-width: 600px) {     .box {         --columns: 1;     } }

于是,我们在2栏下的效果就是这样,字号,间距随着栏目数量的减小也一并减小了,然后每栏之间间距是扩大了:

有没有 觉得 CSS越来越屌了呢!哈哈~

三、结束语

由于目前几乎没有关于CSS3 var() 的 文章 ,因此,上面关于 var() 的语法特性等都是自己通过看规范文档,外加细致的测试得到的。但是,一个人的能力总是有限的,因此,必然还有很多 var() 变量有意思的点没发现,因此,就希望大家若是发现 var() 其他有意思的地方,欢迎评论告知,我们及时添加在文章中,方便你我他她它。

多人合作项目我也会使用Less/Sass之类的预编译工具,但是,基本上用到的就是变量,其他高级功能,几乎都不怎么使用。所以,如果浏览器全方位支持了原生的CSS变量,我十有八九就会抛弃Less/Sass之类的工具。

嗯哪,就这些,感谢阅读!

(本篇完)

觉得可用,就经常来吧! 欢迎评论哦!  html5教程 ,巧夺天工,精雕玉琢。小宝典献丑了!

总结

以上是 为你收集整理的 html5教程-小tips:了解CSS/CSS3原生变量var 全部内容,希望文章能够帮你解决 html5教程-小tips:了解CSS/CSS3原生变量var 所遇到的问题。

如果觉得 网站内容还不错, 推荐好友。

查看更多关于html5教程-小tips:了解CSS/CSS3原生变量var的详细内容...

  阅读:35次