感谢原文作者: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--coloryellow

content2--color没有定义,继承了wrapper--colorred

--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. Distillation as a Defense to Adversarial Perturbations against Deep Neural Networks

    目录 概 主要内容 算法 一些有趣的指标 鲁棒性定义 合格的抗干扰机制 Nicolas Papernot, Patrick McDaniel, Xi Wu, Somesh Jha, Ananthram ...

  2. uniapp使用uni.openDocument打开文件时,安卓打开成功,iOS打开失败【原因:打开的文件的文件名是中文】

    解决办法:使用escape进行文件名编码 uni.downloadFile({ url: url, success: function(res) { var filePath = res.tempFi ...

  3. 【jvm】07-偏向锁、轻量锁、重量锁到底是啥?

    [jvm]07-偏向锁.轻量锁.重量锁到底是啥? 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺 ...

  4. vue3+TypeScript+vue-router使用

    简单使用 创建项目 vue-cli创建 $npm install -g @vue/cli $vue --version @vue/cli 4.5.15 $vue create my-project 然 ...

  5. Linux配置yum源(离线和在线)

    配置yum源有2种方法,一种是离线yum源,另外一种是在线yum源. 一.离线yum源,基于安装光盘提供的安装仓库. 建立一个属于仓库文件夹 mkdir /media/zidong cd /media ...

  6. DGHV同态库

    DGHV DGHV全同态方案的实现 这是具有压缩公钥的DGHV的全同态加密方案的实现,参考文章: [1] J.S. Coron, D. Naccache and M. Tibouchi, " ...

  7. java字符串比较是否都可直接使用==?

    java字符串比较,两个字符串相不相等,直接用==来判断可以吗?或者判断两个字符串不相等,直接用!=? 不能 两个对象进行比较,如果使用==符号,那么比较的是这两个对象的"引用"( ...

  8. 初识python: 生成器并行(做包子,吃包子)

    知识点: send(i) :唤醒yield,并将 i 的值传给 yield #!/user/bin env python # author:Simple-Sir # time:20181020 # 单 ...

  9. 怎样修改自己的登录shell

    问题 我只是Linux系统的普通用户,没有权限调用chsh命令修改自己的登录shell. bash-4.1$ chsh --help Usage: chsh [ -s shell ] [ --list ...

  10. Hive的导入导出和常用过滤语句的学习

    原文: https://www.toutiao.com/i6769166601871688196/?group_id=6769166601871688196 数据的导入 load data [loca ...