前言
- 你可以把反复使用的
css
属性值 定义成变量,然后通过变量名来引用它们,而无需重复书写这一属性值。或者,对于仅使用过一 次的属性值,你可以赋予其一个易懂的变量名,让人一眼就知道这个属性值的用途。- 在开发中,我们可以将一些 字号、字体颜色、背景颜色 等等定义成变量,然后通过合适的语法使用这些变量;
- 在工作当中,使用的 CSS预处理器语言 大多数都是
Scss
(我工作当中哈😂),所以使用的Scss
变量会多一些,有些项目中需要定制主题色,这就会使用到样式变量了; - 下面就来说说我们常见的 CSS预处理器语言 和 CSS 是 怎么定义变量 以及是 怎么使用变量 的;
一、CSS
1.1 基本语法
-
定义变量关键字 :
--
;
-
语法 :
css--变量名: 属性值;
1.2 定义全局变量 及 使用
- ❗ 注意 :
- 定义 全局变量 需要将变量放置在
:root {}
中; - 将 存放 全局变量 的 样式文件 导入到
main.ts / main.js
中; - 定义成全局变量之后,在所有文件的
style
中就可以使用变量了;
- 定义 全局变量 需要将变量放置在
1.2.1 定义变量
css
:root {
--cp-primary: #16C2A3;;
}
1.2.2 使用变量
html
<script setup lang="ts"></script>
<template>
<!-- 验证vant颜色被覆盖 -->
<van-button type="primary">按钮</van-button>
<a href="#">123</a>
</template>
<style scoped lang="scss">
<!-- 使用 css 变量 -->
a {
color: var(--cp-primary);
}
</style>
1.3 定义局部变量 及 使用
- 局部变量 :
- 只有在 当前选择器 或 当前选择器的子元素 中使用;
css
div {
--cp-text1: #121826;
color: var(--cp-text1);
span {
color: var(--cp-text1);
}
}
二、Scss
sass
使用$
符号来标识变量(老版本 的sass
使用!
来标识变量。改成$
是多半因为!highlight-color
看起来太丑了。),比如$highlight-color
和$sidebar-width
;- ❗ 为什么选择
$
符号呢 ?- 因为它好认、更具美感;
- 且在
CSS
中 并无他用,不会导致 与现存 或 未来的css
语法冲突。
2.1 定义变量
-
定义变量的关键字 :
$
;
-
语法 :
scss$变量名: 属性值;
2.2 使用变量
- 与
CSS
属性不同,变量可以在css
规则块定义之外存在。当变量定义在css
规则块内,那么该变量只能在此规则块内使用。如果它们出现在任何形式的{...}
块中(如@media
或者@font-face
块),情况也是如此:
scss
$nav-color: #F90;
nav {
$width: 100px;
width: $width;
color: $nav-color;
}
//编译后
nav {
width: 100px;
color: #F90;
}
- 在这段代码中,
$nav-color
这个变量定义在了规则块外边,所以在这个样式表中都可以像nav
规则块那样引用它。$width
这个变量定义在了nav
的{ }
规则块内,所以它只能在nav
规则块 内使用。这意味着是你可以在样式表的其他地方定义和使用$width
变量,不会对这里造成影响。
2.3 变量引用
- 凡是
css
属性的标准值(比如说1px或者bold)可存在的地方,变量就可以使用。css
生成时,变量会被它们的值所替代。之后,如果你需要一个不同的值,只需要改变这个变量的值,则所有引用此变量的地方生成的值都会随之改变。
scss
$highlight-color: #F90;
.selected {
border: 1px solid $highlight-color;
}
//编译后
.selected {
border: 1px solid #F90;
}
- 看上边示例中的
$highlight-color
变量,它被直接赋值给border
属性,当这段代码被编译输出css
时,$highlight-color
会被#F90
这一颜色值所替代。产生的效果就是给selected
这个类一条1像素宽、实心且颜色值为#F90
的边框。 - 在声明变量时,变量值也可以引用其他变量。当你通过粒度区分,为不同的值取不同名字时,这相当有用。下例在独立的颜色值粒度上定义了一个变量,且在另一个更复杂的边框值粒度上也定义了一个变量:
scss
$highlight-color: #F90;
$highlight-border: 1px solid $highlight-color;
.selected {
border: $highlight-border;
}
//编译后
.selected {
border: 1px solid #F90;
}
- 这里,
$highlight-border
变量的声明中使用了$highlight-color
这个变量。产生的效 果就跟你直接为border
属性设置了一个1px
$highlight-color solid
的值是一样的。 最后,我们来了解一下变量命名的实用技巧,以结束关于变量的介绍。
2.4 变量名用中划线还是下划线分隔
sass
的变量名可以与css
中的属性名和选择器名称相同,包括中划线和下划线。这完全取决于个人的喜好,有些人喜欢使用中划线来分隔变量中的多个词(如$highlight-color
),而有些人喜欢使用下划线(如$highlight_color
)。使用中划线的方式更为普遍,这也是compass
和本文都用的方式。- 不过,
sass
并不想强迫任何人一定使用中划线或下划线,所以这 两种用法相互兼容 。用 中划线 声明的变量 可以使用 下划线的方式 引用 ,反之亦然。这意味着即使compass
选择用中划线的命名方式,这并不影响你在使用compass
的样式中用下划线的命名方式进行引用:
scss
$link-color: blue;
a {
color: $link_color;
}
//编译后
a {
color: blue;
}
- 在上例中,
$link-color
和$link_color
其实指向的是同一个变量;
三、Less
scss
和less
定义变量的方式很相似,除了 关键字 不同,其他的都一样;
3.1 定义变量
-
定义变量的关键字 :
less@
-
语法 :
less@变量名: 属性值;
3.2 使用变量
less
@width: 10px;
@height: @width + 10px;
#header { width: @width; height: @height; }
// 编译后
#menu a {
color: #111;
.bordered();
}
.post a {
color: red;
.bordered();
}