Article

预处理插件 Scss

更新于:2026-07-08

第 1 章:SCSS 简介与环境搭建

1.1 什么是 SCSS

概念名称说明注意事项
SCSS (Sassy CSS)SCSS 是 Sass(Syntactically Awesome Style Sheets)的一种语法格式,使用 .scss 作为文件扩展名。它完全兼容 CSS 语法,同时扩展了变量、嵌套、混合宏、函数等高级功能,使 CSS 更易于维护和复用。SCSS 是 CSS 的超集,任何合法的 CSS 代码都是合法的 SCSS 代码。
SassSass 是一种 CSS 预处理器语言,提供更强大的样式编写能力。它有两种语法:SCSS(推荐)和旧的缩进式 Sass(.sass 文件)。推荐使用 SCSS 语法,因其更接近标准 CSS,学习成本低,兼容性好。
预处理器SCSS 需要通过编译工具转换为纯 CSS 文件,才能被浏览器识别。这个过程称为”预处理”。开发时编写 .scss 文件,生产环境使用编译后的 .css 文件。

1.2 SCSS 与 CSS 的关系

概念名称说明注意事项
语法兼容性SCSS 完全兼容 CSS3 语法。所有 CSS 样式规则可以直接写在 .scss 文件中。可以逐步将现有 CSS 文件重命名为 .scss 来启用 SCSS 功能。
扩展能力SCSS 在 CSS 基础上增加了变量、嵌套、混合宏、函数、条件控制等编程特性。这些特性在编译后会转换为标准 CSS,不依赖浏览器支持。
编译输出SCSS 文件最终被编译为纯 CSS 文件,供网页引用。输出的 CSS 文件应优化(压缩、去调试信息)用于生产环境。

1.3 安装与编译工具(如 Sass CLI、Dart Sass)

工具名称语法用途代码示例注意事项
Dart Sass(推荐)sass <input.scss> [output.css]最新官方推荐的 Sass 实现,基于 Dart 编写,性能好,支持最新特性。sass styles.scss styles.css建议通过 npm 安装:npm install -g sass
Sass CLI(Node.js 版)sass [options] <input.scss> [output.css]命令行工具,用于编译单个或多个 SCSS 文件。sass --watch src/scss:dist/css支持监听、压缩、源码映射等选项。
安装命令(npm)npm install -g sass全局安装 Dart Sass,可在任意项目中使用。npm install -g sass需提前安装 Node.js 和 npm。
项目本地安装npm install --save-dev sass将 Sass 作为开发依赖安装到项目中,避免全局依赖。npm install --save-dev sass推荐用于团队项目,确保环境一致性。

1.4 配置编译选项(watch、output style 等)

编译选项语法用途代码示例注意事项
--watchsass --watch input.scss output.css监听文件变化,自动重新编译。sass --watch src/scss:dist/css开发时常用,提高效率。
--stylesass --style=compressed input.scss output.css设置输出格式,可选值:expandednestedcompactcompressedsass --style=compressed styles.scss styles.min.css生产环境建议使用 compressed 以减小文件体积。
--sourcemapsass --sourcemap input.scss output.css生成源码映射文件(.map),便于调试。sass --sourcemap --watch src/scss:dist/css开发时开启,生产环境可关闭。
--no-source-mapsass --no-source-map ...显式禁用源码映射。sass --no-source-map styles.scss styles.css减少输出文件数量。
--updatesass --update input.scss output.css仅当输入文件比输出文件更新时才编译。sass --update src/scss:dist/css--watch 更节省资源,适合一次性构建。

第 2 章:基础语法与变量

2.1 SCSS 语法格式(缩进式 vs 块式)

语法类型说明注意事项
SCSS(块式语法)使用大括号 {} 和分号 ;,与 CSS 语法一致,扩展了变量、嵌套等功能。文件扩展名为 .scss推荐使用,兼容性强,易于团队协作。
Sass(缩进式语法)使用缩进表示嵌套,无需大括号和分号。文件扩展名为 .sass旧语法,对缩进敏感,容易因空格问题出错,不推荐新项目使用。

2.2 变量声明与作用域

方法名称语法用途代码示例注意事项
变量声明$variable-name: value;声明一个 SCSS 变量,用于存储颜色、尺寸、字体等可复用值。$primary-color: #007bff;
$font-size: 16px;
变量名使用连字符或下划线命名法。
变量使用property: $variable-name;在样式规则中引用变量。color: $primary-color;
font-size: $font-size;
变量必须先声明后使用。
局部作用域在规则块或混合宏内声明的变量仅在该块内有效。scss\n$local: red;\n.example {\n $local: blue;\n color: $local;\n}\n块内变量会遮蔽外部同名变量。
全局作用域在根层级声明的变量为全局变量,可在任何地方访问。scss\n$global-var: 10px;\n.a { margin: $global-var; }\n避免过多全局变量,防止命名冲突。
!global 标志$variable: value !global;显式将变量提升为全局作用域,即使在块内声明。scss\n.scope {\n $var: local !global;\n}\n谨慎使用,避免污染全局命名空间。

2.3 数据类型简介(颜色、字符串、数字、布尔等)

数据类型说明注意事项
数字(Number)包括整数和小数,可带单位(如 16px1.5em)。支持基本数学运算(+-*/),注意除法在某些上下文中需用 #{} 或括号。
字符串(String)可带引号("text")或不带引号(text),常用于字体名、URL 等。不带引号的字符串在输出时保持原样;带引号的可用于插值。
颜色(Color)支持多种表示法:#ff0000rgb(255,0,0)rgba(255,0,0,0.5)red 等。颜色可参与运算(如 darken($color, 10%))。
布尔值(Boolean)truefalse,用于条件判断。通常与 @if 指令配合使用。
空值(Null)null 表示无值,不输出到 CSS。常用于条件判断或变量初始化。
列表(List)用空格或逗号分隔的值集合,如 10px 20px 30pxred, blue, green可通过 nth()join() 等函数操作。
Map(映射)键值对集合,语法为 (key1: value1, key2: value2),类似 JSON。常用于配置主题色、字体设置等结构化数据。

第 3 章:嵌套规则与父选择器

3.1 选择器嵌套(Selector Nesting)

方法名称语法用途代码示例注意事项
基本嵌套父选择器 { 子选择器 { ... } }将子元素样式嵌套在父元素中,提升可读性和结构清晰度。scss\n.navbar {\n .nav-item {\n color: #333;\n }\n}\n避免过度嵌套(建议不超过 3-4 层),防止生成过长的 CSS 选择器。
多级嵌套支持多层级嵌套,如 A { B { C { ... } } }组织复杂组件的样式结构。scss\n.card {\n .header {\n .title { font-size: 18px; }\n }\n}\n每增加一层嵌套,选择器特异性(specificity)提高,可能影响样式覆盖。
伪类嵌套在元素内直接嵌套伪类(:hover:focus 等)简化状态样式的编写。scss\n.btn {\n &:hover { background: #0056b3; }\n}\n必须与 & 结合使用(见 3.2 节),否则语法无效。
媒体查询嵌套@media 规则嵌套在选择器内部实现组件级响应式设计。scss\n.container {\n width: 100%;\n @media (min-width: 768px) {\n width: 750px;\n }\n}\n编译后媒体查询会提升到顶层,但样式作用范围不变。

3.2 父选择器 & 的使用

方法名称语法用途代码示例注意事项
引用父选择器&代表外层父选择器,用于生成并集、交集或修改选择器结构。scss\n.btn {\n &.active { color: green; }\n}\n/* 输出: .btn.active */\n& 不可单独使用,必须与其他选择器组合。
生成交集类&.modifier当前元素同时具有某类名时应用样式。scss\n.menu {\n &.open { display: block; }\n}\n常用于 BEM 命名法中的修饰符(modifier)。
生成并集选择器&, &-child生成多个相关选择器。scss\n.title {\n &, &-sub { font-weight: bold; }\n}\n/* 输出: .title, .title-sub */\n逗号分隔多个 & 表达式可生成并集。
伪类/伪元素组合&:hover&::before为当前元素添加状态或装饰样式。scss\na {\n &:hover { color: red; }\n &::before { content: ""; }\n}\n推荐使用 & 而非直接写 :hover,以保持嵌套结构。
兄弟选择器& + &生成相邻兄弟组合器。scss\n.item {\n & + & { margin-top: 10px; }\n}\n/* 输出: .item + .item */\n常用于列表项间距控制,避免首项有上边距。

3.3 属性嵌套(Property Nesting)

方法名称语法用途代码示例注意事项
前缀属性嵌套prop: { subprop: value; }将具有相同前缀的 CSS 属性分组。scss\n.box {\n font: {\n family: Arial;\n size: 16px;\n weight: bold;\n }\n}\n编译为 font-familyfont-size 等。
边框嵌套border: { style: solid; width: 1px; }简化边框属性设置。scss\n.divider {\n border: {\n top: { width: 2px; style: solid; }\n color: #ccc;\n }\n}\n支持 border-topborder-color 等子属性。
边距/填充嵌套margin: { top: 10px; bottom: 10px; }分别设置四个方向的间距。scss\n.section {\n padding: {\n left: 20px;\n right: 20px;\n }\n}\n可读性优于 padding: 10px 20px; 的简写。
背景嵌套background: { image: url(...); size: cover; }配置复杂背景属性。scss\n.hero {\n background: {\n image: url(bg.jpg);\n size: cover;\n position: center;\n }\n}\n注意 background 简写会覆盖其他未声明的子属性。
自定义前缀嵌套支持任意属性前缀创建自定义属性组。scss\n.element {\n -webkit-transition: {\n property: all;\n duration: 0.3s;\n }\n}\n编译为 -webkit-transition-property-webkit-transition-duration

第 4 章:混合宏(Mixins)

4.1 定义与调用 Mixin

方法名称语法用途代码示例注意事项
定义 Mixin@mixin name { ... }创建可复用的样式块。scss\n@mixin clearfix {\n &::after {\n content: "";\n display: table;\n clear: both;\n }\n}\n名称使用连字符命名法(kebab-case)。
调用 Mixin@include name;在样式规则中插入 Mixin 定义的内容。scss\n.container {\n @include clearfix;\n}\n可在任意选择器或规则块中调用。
Mixin 重用同一 Mixin 可被多次调用减少重复代码。scss\n.sidebar { @include clearfix; }\n.footer { @include clearfix; }\n每次调用都会生成完整的 CSS 规则。
命名空间限制Mixin 不支持嵌套命名空间不能像模块一样分组管理。——建议通过前缀命名组织(如 btn-*layout-*)。

4.2 Mixin 参数与默认值

方法名称语法用途代码示例注意事项
带参数 Mixin@mixin name($param) { ... }接收外部传入的值,提高灵活性。scss\n@mixin border-radius($radius) {\n border-radius: $radius;\n -webkit-border-radius: $radius;\n}\n参数名以 $ 开头。
调用带参 Mixin@include name($value);传递具体值给 Mixin。scss\n.box {\n @include border-radius(10px);\n}\n传参顺序需与定义一致。
默认参数值@mixin name($param: default)为参数设置默认值,使调用更灵活。scss\n@mixin border-radius($radius: 5px) {\n border-radius: $radius;\n}\n调用时可省略该参数。
多参数 Mixin@mixin name($p1, $p2, ...)接收多个参数。scss\n@mixin padding($top, $right, $bottom, $left) {\n padding: $top $right $bottom $left;\n}\n建议按 CSS 简写顺序定义参数。
关键字参数@include name($param1: val)按参数名传参,无需关心顺序。@include padding($top: 10px, $left: 20px);提高代码可读性和调用灵活性。

4.3 @content 指令与动态内容传递

方法名称语法用途代码示例注意事项
@content 指令@mixin name { @content; }允许在调用 Mixin 时传入任意样式块。scss\n@mixin media($width) {\n @media (max-width: $width) {\n @content;\n }\n}\n@content 必须出现在 Mixin 定义中。
传递内容块@include name { ... }@include 后使用 {} 传入样式。scss\n@include media(768px) {\n .nav { display: none; }\n}\n大括号内为纯 CSS 或 SCSS 代码。
动态媒体查询结合 @content 创建响应式 Mixin简化响应式断点管理。(同上)可定义多个断点 Mixin(如 mobiletablet)。
带参数的内容传递@content 可访问 Mixin 参数在传入的内容中使用 Mixin 的变量。scss\n@mixin for-size($size) {\n .item-#{$size} { @content; }\n}\n支持变量插值。
多次调用 @content可在 Mixin 中多次使用 @content实现重复样式注入。(不推荐)通常只使用一次,避免意外重复。

第 5 章:继承与占位符选择器

5.1 使用 @extend 实现样式继承

方法名称语法用途代码示例注意事项
样式继承@extend selector;让当前选择器继承另一个选择器的所有样式,减少重复 CSS。scss\n.alert { color: red; font-weight: bold; }\n.error { @extend .alert; border: 1px solid red; }\n/* 输出: .alert, .error { ... } */\n继承会合并选择器,提高特异性。
多重继承@extend sel1, sel2;同时继承多个选择器的样式。@extend .alert, .highlight;(在 .warning 中)按顺序继承,后继承的可能覆盖前面的样式。
继承类选择器@extend .class继承类名定义的样式块。scss\n.btn { padding: 10px; }\n.btn-primary { @extend .btn; background: blue; }\n推荐用于组件样式复用。
继承伪类@extend :hover继承状态样式(需谨慎使用)。.link { @extend a:hover; }可能导致意外的全局状态继承。
继承限制不支持跨文件直接继承(除非使用 @use 共享)@extend 作用范围受限于编译上下文。——推荐将共享样式放在基础文件中导入。

5.2 占位符选择器 %placeholder

方法名称语法用途代码示例注意事项
定义占位符%placeholder { ... }创建仅用于继承的抽象样式块,不会输出到最终 CSS。scss\n%clearfix {\n &::after { content: ""; display: table; clear: both; }\n}\n% 开头,语法类似类选择器。
继承占位符@extend %placeholder;使用占位符定义的样式。.container { @extend %clearfix; }编译后仅生成调用者的选择器。
避免冗余输出占位符不生成独立 CSS 规则优化最终 CSS 体积。(见上例)适合定义抽象样式模式(如网格、重置)。
嵌套占位符可在规则中定义 % 选择器局部化抽象样式。scss\n.component {\n %inner-style { color: blue; }\n .part { @extend %inner-style; }\n}\n作用域与变量类似,但继承仍有效。
与 Mixin 对比%placeholder vs @mixin占位符继承合并选择器,Mixin 复制代码。——高频复用用 @mixin,需合并选择器用 %

5.3 继承的优化与注意事项

概念名称说明注意事项
选择器合并@extend 会将继承者与被继承者用逗号合并输出。可能生成过长或复杂的选择器链,影响性能。
特异性提升继承后的选择器特异性等于被继承者。若被继承者是复合选择器(如 .nav .active),继承者也会获得高特异性。
避免继承 ID 选择器@extend #idID 选择器特异性极高,继承后难以覆盖,且违反组件化原则。
循环继承A 继承 B,B 继承 A导致编译错误或无限递归。
!important 冲突被继承的规则含 !important继承后仍保留 !important,可能造成样式强制覆盖。
编译性能大量 @extend 可能增加编译时间尤其在复杂项目中。

第 6 章:函数与运算

6.1 内置颜色函数(lighten、darken、saturate 等)

函数名称语法用途代码示例注意事项
lighten($color, $amount)lighten(#000, 20%)将颜色变亮指定百分比。scss\n$base: #0000ff;\n$light: lighten($base, 30%);\n$amount 为 0%~100% 的百分数。
darken($color, $amount)darken(#fff, 20%)将颜色变暗指定百分比。$dark: darken($base, 20%);常用于生成悬停状态颜色。
saturate($color, $amount)saturate(#808080, 20%)增加颜色饱和度。$vibrant: saturate($color, 15%);$amount 为正值;负值用 desaturate
desaturate($color, $amount)desaturate(#f00, 50%)降低颜色饱和度。$muted: desaturate($color, 30%);可用于生成禁用状态颜色。
fade-in($color, $amount)fade-in(rgba(0,0,0,0.5), 0.2)增加颜色透明度(使更不透明)。$opaque: fade-in($color, 0.1);$amount 为 0~1 的数字。
fade-out($color, $amount)fade-out(rgba(0,0,0,0.5), 0.2)降低颜色透明度(使更透明)。$transparent: fade-out($color, 0.3);常用于过渡效果。
opacify($color, $amount)opacify(rgba(0,0,0,0.5), 0.2)fade-in,增加不透明度。$solid: opacify($color, 0.2);语义更清晰。
transparentize($color, $amount)transparentize(rgba(0,0,0,0.5), 0.2)fade-out,增加透明度。$clear: transparentize($color, 0.2);语义更清晰。
mix($color1, $color2, $weight)mix(#f00, #00f, 50%)混合两种颜色,$weight 控制混合比例。$mixed: mix(red, blue, 70%);常用于渐变过渡色生成。

6.2 数值与单位运算

运算类型语法用途代码示例注意事项
加法+数值相加,单位需兼容。$width: 100px + 20px; // 120px10px + 1em 非法,单位不同。
减法-数值相减。$margin: 20px - 5px; // 15px同上,单位必须一致或可转换。
乘法*数值相乘。$area: 10px * 2; // 20px不能两个都有单位(如 10px * 2px 非法)。
除法/数值相除。$ratio: 100px / 2; // 50px在旧版本中 / 需用 #{} 或括号避免歧义。
括号分组()控制运算优先级。$result: (10px + 5px) * 2; // 30px优先级高于默认运算顺序。
单位转换支持同类单位自动转换如 cm 转 mm。$len: 1cm + 10mm; // 2cm编译时自动归一化。
字符串中运算#{$expr}在字符串或属性名中执行运算。scss\n$i: 2;\n.item-#{$i * 2} { ... }\n必须使用 #{} 插值语法。
除法注意事项/ 在某些上下文中被视为分隔符font: 16px/1.5 中的 / 不是运算。$line: 16px / 1.2; // 需确保上下文为表达式推荐用 #{16px / 1.2} 明确运算。

6.3 自定义函数(@function)

方法名称语法用途代码示例注意事项
定义函数@function name($args) { @return value; }创建可复用的计算逻辑。scss\n@function px-to-rem($px, $base: 16px) {\n @return ($px / $base) * 1rem;\n}\n必须包含 @return 语句。
调用函数function-name(args)在变量、属性中使用函数返回值。scss\n$size: px-to-rem(24px);\n.text { font-size: $size; }\n函数调用位置与变量相同。
返回值@return value指定函数返回结果。(见上例)函数执行到 @return 即终止。
默认参数$arg: default为函数参数设置默认值。(见上例 $base: 16px提高函数调用灵活性。
复杂逻辑支持条件、循环等控制指令实现高级计算。scss\n@function get-contrast($color) {\n @if (lightness($color) > 50%) {\n @return black;\n } @else {\n @return white;\n }\n}\n可封装设计系统逻辑。
命名规范使用连字符命名法保持一致性。calculate-spacingget-theme-color避免与内置函数重名。
作用域函数具有全局作用域定义后可在任意位置调用。——建议将函数集中放在 _functions.scss 文件中。

第 7 章:条件与循环控制指令

7.1 @if@else if@else

方法名称语法用途代码示例注意事项
@if 条件判断@if condition { ... }根据布尔表达式决定是否生成样式。scss\n$theme: dark;\n@if $theme == dark {\n .bg { background: #000; }\n}\n条件可为变量比较、函数返回值等。
@else if 多重分支@else if condition { ... }在前一个条件不满足时检查新条件。scss\n$theme: light;\n@if $theme == light {\n .bg { background: #fff; }\n} @else if $theme == dark {\n .bg { background: #000; }\n}\n可有多个 @else if 分支。
@else 默认分支@else { ... }当所有条件都不满足时执行。scss\n@if $theme == light {\n .bg { background: #fff; }\n} @else if $theme == dark {\n .bg { background: #000; }\n} @else {\n .bg { background: gray; }\n}\n必须位于最后,且只能有一个。
布尔运算符==!=><>=<=andornot构建复杂条件逻辑。@if ($width > 500px) and ($mode == wide) { ... }注意括号优先级。
函数作为条件使用 if() 或在 @if 中调用函数简化三元逻辑或动态判断。@if feature-exists(svg) { ... }自定义函数常用于环境检测。

7.2 @for 循环(from/to 与 through)

方法名称语法用途代码示例注意事项
@for 循环(through)@for $i from start through end遍历包含起止的整数范围。scss\n@for $i from 1 through 3 {\n .item-#{$i} { order: $i; }\n}\n/* 生成 .item-1, .item-2, .item-3 */\nthrough 包含 end 值。
@for 循环(to)@for $i from start to end遍历从 start 到 end-1 的范围。@for $i from 1 to 4 { ... }(同上效果)to 不包含 end 值。
数值递增自动生成递增数值创建栅格系统、动画延迟等。scss\n@for $i from 1 to 13 {\n .col-#{$i} { width: (100% / 12) * $i; }\n}\n常用于响应式布局类生成。
计算属性值在循环体内进行数学运算动态设置尺寸、颜色等。scss\n@for $i from 1 to 6 {\n h#{$i} { font-size: 2rem - ($i * 0.2); }\n}\n结合插值 #{} 使用。
变量作用域循环变量仅在循环内有效避免外部命名冲突。——循环结束后 $i 不再可用。

7.3 @each 循环(单变量与多变量)

方法名称语法用途代码示例注意事项
单变量 each@each $item in $list遍历列表中的每个元素。scss\n@each $icon in success, warning, error {\n .icon-#{$icon}:before {\n content: url("/icons/#{$icon}.png");\n }\n}\n最常用形式,适用于简单列表。
多变量 each@each $key, $value in $map遍历 Map 类型的键值对。scss\n$colors: (primary: blue, secondary: gray);\n@each $name, $color in $colors {\n .btn-#{$name} { background: $color; }\n}\n特别适合主题色、字体配置等结构化数据。
遍历 List支持空格或逗号分隔的列表处理类名、尺寸等集合。scss\n$sizes: 14px 16px 18px;\n@each $size in $sizes {\n .text-#{$size} { font-size: $size; }\n}\n列表中元素类型应一致。
遍历 Map(key1: value1, key2: value2)实现配置驱动的样式生成。(见上例)Map 是 SCSS 中组织配置数据的最佳方式。
嵌套 each可嵌套使用 @each生成多维组合类。scss\n@each $bp in sm, md, lg {\n @each $n in 1 through 12 {\n @media ($bp) { .col-#{$bp}-#{$n} { ... } }\n }\n}\n谨慎使用,避免生成过多 CSS 规则。

7.4 @while 循环

方法名称语法用途代码示例注意事项
@while 循环@while condition { ... }当条件为真时重复执行代码块。scss\n$i: 1;\n@while $i < 6 {\n .item-#{$i} { left: 20px * $i; }\n $i: $i + 1;\n}\n必须在循环体内修改变量以避免死循环。
手动控制迭代需显式更新循环变量提供最大灵活性。(见上例 $i: $i + 1若忘记更新变量,将导致无限循环和编译失败。
条件判断使用比较或逻辑表达式控制循环终止。@while $i <= length($list) { ... }可结合 length()nth() 等函数。
适用场景适用于无法预知迭代次数的情况如处理动态列表。——多数情况下推荐使用 @for@each,更安全清晰。
性能注意复杂条件可能影响编译速度尤其在深层嵌套中。——避免在 @while 中执行昂贵函数调用。

第 8 章:模块化与文件导入

8.1 使用 @use 导入模块(推荐方式)

方法名称语法用途代码示例注意事项
@use 导入@use "path/to/module";加载并使用另一个 SCSS 文件的功能(变量、mixin、函数)。scss\n@use 'variables';\n.btn { color: variables.$primary; }\n推荐方式,替代旧的 @import
命名空间自动推断基于文件名生成命名空间避免全局污染。_variables.scssvariables.$primary下划线和连字符转换为驼峰式(如 _config-utilsconfigUtils)。
自定义命名空间@use "module" as namespace;指定自定义命名空间名称。scss\n@use 'vars' as v;\n.btn { color: v.$primary; }\n可用 * 表示全局引入(不推荐)。
只引入部分内容@use "module" with (...)as *控制暴露的成员。@use 'themes' as t with ($primary: red);with 用于配置模块变量。
私有成员-_ 开头的变量/mixin不会被导出,仅模块内部使用。scss\n$_private: hidden;\n@mixin _internal() { ... }\n实现封装,防止外部访问。
编译独立性每个 @use 只加载一次避免重复包含。——不同路径视为不同模块,即使内容相同。

8.2 @forward 转发模块

方法名称语法用途代码示例注意事项
@forward 转发@forward "path/to/module";将另一个模块的内容转发出当前模块。scss\n// 在 _all.scss 中:\n@forward 'variables';\n@forward 'mixins';\n用于创建”包”文件,统一导出多个模块。
自定义命名空间@forward "module" as prefix-*转发时修改命名空间前缀。scss\n@forward 'helpers' as util-*;\n// 使用时:util-lighten(...)\n* 会被替换为原成员名。
隐藏成员@forward "module" hide member转发时排除某些成员。@forward 'tools' hide debug-log;防止不必要功能暴露。
只显示特定成员@forward "module" show member仅转发列出的成员。@forward 'config' show $primary, $secondary;更精细的控制权限。
配置转发模块@forward "module" with ($var: value)在转发时设置模块变量。@forward 'theme' with ($primary: blue);相当于为下游用户预设配置。
层级结构可构建模块依赖树实现大型项目架构。主文件 @use 'ui'_ui.scss@forward 多个组件模块推荐用于设计系统或组件库。

8.3 旧式 @import 的问题与替代方案

问题/概念说明注意事项
全局污染@import 将所有内容注入全局命名空间变量、mixin 易被意外覆盖,命名冲突风险高。
隐式依赖导入顺序影响结果,无明确依赖声明维护困难,重构易出错。
重复包含多次 @import 同一文件会重复插入代码导致 CSS 体积膨胀。
不支持私有成员无法隐藏内部实现细节所有定义均可被外部访问。
已废弃状态Sass 官方已弃用 @import新项目不应使用,旧项目建议迁移。
替代方案使用 @use@forward现代 SCSS 模块系统。
兼容性过渡可短期共存逐步替换。

第 9 章:高级特性与最佳实践

9.1 配置变量(Configuration with !default

方法名称语法用途代码示例注意事项
!default 标志$variable: value !default;定义可被外部覆盖的默认变量,仅当变量未定义时生效。scss\n// 在 _defaults.scss 中:\n$primary: blue !default;\n$spacing: 1rem !default;\n常用于库或框架,允许用户自定义主题。
优先级控制!default 的赋值优先外部定义的变量会覆盖默认值。scss\n// 用户文件:\n$primary: red;\n@use 'theme';\n// 结果:$primary = red\n必须在 @use 前定义才能覆盖。
模块配置结合 @use ... with (...)集中配置模块变量。scss\n@use 'theme' with (\n $primary: green,\n $dark-mode: true\n);\n推荐方式,替代全局变量覆盖。
防止意外覆盖保护库内部变量确保用户无法修改核心逻辑变量。$_internal-key: 'xyz'; // 无 !default,不可被覆盖私有变量使用 _ 前缀。
可配置性设计为 Mixin 或 Function 提供默认参数增强复用性。@mixin btn($color: $primary !default) { ... }参数级默认值与变量级 !default 结合使用。

9.2 插值(#{})与动态选择器

方法名称语法用途代码示例注意事项
插值语法#{}将 SCSS 表达式结果插入到选择器、属性或字符串中。scss\n$size: 16px;\n.font-#{$size} { font-size: $size; }\n仅在需要动态生成时使用。
动态类名生成.#{$variable}创建基于变量的类名。scss\n@each $name, $color in $colors {\n .btn-#{$name} { background: $color; }\n}\n常用于主题或状态类生成。
动态属性名#{$prop}: value设置动态 CSS 属性。scss\n$prefix: webkit;\ndiv {\n -#{$prefix}-transform: scale(1.1);\n}\n用于生成带浏览器前缀的属性。
选择器拼接&__#{$element}实现 BEM 等命名规范的自动化。scss\n.block {\n $element: header;\n &__#{$element} { padding: 1rem; }\n}\n需谨慎使用,避免生成无效选择器。
表达式计算#{expr} 在字符串中执行运算并插入结果。scss\n$grid: 12;\n.container {\n grid-template-columns: repeat(#{$grid}, 1fr);\n}\n括号内可为任意 SCSS 表达式。
作用域限制#{} 内可访问当前作用域变量支持函数调用等。scss\n$val: darken(#f00, 10%);\ndiv { background: #{darken($val, 5%)}; }\n不会创建新作用域。

9.3 使用 @at-root 跳出嵌套

方法名称语法用途代码示例注意事项
@at-root 基本用法@at-root { ... }将样式规则提升到根层级,脱离当前嵌套。scss\n.parent {\n color: red;\n @at-root { .orphan { opacity: 0.5; } }\n}\n生成的 .orphan 不再属于 .parent
跳出特定选择器@at-root .selector将单条规则提升到指定选择器层级。scss\n.btn {\n &.active {\n @at-root .btn-fixed.active { z-index: 10; }\n }\n}\n用于生成并列组件类。
结合 & 使用@at-root #{&}将当前选择器提升到根层级(通常用于媒体查询)。scss\n.banner {\n font-size: 16px;\n @media (min-width: 768px) {\n @at-root #{&} { font-size: 24px; }\n }\n}\n编译后媒体查询包裹原选择器,避免嵌套过深。
跳出多层嵌套自动提升到根无论嵌套多少层,均可跳出。scss\n.deep { .nested { .inner {\n @at-root .top-level { ... }\n} } }\n简化复杂组件的样式组织。
@media 结合常用于响应式设计将嵌套内的媒体查询提升。(见上例)推荐做法,保持 CSS 结构扁平。
性能影响无运行时性能问题编译期处理,不影响浏览器渲染。——主要影响代码可读性和维护性。

9.4 控制输出格式与调试(@error@warn@debug

方法名称语法用途代码示例注意事项
@debug@debug $value;输出变量值到控制台,用于调试。scss\n$width: 100px;\n@debug $width; // 输出: 100px\n仅在编译时报错,不影响 CSS 输出。
@warn@warn "message";发出警告信息,编译继续。scss\n@if $deprecated {\n @warn "Feature X is deprecated";\n}\n用于提示用户使用过时功能。
@error@error "message";抛出错误并终止编译。scss\n@if not $valid {\n @error "Invalid configuration";\n}\n用于强制校验参数或环境。
调试条件判断结合 @if 使用只在特定条件下调试。@if $debug-mode { @debug $color; }避免生产环境输出调试信息。
错误信息设计提供清晰上下文帮助用户快速定位问题。@error "Unsupported color: #{$c}. Use red, blue, or green.";信息应具体、可操作。
生产环境清理确保移除 @debug 和无用 @warn减少编译日志噪音。——可通过构建脚本自动剥离调试指令。

第 10 章:项目实战与架构设计

10.1 BEM 命名法与 SCSS 结合

概念名称说明注意事项
BEM 结构Block__Element—Modifier命名规范:块(Block)、元素(Element)、修饰符(Modifier)。
SCSS 嵌套实现使用 & 构建 BEM 类.btn { &__text { ... } &--large { ... } }
元素嵌套&__element表示块的子组件。
修饰符嵌套&--modifier表示块或元素的状态或变体。
防止过度嵌套限制 SCSS 嵌套层级建议不超过 3 层。
混合宏辅助创建 BEM 工具 Mixin简化重复模式。

10.2 设计可复用的 UI 组件库

方法名称语法/说明用途代码示例注意事项
原子化设计将 UI 拆分为原子、分子、有机体构建可组合的组件系统。Button(原子)、Form(分子)、Card(有机体)提高复用性和一致性。
参数化 Mixin带默认参数的 Mixin创建可配置组件。@mixin button($bg: $primary, $size: md) { ... }支持主题化和定制。
使用 Map 配置(key: value) 存储组件变体管理按钮类型、尺寸等。$btn-sizes: (sm: 12px, md: 16px, lg: 20px);便于循环生成类。
@each 生成变体遍历配置 Map自动生成多种样式类。scss\n@each $size, $font in $btn-sizes {\n .btn-#{$size} { font-size: $font; }\n}\n减少手动编写重复代码。
私有组件文件_component.scss将组件样式模块化。_button.scss_card.scss文件名使用下划线开头。
通过 @forward 暴露统一导出组件创建组件包。_components.scss@forward 'button'方便外部 @use

10.3 主题系统实现(深色/浅色模式)

方法名称语法/说明用途代码示例注意事项
主题变量 Map(light: (...), dark: (...))定义多套主题颜色。scss\n$themes: (\n light: (primary: #007bff, bg: #fff),\n dark: (primary: #0d6efd, bg: #121212)\n);\n集中管理设计令牌。
当前主题变量$theme: map-get($themes, $mode);根据模式获取当前主题。scss\n$mode: dark;\n$theme: map-get($themes, $mode);\n在根模块中配置。
CSS 自定义属性--color-primary: #{$value};:root 或类中定义变量。:root { --color-bg: #{$bg}; }支持运行时切换。
切换类.dark-mode { --color-bg: #121212; }通过类切换主题。scss\nbody.dark-mode {\n --color-text: white;\n}\n结合 JavaScript 动态切换。
@mixin theme封装主题应用逻辑简化主题应用。scss\n@mixin theme($mode) {\n $theme: map-get($themes, $mode);\n background: map-get($theme, bg);\n}\n可用于组件级主题支持。
媒体查询自动检测@media (prefers-color-scheme: dark)根据系统偏好自动切换。scss\n@media (prefers-color-scheme: dark) {\n body { @include theme(dark); }\n}\n提升用户体验。

10.4 文件组织结构(7-1 模式简介)

目录名称用途示例文件注意事项
base/基础样式(重置、通用类)_reset.scss_typography.scss定义全局默认样式。
components/可复用 UI 组件_buttons.scss_cards.scss按功能组织,每个组件一个文件。
layout/页面布局结构_header.scss_footer.scss_grid.scss处理页头、页脚、栅格等。
pages/特定页面样式_home.scss_about.scss仅用于页面独有样式,避免过度使用。
themes/主题和皮肤_light.scss_dark.scss存放主题变量和样式。
utils/工具类和函数_variables.scss_mixins.scss_functions.scss提供全局可用的工具。
vendor/第三方库覆盖_bootstrap-overrides.scss存放第三方框架的定制样式。
main.scss主入口文件main.scss使用 @use 导入所有模块,不包含样式。
模式优势7 个目录 + 1 个主文件清晰分离关注点scss\n@use 'utils/variables';\n@use 'base/reset';\n@use 'components/buttons';\n
可扩展性可根据项目调整如增加 animations/forms/保持目录扁平,避免过深嵌套。