CSS 变量

CSS 变量也叫自定义属性,允许你将一些可复用的 CSS 值定义成变量,以便在以后进行复用。CSS 变量极大的方便了重复内容的修改,也更容易制作主题。

CSS 变量也叫自定义属性,允许你将一些可复用的 CSS 值定义成变量,以便在以后进行复用。CSS 变量极大的方便了重复内容的修改,也更容易制作主题。

定义变量

定义一个 CSS 变量,变量名需要以两个减号(--)开始,变量值可以是任何有效的 CSS 值。变量和其他属性一样,写在选择器的规则内。比如:

body {
  --main-color: gray;
}

上面定义了一个变量 --main-color 代表网页整体的主色。

CSS 变量是有作用域的,有效范围就是所在的选择器的范围。为了使变量在所有的选择器可用,我们可以将变量定义在根伪类 :root 中。

:root {
  --main-color: gray;
}

!! CSS 变量是是区分大小写的,--Main-Color--main-color 是两个不同的变量。

var() 函数

var() 函数用于读取变量的值。var() 函数的语法如下:

var(变量名, 默认值)

var() 函数可以接受 2 个参数, 第 1 个参数数是变量名,第 2 个参数是是可选的,表示默认值,在找不到变量的适合,会返回默认值。

p {
  color: var(--main-color, #000000);
}

如果 --main-color 不存在,则 var(--main-color, #000000) 的返回值是 #000000

CSS 变量实例

以下我们将把一段不使用 CSS 变量的代码使用 CSS 变量进行改写,来体会 CSS 变量带来的好处。

我们以传统方法定义一些 CSS 样式如下:

body {
  background-color: #1e90ff;
}

h2 {
  border-bottom: 2px solid #1e90ff;
}

.container {
  color: #1e90ff;
  background-color: #ffffff;
  padding: 15px;
}

button {
  background-color: #ffffff;
  color: #1e90ff;
  border: 1px solid #1e90ff;
  padding: 5px;
}

首先,我们声明两个全局变量:--blue--white;然后,我们使用 var() 函数在样式表中插入变量的值:

:root {
  --blue: #1e90ff;
  --white: #ffffff;
}

body {
  background-color: var(--blue);
}

h2 {
  border-bottom: 2px solid var(--blue);
}

.container {
  color: var(--blue);
  background-color: var(--white);
  padding: 15px;
}

button {
  background-color: var(--white);
  color: var(--blue);
  border: 1px solid var(--blue);
  padding: 5px;
}

至此,我们看出使用 var() 的优点是:

  • 使代码更易于阅读(更易于理解)
  • 使更改颜色值变得更加容易

如果要将蓝色和白色更改为更柔和的蓝色和白色,您只需更改两个变量值:

:root {
  --blue: #6495ed;
  --white: #faf0e6;
}

用局部变量覆盖全局变量

从上一页我们了解到全局变量可以在整个文档中访问/使用,而局部变量只能在声明它的选择器内部使用。

有时我们希望变量只在页面的特定部分发生变化。

假设我们希望按钮元素使用不同颜色的蓝色。我们可以在 button 选择器中重新声明 --blue 变量。当我们在这个选择器中使用 var(--blue) 时,会返回局部 --blue 变量值。

我们看到局部 --blue 变量覆盖了全局的 --blue 变量:

:root {
  --blue: #1e90ff;
  --white: #ffffff;
}

body {
  background-color: var(--blue);
}

h2 {
  border-bottom: 2px solid var(--blue);
}

.container {
  color: var(--blue);
  background-color: var(--white);
  padding: 15px;
}

button {
  --blue: #0000ff;
  background-color: var(--white);
  color: var(--blue);
  border: 1px solid var(--blue);
  padding: 5px;
}

添加新的局部变量

如果一个变量只在一个地方使用,我们也可以声明一个新的局部变量,如下所示:

:root {
  --blue: #1e90ff;
  --white: #ffffff;
}

body {
  background-color: var(--blue);
}

h2 {
  border-bottom: 2px solid var(--blue);
}

.container {
  color: var(--blue);
  background-color: var(--white);
  padding: 15px;
}

button {
  --button-blue: #0000ff;
  background-color: var(--white);
  color: var(--button-blue);
  border: 1px solid var(--button-blue);
  padding: 5px;
}

使用 JavaScript 操作 CSS 变量

使用 JavaScript 可以情动的添加和读取 CSS 变量。

<script>
  // 获取根元素
  var r = document.querySelector(":root");

  // 读取变量函数
  function myFunction_get() {
    // 获取跟元素的样式
    var rs = getComputedStyle(r);
    // 提示 --blue 变量的值
    alert("The value of --blue is: " + rs.getPropertyValue("--blue"));
  }

  // 设置变量的函数
  function myFunction_set() {
    // 设置 --blue 变量的值
    r.style.setProperty("--blue", "lightblue");
  }
</script>

在媒体查询中使用变量

现在我们要更改媒体查询中的变量值。

提示: 媒体查询是关于为不同的设备(屏幕、平板电脑、手机等)定义不同的样式规则。可以在媒体查询章节中了解更多信息。

在这里,我们首先为 .container 类声明一个局部变量 --fontsize,赋值为 25 像素,并在 .container 中使用它 。然后,我们创建一条 @media 规则:“当浏览器的宽度为 450px 或更宽时,将 .container 类的 --fontsize 变量值更改为 50px。”

这是完整的示例:

/* 定义变量变量 */
:root {
  --blue: #1e90ff;
  --white: #ffffff;
}

.container {
  --fontsize: 25px;
}

/* Styles */
body {
  background-color: var(--blue);
}

h2 {
  border-bottom: 2px solid var(--blue);
}

.container {
  color: var(--blue);
  background-color: var(--white);
  padding: 15px;
  font-size: var(--fontsize);
}

@media screen and (min-width: 450px) {
  .container {
    --fontsize: 50px;
  }
}

浏览器兼容性处理

对于不支持 CSS 变量的浏览器,可以采用下面的写法。

a {
  color: #7f583f;
  color: var(--primary);
}

也可以使用 @support 命令进行检测。

/* 支持 CSS 变量 */
@supports ((--a: 0)) {
  /* 你的样式规则 */
}

/* 不支持 CSS 变量 */
@supports (not (--a: 0)) {
  /* 你的样式规则 */
}

浏览器支持

下表列出了完全支持的第一个浏览器版本。

属性 IE Chrome Firefox Safari Opera
var() 49.0 15.0 31.0 9.1 36.0