Article
第 1 章:SCSS 简介与环境搭建
1.1 什么是 SCSS
| 概念名称 | 说明 | 注意事项 |
|---|---|---|
| SCSS (Sassy CSS) | SCSS 是 Sass(Syntactically Awesome Style Sheets)的一种语法格式,使用 .scss 作为文件扩展名。它完全兼容 CSS 语法,同时扩展了变量、嵌套、混合宏、函数等高级功能,使 CSS 更易于维护和复用。 | SCSS 是 CSS 的超集,任何合法的 CSS 代码都是合法的 SCSS 代码。 |
| Sass | Sass 是一种 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 等)
| 编译选项 | 语法 | 用途 | 代码示例 | 注意事项 |
|---|---|---|---|---|
--watch | sass --watch input.scss output.css | 监听文件变化,自动重新编译。 | sass --watch src/scss:dist/css | 开发时常用,提高效率。 |
--style | sass --style=compressed input.scss output.css | 设置输出格式,可选值:expanded、nested、compact、compressed。 | sass --style=compressed styles.scss styles.min.css | 生产环境建议使用 compressed 以减小文件体积。 |
--sourcemap | sass --sourcemap input.scss output.css | 生成源码映射文件(.map),便于调试。 | sass --sourcemap --watch src/scss:dist/css | 开发时开启,生产环境可关闭。 |
--no-source-map | sass --no-source-map ... | 显式禁用源码映射。 | sass --no-source-map styles.scss styles.css | 减少输出文件数量。 |
--update | sass --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) | 包括整数和小数,可带单位(如 16px、1.5em)。 | 支持基本数学运算(+、-、*、/),注意除法在某些上下文中需用 #{} 或括号。 |
| 字符串(String) | 可带引号("text")或不带引号(text),常用于字体名、URL 等。 | 不带引号的字符串在输出时保持原样;带引号的可用于插值。 |
| 颜色(Color) | 支持多种表示法:#ff0000、rgb(255,0,0)、rgba(255,0,0,0.5)、red 等。 | 颜色可参与运算(如 darken($color, 10%))。 |
| 布尔值(Boolean) | true 和 false,用于条件判断。 | 通常与 @if 指令配合使用。 |
| 空值(Null) | null 表示无值,不输出到 CSS。 | 常用于条件判断或变量初始化。 |
| 列表(List) | 用空格或逗号分隔的值集合,如 10px 20px 30px 或 red, 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-family、font-size 等。 |
| 边框嵌套 | border: { style: solid; width: 1px; } | 简化边框属性设置。 | scss\n.divider {\n border: {\n top: { width: 2px; style: solid; }\n color: #ccc;\n }\n}\n | 支持 border-top、border-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(如 mobile、tablet)。 |
| 带参数的内容传递 | @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 #id | ID 选择器特异性极高,继承后难以覆盖,且违反组件化原则。 |
| 循环继承 | 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; // 120px | 10px + 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-spacing、get-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 | 必须位于最后,且只能有一个。 |
| 布尔运算符 | ==、!=、>、<、>=、<=、and、or、not | 构建复杂条件逻辑。 | @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 */\n | through 包含 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.scss → variables.$primary | 下划线和连字符转换为驼峰式(如 _config-utils → configUtils)。 |
| 自定义命名空间 | @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/ | 保持目录扁平,避免过深嵌套。 |