Skip to content

Sass 基础语法使用说明书


1. 变量 (Variables)

存储可复用的值(颜色、字体、尺寸等),使用 $ 定义:

scss
$primary-color: #3498db;
$font-stack: 'Helvetica', sans-serif;

body {
    color: $primary-color;
    font-family: $font-stack;
}

2. 嵌套 (Nesting)

嵌套选择器,保持结构清晰:

scss
nav {
    ul {
        margin: 0;
        li {
            display: inline-block;
            a {
                color: red;
                &:hover {
                    // & 表示父选择器
                    text-decoration: underline;
                }
            }
        }
    }
}

编译为:

css
nav ul {
    margin: 0;
}
nav ul li {
    display: inline-block;
}
nav ul li a {
    color: red;
}
nav ul li a:hover {
    text-decoration: underline;
}

3. 混合 (Mixins)

定义可复用的样式块,支持参数:

scss
@mixin flex-center($direction: row) {
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: $direction;
}

.container {
    @include flex-center(column); // 调用混合
}

4. 继承 (Extend)

共享样式,减少重复代码:

scss
%button-base {
    // 占位符选择器(不直接编译)
    padding: 10px 20px;
    border-radius: 4px;
}

.primary-btn {
    @extend %button-base;
    background: blue;
}

.secondary-btn {
    @extend %button-base;
    background: gray;
}

5. 函数 (Functions)

计算并返回值,使用 @function

scss
@function double($n) {
    @return $n * 2;
}

.sidebar {
    width: double(100px); // 200px
}

6. 条件与循环 (Control Directives)

条件语句 @if

scss
$theme: 'dark';

body {
    @if $theme == 'dark' {
        background: black;
    } @else {
        background: white;
    }
}

循环 @for

scss
@for $i from 1 through 3 {
    .item-#{$i} {
        // 插值语法 #{$var}
        width: 100px * $i;
    }
}

编译结果:

css
.item-1 {
    width: 100px;
}
.item-2 {
    width: 200px;
}
.item-3 {
    width: 300px;
}

循环 @each

scss
$colors: (red, green, blue);

@each $color in $colors {
    .bg-#{$color} {
        background: $color;
    }
}

7. 导入 use (Import 废弃)

拆分模块,按需导入(文件命名以 _ 开头,如 _variables.scss):

scss
// main.scss
// 不推荐使用 @import 导入
@import 'variables'; // 无需下划线和扩展名
@import 'mixins';

// 推荐使用@use
@use 'variables' as *; // 无需下划线和扩展名
@use 'mixins';
.container {
    color: $primary-color;
    @include mixins.flex-center;
}

8. 运算 (Operations)

支持数学运算:

scss
$base-padding: 10px;

.container {
    padding: $base-padding * 2; // 20px
    width: 100% / 3; // 33.333%
}

9. 注释 (Comments)

  • 单行注释:// 不会编译到CSS
  • 多行注释:/* 会编译到CSS */

安装与使用

  1. 安装Sass

    bash
    npm install sass -g
  2. 编译Sass

    bash
    sass input.scss output.css
  3. 监听文件变化

    bash
    sass --watch input.scss:output.css

最佳实践

  1. 使用变量管理设计系统(颜色、间距等)。
  2. 拆分代码为多个文件(_variables.scss_mixins.scss)。
  3. 嵌套不超过3层,避免过度嵌套。
  4. 优先使用 Mixins 处理带参数的样式,Extend 处理静态样式。

示例结构:

styles/
├── main.scss
├── _variables.scss
├── _mixins.scss
└── components/
    └── _buttons.scss

掌握这些基础语法后,可显著提升CSS开发效率与可维护性!

其他

SCSS 最新的模块系统(基于 @use@forward)已彻底取代旧版 @import,核心目标是解决命名冲突、提升代码可维护性,并通过显式命名空间实现安全的模块化开发。以下是关键实践总结:


⚙️ 一、@use 模块化导入(替代 @import

  1. 基础语法

    scss
    @use 'path/to/module' as namespace; // 带命名空间
    @use 'module' as *; // 全局暴露(谨慎使用)
    • 导入的变量/混合需通过命名空间访问:namespace.$color
    • as * 会将模块内容直接注入全局作用域(类似旧版 @import,但仍有独立作用域)。
  2. 优势

    • 避免命名冲突:每个模块有独立命名空间。
    • 按需加载:仅导入实际使用的成员。
    • 私有成员控制:以 _ 开头的变量/混合不会被导出(如 $_private-var)。

🌐 二、全局变量配置(跨模块共享)

通过构建工具全局注入变量文件,避免重复导入:

  1. Vite 示例vite.config.ts

    ts
    css: {
        preprocessorOptions: {
            scss: {
                additionalData: '@use "src/styles/variables.scss" as *;';
            }
        }
    }
  2. Webpack 示例(需 sass-resources-loader

    js
    {
      loader: 'sass-resources-loader',
      options: { resources: './src/globals/vars.scss' }
    }

适用场景:主题色、间距、断点等全局变量。


🗂️ 三、模块化工程实践

  1. 文件结构规范

    bash
    src/styles/
    ├── base/
       ├── _reset.scss      # 重置样式
       └── _variables.scss  # 全局变量
    ├── utils/
       ├── _mixins.scss     # 混合宏
       └── _functions.scss
    └── components/
        ├── Button.module.scss # 组件样式(CSS Modules)
        └── Card.scss
  2. 组件内导入示例

    scss
    // Button.module.scss
    @use 'src/styles/base/variables' as vars;
    @use 'src/styles/utils/mixins' as mx;
    
    .button {
        color: vars.$primary;
        @include mx.shadow(2px);
    }

⚖️ 四、@use vs @import 核心区别

特性@use@import
作用域模块独立命名空间全局作用域(易冲突)
私有成员支持(_前缀)不支持
重复导入仅加载一次(防冗余)多次加载
性能编译更快(依赖树清晰)较慢(全局扫描)

⚠️ 五、注意事项

  1. 弃用警告:继续使用 @import 会触发编译器警告,需逐步迁移。
  2. 构建工具依赖@use 需 Dart Sass(Node Sass 不支持)。
  3. 慎用 as *:过度使用可能导致全局污染,建议仅在工具类/变量文件中使用。

💎 总结

  • 新项目:直接采用 @use + 全局注入配置,结合 CSS Modules 实现组件级隔离。
  • 旧项目迁移:逐步替换 @import@use,优先从工具文件(变量、混合)入手。
  • 工程化建议:通过 Vite/Webpack 统一管理全局依赖,结合目录分层提升可维护性。

更深入的技术细节可参考:Sass 官方模块文档Vite SCSS 配置指南