Skip to content

CSS变量

声明和使用

基本用法

css
/*声明*/
:root{
    --color: red;
}
/*使用*/
#div {
    color: var(color)
}

变量命名规则

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

组合使用

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

css

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

当变量的值是数值时,必须使用calc()函数计算:

css
.foo {
  --gap: 20;
  /*  错误*/
  margin-top: var(--gap)px;     
  /*  正确*/
  margin-top: calc(var(--gap) * 1px);    
}

缺省值

若使用的变量没有定义,则会使用缺省值:

css
.box {
  --1: #369; 
}
/*body里面访问不到.box定义的--1,因此使用#cd0000*/
body {
  background-color: var(--1, #cd0000);
}

若变量已定义且语法无问题,但是变量的值不适用当前属性,则会使用缺省值:

css
body {
  --color: 20px;
  /* 20px虽然语法正确,但不可能做为background-color的属性值,则使用其缺省值*/
  background-color: var(--color, #cd0000);
}

继承和作用域

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

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

继承则是由元素层级决定:

css
<div class="wrapper">
   <div class="content1"></div>
   <div class="content2"></div>
</div>

.wrapper {
   --color: red;
}

.content1 {
    /*继承了wrapper的`--color:red`并修改为`--color: yellow`,且只在content1的作用域内有效*/
   --color: yellow;
}

js操作css变量

css
:root {
   --color: red;
}
js
//读取
const  root = getComputedStyle(document.documentElement);
let color = root.getPropertyValue('--color').trim();
console.log(color); // 'red'

//改变
document.documentElement.style.setProperty('--color', 'yellow');
color = root.getPropertyValue('--color').trim();
console.log(color);  // 'yellow'

//删除
document.documentElement.style.removeProperty('--color');
color = root.getPropertyValue('--color').trim();
console.log(color); // 'red',这里无法真正删除

与预处理器的比较

参数动态性作用域js交互性
CSS变量可在运行时修改可继承,可组合,有作用域支持
预处理器(Sass,Less等)变量不可修改可继承,无作用域不支持

MIT Licensed