Sass 变量 #

什么是变量? #

变量是存储信息的容器,可以在整个样式表中重复使用。Sass 使用 $ 符号来定义变量。

scss
$primary-color: #3498db;
$font-size: 16px;

.button {
  background-color: $primary-color;
  font-size: $font-size;
}

变量定义 #

基本语法 #

scss
$variable-name: value;

命名规则 #

scss
// 有效命名
$color: red;
$primary-color: blue;
$font_size: 14px;  // 下划线
$fontSize: 14px;   // 驼峰
$font-size: 14px;  // 连字符(推荐)

// 无效命名
$1color: red;      // 不能以数字开头
$@color: blue;     // 不能包含特殊字符

命名约定 #

scss
// 语义化命名(推荐)
$primary-color: #3498db;
$secondary-color: #2ecc71;
$text-color: #333;
$border-color: #ccc;

// 功能性命名
$font-size-base: 16px;
$font-size-sm: 14px;
$font-size-lg: 18px;

// 状态命名
$color-success: #2ecc71;
$color-warning: #f39c12;
$color-danger: #e74c3c;
$color-info: #3498db;

变量作用域 #

全局变量 #

在任何嵌套层级之外定义的变量是全局变量:

scss
$global-color: blue;  // 全局变量

.container {
  color: $global-color;  // 可以访问
}

.item {
  color: $global-color;  // 可以访问
}

局部变量 #

在代码块内定义的变量是局部变量:

scss
.container {
  $local-color: red;  // 局部变量
  color: $local-color;  // 可以访问
}

.item {
  color: $local-color;  // 错误!无法访问
}

变量遮蔽 #

局部变量可以遮蔽全局变量:

scss
$color: blue;

.container {
  $color: red;  // 遮蔽全局变量
  color: $color;  // red
}

.item {
  color: $color;  // blue(全局变量)
}

!global 标志 #

使用 !global 将局部变量提升为全局变量:

scss
.container {
  $color: red !global;  // 创建全局变量
  color: $color;
}

.item {
  color: $color;  // red(可以访问)
}

!default 标志 #

使用 !default 设置默认值,如果变量已存在则不覆盖:

scss
$color: blue;

.container {
  $color: red !default;  // 不会覆盖
  color: $color;  // blue
}

// 常用于可配置的主题
$theme-color: #3498db !default;

.button {
  background-color: $theme-color;
}

变量数据类型 #

数字 #

scss
$width: 100px;
$height: 50%;
$margin: 1.5em;
$opacity: 0.8;  // 无单位数字

.container {
  width: $width;
  height: $height;
  margin: $margin;
  opacity: $opacity;
}

字符串 #

scss
$font-family: Helvetica, sans-serif;
$direction: left;
$image-path: "../images";

.container {
  font-family: $font-family;
  float: $direction;
  background-image: url("#{$image-path}/bg.png");
}

颜色 #

scss
// 十六进制
$color-hex: #3498db;

// RGB
$color-rgb: rgb(52, 152, 219);

// RGBA
$color-rgba: rgba(52, 152, 219, 0.8);

// HSL
$color-hsl: hsl(204, 70%, 53%);

// 颜色名称
$color-name: steelblue;

.element {
  color: $color-hex;
  background-color: $color-rgba;
}

布尔值 #

scss
$rounded: true;
$shadow: false;

@mixin card($rounded: true) {
  @if $rounded {
    border-radius: 8px;
  }
}

列表 #

scss
$border: 1px solid #ccc;
$padding: 10px 20px;
$font-stack: Helvetica, Arial, sans-serif;
$breakpoints: 576px, 768px, 992px, 1200px;

.container {
  border: $border;
  padding: $padding;
  font-family: $font-stack;
}

映射(Maps) #

scss
$colors: (
  primary: #3498db,
  secondary: #2ecc71,
  danger: #e74c3c
);

.button {
  background-color: map-get($colors, primary);
}

空值 #

scss
$var: null;

.element {
  // null 不会输出任何内容
  margin: $var;
}

变量插值 #

使用 #{} 进行变量插值:

选择器插值 #

scss
$name: "container";

.#{$name} {
  width: 100%;
}

// 编译后
.container {
  width: 100%;
}

属性名插值 #

scss
$prop: margin;

.element {
  #{$prop}-top: 10px;
  #{$prop}-bottom: 10px;
}

// 编译后
.element {
  margin-top: 10px;
  margin-bottom: 10px;
}

URL 插值 #

scss
$path: "../images";

.logo {
  background-image: url("#{$path}/logo.png");
}

// 编译后
.logo {
  background-image: url("../images/logo.png");
}

计算表达式插值 #

scss
$base: 10;

.element {
  width: #{$base + 5}px;
}

// 编译后
.element {
  width: 15px;
}

变量运算 #

数学运算 #

scss
$base-width: 100px;

.container {
  width: $base-width + 20;      // 120px
  width: $base-width - 20;      // 80px
  width: $base-width * 2;       // 200px
  width: $base-width / 2;       // 50px
  width: ($base-width / 2);     // 50px(推荐加括号)
}

颜色运算 #

scss
$color: #3498db;

.element {
  color: $color;
  background-color: lighten($color, 10%);  // 变亮
  border-color: darken($color, 10%);       // 变暗
}

实际应用示例 #

主题配置 #

scss
// _variables.scss
$themes: (
  light: (
    bg: #ffffff,
    text: #333333,
    primary: #3498db
  ),
  dark: (
    bg: #1a1a1a,
    text: #ffffff,
    primary: #2980b9
  )
);

// 使用
@function theme-color($theme, $key) {
  @return map-get(map-get($themes, $theme), $key);
}

body {
  background-color: theme-color(light, bg);
  color: theme-color(light, text);
}

响应式断点 #

scss
$breakpoints: (
  xs: 0,
  sm: 576px,
  md: 768px,
  lg: 992px,
  xl: 1200px,
  xxl: 1400px
);

@mixin respond-to($breakpoint) {
  $value: map-get($breakpoints, $breakpoint);
  @if $value {
    @media (min-width: $value) {
      @content;
    }
  }
}

.container {
  padding: 15px;
  
  @include respond-to(md) {
    padding: 30px;
  }
}

字体系统 #

scss
$font-sizes: (
  xs: 0.75rem,    // 12px
  sm: 0.875rem,   // 14px
  base: 1rem,     // 16px
  lg: 1.125rem,   // 18px
  xl: 1.25rem,    // 20px
  2xl: 1.5rem,    // 24px
  3xl: 1.875rem,  // 30px
  4xl: 2.25rem    // 36px
);

@function font-size($size) {
  @return map-get($font-sizes, $size);
}

.heading {
  font-size: font-size(2xl);
}

间距系统 #

scss
$spacer: 1rem;

$spacers: (
  0: 0,
  1: $spacer * 0.25,   // 4px
  2: $spacer * 0.5,    // 8px
  3: $spacer,          // 16px
  4: $spacer * 1.5,    // 24px
  5: $spacer * 3       // 48px
);

@function spacer($level) {
  @return map-get($spacers, $level);
}

.section {
  padding: spacer(4);
  margin-bottom: spacer(3);
}

变量最佳实践 #

1. 集中管理 #

scss
// _variables.scss
// 颜色
$color-primary: #3498db;
$color-secondary: #2ecc71;

// 字体
$font-family-base: Helvetica, sans-serif;
$font-size-base: 16px;

// 间距
$spacing-unit: 8px;

2. 语义化命名 #

scss
// 好
$color-primary: #3498db;
$color-text: #333;
$color-border: #ccc;

// 不好
$blue: #3498db;
$dark-gray: #333;
$light-gray: #ccc;

3. 使用映射组织相关变量 #

scss
// 好
$colors: (
  primary: #3498db,
  secondary: #2ecc71,
  text: #333
);

// 不好
$color-primary: #3498db;
$color-secondary: #2ecc71;
$color-text: #333;

4. 避免魔法数字 #

scss
// 好
$border-radius: 4px;
$transition-duration: 0.3s;

.button {
  border-radius: $border-radius;
  transition: all $transition-duration;
}

// 不好
.button {
  border-radius: 4px;
  transition: all 0.3s;
}

下一步 #

掌握了变量后,继续学习 嵌套规则,让样式编写更加简洁!

最后更新:2026-03-28