感谢原文作者:Kuku殿下

原文链接:https://segmentfault.com/a/1190000015948538

前言

刚开始的“css变量”,经扩展之后,称为“css自定义属性”

当各种预处理器满天飞的时候,css变量已经开始渐渐普及

在特定的应用场景,css变量确实发挥了很大的作用

下面开始学习css变量。

正文

一、变量的声明和使用

CSS选择器不能是数字开头,JS中的变量是不能直接数值的,但是,在CSS变量中,这些限制通通没有。 但不能包含$,[,^,(,%等字符,普通字符局限在只要是“数字[0-9]”“字母[a-zA-Z]”“下划线_”和“短横线-”这些组合,但是可以是中文,日文或者韩文。

1. 声明:大小写敏感, --variable-name: variable-value;

:root{
--color: red;
}

2. 使用:使用var(变量名)来使用一个变量

#div {
color: var(color)
}

3. 变量组合使用

使用变量的时候,通常不会单独使用,可以组合使用

当变量的值是字符串时,可以直接拼接,如下

:root{
--screen-category: 'category' //变量值是字符串
}
body:after {
content: '--screen-category: 'var(--screen-category); // 直接拼接
}

当变量的值是数值时,必须使用calc()函数计算,就算还是简单的单位拼接

.foo {
--gap: 20;
/* 无效 */
margin-top: var(--gap)px;
} .foo {
--gap: 20;
margin-top: calc(var(--gap) * 1px);
}

4. 变量未定义和错误定义

如果我们使用的变量没有定义,则使用后面的值作为元素的属性值, 如下所示

body里面访问不到.box定义的–1,因此使用#cd0000。

即,设置一个默认值。

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

使用变量时,若变量已定义,但是变量的值不正确,则使用缺省值,如:

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

结果body的颜色是transparent,因为background-color的缺省值就是transparent。

二、继承和作用域

1. 作用域

使用:root{}来定义全局css变量

想让变量在局部可用,就定义在某个特定的选择器下

还是下面这段代码

:root{
color: red; //全局可用
}
.box {
--1: #369; //只在.box这个作用域可用
}
body {
background-color: var(--1, #cd0000);
}

2. 继承

<div class="wrapper">
<div class="content1"></div>
<div class="content2"></div>
</div> .wrapper {
--color: red;
} .content1 {
--color: yellow;
}

content1的--color为yellow

content2的--color没有定义,继承了wrapper的--color为red

--color: yellow只在content1的作用域内有效。

三、js操作css变量

:root {
--color: red;
}
//读取
var root = getComputedStyle(document.documentElement);
var color = root.getPropertyValue('--color').trim();
console.log(color); // '70px' //改变
document.documentElement.style.setProperty('--color', 'yellow');
var color = root.getPropertyValue('--color').trim();
console.log(color); // '100px' //删除
document.documentElement.style.removeProperty('--color');
var color = root.getPropertyValue('--color').trim();
console.log(color); // '70px'

四、与预处理器(sass,less)比较

1. css变量:

动态性,可以在运行时更改
可以方便地从js读写
可继承,可组合,有作用域

2. 预处理器:

预处理器的变量不是动态的,在运行时不可更改
预处理器的变量没有作用域的说法
不能与js交互

五、兼容



基本上能兼容大部分主流浏览器,直接使用没有太大问题

如果想使用但又想兼容所有浏览器,就是用下面的方法检测浏览器是否支持CSS自定义属性的方法

/*css*/
@supports ( (--a: 0)) {
/* supported */
} @supports ( not (--a: 0)) {
/* not supported */
} // Js
if (window.CSS && window.CSS.supports && window.CSS.supports('--a', 0)) {
alert('CSS properties are supported');
} else {
alert('CSS properties are NOT supported');
}

六、常用场景

  1. 为风格统一而使用颜色变量
  2. 一致的组件属性(布局,定位等)
  3. 避免代码冗余(响应式布局,制动动画)

这里是常用场景的demo:https://github.com/shinyshine/css-ani-variable

css自定义属性(css变量)的更多相关文章

  1. 了解CSS/CSS3原生变量var

    一.变量是个好东西 在任何语言中,变量的有一点作用都是一样的,那就是可以降低维护成本,附带还有更高性能,文件更高压缩率的好处. 随着CSS预编译工具Sass/Less/Stylus的关注和逐渐流行,C ...

  2. CSS自定义属性与前端页面的主题切换

    基于级联变量的CSS自定义属性,已经出来很多年了. 虽然有less.sass等预处理器大行其道,但是自定义属性也有它的特点和用处,诸如在js中读写.作用域设置等等,在处理UI主题切换等功能上也发挥着很 ...

  3. 在原生CSS中使用变量

    本文首发于我的博客 一直以来,CSS作为一种申明式的样式标记语言,很难像如javascript等命令式编程语言一样通过定义和使用变量的方式来维护和追踪某些状态.后来随着scss,less等CSS预处理 ...

  4. CSS自定义属性 —— 别说你懂CSS相对单位

    前段时间试译了Keith J.Grant的CSS好书<CSS in Depth>,其中的第二章<Working with relative units>,书中对relative ...

  5. 如何在CSS中使用变量

    前言 CSS变量(官方称为自定义属性)是用户定义的值,它可以在你的代码库中设置一次并多次使用.它们使管理颜色.字体.大小和动画值变得更加容易,并确保整个web应用的一致性. 举个例子,你可以将品牌颜色 ...

  6. css中使用变量

    2017年3月,微软宣布 Edge 浏览器将支持 CSS 变量.这个重要的 CSS 新功能,所有主要浏览器已经都支持了. 声明css变量的时候,变量名前面要加两根连词线(--).变量名大小写敏感,-- ...

  7. CSS Variables:css自定义属性的使用

    CSS Variables,一个并不是那么新的东西,但对css来说绝对是一场革命.之前使用变量的时候,需要借助sass.less等预处理工具来实现,现在我们可以直接使用css来声明变量. 一.兼容性 ...

  8. css自定义属性和简单效果

    简介 CSS Variables,一个并不是那么新的东西,但对css来说绝对是一场革命. 之前使用变量的时候,需要借助sass.less等预处理工具来实现,现在我们可以直接使用css来声明变量. 兼容 ...

  9. css中定义变量

    css中定义变量 定义变量可分多种情况: 1.定义全局变量 :root { --borderColor: #ccc;} 2.定义某元素下的变量 .look{ --borderColor: #ccc;} ...

随机推荐

  1. 【操作系统】I/O多路复用 select poll epoll

    @ 目录 I/O模式 I/O多路复用 select poll epoll 事件触发模式 I/O模式 阻塞I/O 非阻塞I/O I/O多路复用 信号驱动I/O 异步I/O I/O多路复用 I/O 多路复 ...

  2. captcha_生成图片验证码并返回给前端展示

    使用pip install captcha 安装模块 import random import string import os import io from captcha.image import ...

  3. 获取python的版本

    import sys # Syntax sugar. _ver = sys.version_info # 获取python版本 #: Python 2.x? is_py2 = (_ver[0] == ...

  4. Visual Studio Code常用插件(持续更新)

    1.open in browser:使用快捷键在浏览器中打开html页面 在默认浏览器中打开html页面是Alt+B:在其他浏览器中显示是Shift+Alt+B:也可以右键单击html文件,在弹出的窗 ...

  5. nginx - win系统启动一闪而过 ,服务没有启动成功

    这种现象是因为配置文件里配置的服务监听端口被占了

  6. 官方文档粗读 - Tutorial

    参考: https://www.jianshu.com/p/0d234e14b5d3 1.Connecting 我们通过 create_engine() 来链接数据库,假设我们我们采用SQLite. ...

  7. mysql数据库安装教程

    centos 7安装mysql教程 一.卸载mariadb 注:卸载mariadb,否则安装Mysql会出现冲突 [root@mysqlmaster ~]# rpm -qa |grep mariadb ...

  8. spring boot + thymeleaf +security自定义规则 的简单使用

    1.前言 以前开发一直使用 springMVC模式开发 ,前端页面常使用 JSP  ,现在html5淘汰了 ,要么使用html ,要么使用vue , 现在使用spring boot ,有必要总结一下 ...

  9. 第10组 Beta冲刺 (5/5)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/14018671.html ·作业博客:https://edu.cnblogs.co ...

  10. SYCOJ157乘二加一

    题目-乘二加一 (shiyancang.cn) 递归写法 #include <bits/stdc++.h> using namespace std; string f(int n) { i ...