CSS中的变量使用详解

CSS中的变量给了我们诸多优点:方便、代码重用、更可靠的代码库和提升防错能力。

示例

:root {
  --base-font-size: 16px;
  --link-color: #6495ed;
}

p {
  font-size: var( --base-font-size );
}

a {
  font-size: var( --base-font-size );
  color: var( --link-color );
}

基础

当使用CSS变量时,你应该了解的三个主要组成:

  • 自定义属性
  • var()函数
  • :root伪类

自定义属性

你已经知道了一些CSS的标准属性,如color,margin,widthfont-size

下面的示例使用了CSS的color属性:

body {
  color: #000000; /* The "color" CSS property */
}

自定义属性仅意味着我们(创建CSS文件的人)去定义属性的名字。

为了自定义一个属性名,我们需要用--作为前缀。

如果我们要创建一个值为黑色的、名为text-color的自定义属性,可以这样做:

:root {
  --text-color: #000000; /* A custom property named "text-color" */
}

var()函数

为了应用自定义属性,需要利用var()函数,否则浏览器不知道他们代表什么。

如果想要在ph1h2中的样式中使用--text-color,可以这样使用var()函数:

:root {
  --text-color: #000000;
}

p {
  color: var( --text-color );
  font-size: 16px;
}

h1 {
  color: var( --text-color );
  font-size: 42px;
}

h2 {
  color: var( --text-color );
  font-size: 36px;
}

其等价于:

p {
  color: #000000;
  font-size: 16px;
}

h1 {
  color: #000000;
  font-size: 42px;
}

h2 {
  color: #000000;
  font-size: 36px;
}

:root伪类

我们需要一个地方来放置自定义属性。虽然可以在任何样式规则中指定自定义属性,但到处定义属性并不是一个好主意,这对CSS的可维护性和可阅读性是一个挑战。

:root 伪类代表了HTML文档的根元素,这是一个放置自定义属性的好位置,因为我们可以通过其他更具特异性的选择器来覆盖自定义属性值。

CSS变量的好处

可维护性

在一个Web开发项目中,我们经常重复使用一个特定的CSS属性值:

h1 {
  margin-bottom: 20px;
  font-size: 42px;
  line-height: 120%;
  color: gray;
}

p {
  margin-bottom: 20px;
  font-size: 18px;
  line-height: 120%;
  color: gray;
}

img {
  margin-bottom: 20px;
  border: 1px solid gray;
}

.callout {
  margin-bottom: 20px;
  border: 3px solid gray;
  border-radius: 5px;
}

当需要改变某些属性值时,问题就会暴露出来了。

如果我们手动的改变属性值,尤其是当CSS文件很大时,不仅会花费大量时间,还可能会范一些错误。同样的,如果我们执行一个批处理查找和替换,就可能会无意中影响其他样式规则。

我们可以使用CSS变量重写:

:root {
  --base-bottom-margin: 20px;
  --base-line-height:   120%;
  --text-color:         gray;
}

h1 {
  margin-bottom: var( --base-bottom-margin );
  font-size: 42px;
  line-height: var( --base-line-height );
  color: var( --text-color );
}

p {
  margin-bottom: var( --base-bottom-margin );
  font-size: 18px;
  line-height: var( --base-line-height );
  color: var( --text-color );
}

img {
  margin-bottom: var( --base-bottom-margin );
  border: 1px solid gray;
}

.callout {
  margin-bottom: var( --base-bottom-margin );
  border: 1px solid gray;
  border-radius: 5px;
  color: var( --text-color );
}

假设你现在的客户说由于文本颜色太亮,导致文本难以阅读,想要改变文本颜色,此时,我们只需要更新一行CSS规则:

--text-color: black;

提高CSS的可读性

自定义属性会使样式表更加易读,也会使CSS属性声明更有语义。

将这个声明

background-color: yellow;
font-size: 18px;

和下面的声明比较一下

background-color: var( --highlight-color );
font-size: var( --base-font-size );

yellow18px一类的属性值并没有给我们任何有用的上下文信息,但是当我们阅读如--base-font-size--highlight-color一样的属性名时,即便在其他人的代码,我们都能马上知道这个属性值是在做什么。

要注意的事

大小写敏感

自定义属性是大小写敏感的(和普通的CSS规则不一样)

:root {
  --main-bg-color: green;
  --MAIN-BG-COLOR: RED;
}

.box {
  background-color: var( --main-bg-color ); /* green background */
}

.circle {
  BACKGROUND-COLOR: VAR(--MAIN-BG-COLOR ); /* red background */
  border-radius: 9999em;
}

.box,
.circle {
  height: 100px;
  width: 100px;
  margin-top: 25px;
  box-sizing: padding-box;
  padding-top: 40px;
  text-align: center;
}

自定义属性值的解析

当重复声明自定义属性时,其赋值遵循通常的CSS层叠和继承规则。例如下面的示例:

HTML

<body>
  <div class="container">
    <a href="">Link</a>
  </div>
</body>

CSS

:root {
  --highlight-color: yellow;
}

body {
  --highlight-color: green;
}

.container {
  --highlight-color: red;
}

a {
  color: var( --highlight-color );
}

当移除.container规则时,链接的颜色值将是green

回退值

当使用var()函数时,可以分配一个回退的属性值,其作为一个额外参数和第一个参数用,隔开。看下面的示例:

HTML

<div class="box">A Box</div>

CSS

div {
  --container-bg-color: black;
}

.box {
  width: 100px;
  height: 100px;
  padding-top: 40px;
  box-sizing: padding-box;
  background-color: var( --container-bf-color, red );
  color: white;
  text-align: center;
}

因为给var()传递了一个回退值参数,所以div的背景色最中被渲染成红色。

无效值

谨防给CSS属性分配错误类型的值。

在下面的示例中,由于自定义属性--small-button被赋予一个长度单位,它被用在.small-button样式中是无效的(译者注:因为color的属性类型值出错)

:root {
  --small-button: 200px;
}

.small-button {
 color: var(--small-button);
}

避免这种情况的一个好方式是想出具有描述性的自定义属性名称。例如将上面的自定义属性命名为--small-button-width

浏览器对CSS变量的支持

CSS变量用起来很方便,但是浏览器对其支持情况不太好:

或者戳此链接:var supported

译文出处:http://www.ido321.com/1580.html

本文根据@Jacob Gube的《Introduction to CSS Variables》所译,整个译文带有我自己的理解与思想,如果译得不好或有不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://sixrevisions.com/css/variables/

时间: 2024-11-19 07:45:22

CSS中的变量使用详解的相关文章

css中display常用属性详解之Block(一)

用了几年的css了,css中inline | block |inline-block|table|flex从来没有做过系统的整理和分析,网上的分析文章也很多,零散. 今天有空,就在这做一下整理分析 block 解释:指定对象为块元素(占据一定矩形空间,可以通过设置高度.宽度.内外边距等属性,来调整的这个矩形的样) 特点:1.处于常规流中时,如果width没有设置,会自动填充满父容器  2.可以应用margin/padding  3.在没有设置高度的情况下会扩展高度以包含常规流中的子元素  4.处

CSS中的盒子模型详解

很多人对盒子模型搞晕头了,下面通过一个简单的代码来分析盒子模型的结构! 为了方便方便观看!在第一个div中画了一个表格,并将其尺寸设置成与div内容大小一样!且设置body的margin和padding的属性都为0px: 本例子采用行内CSS样式! 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//

CSS中Position 的用法详解。

记得一年前,到一家公司面试的时候,问我position有哪几个属性,我憋半天才回答出2个,大家估计都清楚,就是我们经常用到的2个(relative,absolute). 最近又用到了好多,深入研究了下. 一.语法: position:static | relative | absolute | fixed 取值: static :默认值,无特殊定位,对象遵循正常文档流.top,right,bottom,left等属性不会被应用,默认值. relative:相对定位,对象遵循正常文档流,但将依据t

css中选择器优先级问题详解

先根据引入方式分:内联样式,头部样式,外部引入:这三个的优先级依次降低: 相同的引入方式时,根据选择器优先级判断显示哪个样式,具体规则如下: 将选择器的特殊性分为4个等级,a,b,c,d 行内样式,a=1 b 是ID选择器的总数 c 是类,伪类,属性选择器的总数 d 是元素(类型),伪元素选择器的总数 举例说明:   选择器 特殊性 以10为基准的特殊性 1 style="" 1,0,0,0 1000 2 #id01 #id02{} 0,2,0,0 200 3 #id .class{}

关于css中的align-content属性详解

align-content 作用: 会设置自由盒内部各个项目在垂直方向排列方式. 条件:必须对父元素设置自由盒属性display:flex;,并且设置排列方式为横向排列flex-direction:row;并且设置换行,flex-wrap:wrap;这样这个属性的设置才会起作用. 设置对象: 这个属性是对她容器内部的项目起作用,对父元素进行设置. 取值:stretch:默认设置,会拉伸容器内每个项目占用的空间,填充方式为给每个项目下方增加空白.第一个项目默认从容器顶端开始排列. <!DOCTYP

Nginx内置变量以及日志格式变量参数详解

Nginx内置变量以及日志格式变量参数详解 $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为空字符串 $uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html". $d

iOS中UIWebView的使用详解

iOS中UIWebView的使用详解 一.初始化与三种加载方式 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种: 第一种: - (void)loadRequest:(NSURLRequest *)request; 这是加载网页最常用的一种方式,通过一个网页URL来进行加载,这个URL可以是远程的也可以是本地的,例如我加载百度的主页:     UIWebView * view = [[UIWebView al

JQuery中$.ajax()方法参数详解

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求. 如果需要发送同步请求,请将此选项

js 中中括号,大括号使用详解

一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数.如:var LangShen = {"Name":"Langshen","AGE":"28"};上面声明了一个名为"LangShen"的对象,多个属性或函数用,(逗号)隔开,因为是对象的属性,所以访问时,应该用.(点)来层层访问:LangShen.Name.LangShen.AGE,当然我们也可以用数组的方式来访问,如:Lang