SASS/SCSS 预处理器

1. SASS/SCSS 简介

1.1 SASS 与 SCSS 语法对比

SASS 提供两种语法格式以满足不同开发者的需求:

SASS(缩进语法)特点

  • 采用严格的缩进规则
  • 省略分号和花括号
  • 文件扩展名为 .sass
  • 适合熟悉Python/Ruby等语言的开发者

示例:

sass 复制代码
nav
  ul
    margin: 0
    padding: 0
    list-style: none
  li
    display: inline-block

SCSS(CSS扩展语法)特点

  • 完全兼容CSS3语法
  • 使用花括号和分号
  • 文件扩展名为 .scss
  • 适合前端开发团队协作

示例:

scss 复制代码
nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }
  li {
    display: inline-block;
  }
}

1.2 核心优势

SASS/SCSS 为CSS开发带来多项重要改进:

  1. 变量系统:集中管理设计参数
  2. 嵌套规则:直观反映DOM结构
  3. 代码复用:通过混合和继承减少重复
  4. 逻辑控制:支持条件和循环语句
  5. 模块化:支持文件拆分和按需引入
  6. 运算能力:处理数值、颜色和单位计算
  7. 丰富函数:提供颜色操作等实用功能

1.3 环境配置

安装方法

通过npm安装最新版本:

bash 复制代码
npm install -g sass

编译命令

基础编译:

bash 复制代码
sass input.scss output.css

开发模式(实时编译):

bash 复制代码
sass --watch src/:dist/

生产模式(压缩输出):

bash 复制代码
sass src/main.scss dist/main.css --style=compressed

构建工具集成

webpack配置示例:

javascript 复制代码
module.exports = {
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: [
          'style-loader',
          'css-loader',
          {
            loader: 'sass-loader',
            options: {
              implementation: require('sass')
            }
          }
        ]
      }
    ]
  }
};

2. 核心功能详解

2.1 变量系统

基础变量

scss 复制代码
$primary-color: #3498db;
$base-font-size: 16px;
$font-stack: ('Helvetica', 'Arial', sans-serif);

变量作用域

scss 复制代码
$global-var: red; // 全局变量

.block {
  $local-var: blue; // 局部变量
  color: $local-var;
  
  &.modifier {
    color: $global-var;
  }
}

默认变量

scss 复制代码
$primary-color: #3498db !default; // 仅当未定义时生效

2.2 嵌套规则

选择器嵌套

scss 复制代码
nav {
  ul {
    margin: 0;
    
    li {
      display: inline-block;
      
      a {
        padding: 5px;
      }
    }
  }
}

父选择器引用

scss 复制代码
.btn {
  &-primary { background: blue; }
  &-secondary { background: gray; }
  
  &:hover { opacity: 0.8; }
  &.disabled { opacity: 0.5; }
}

属性嵌套

scss 复制代码
.font {
  family: sans-serif;
  size: 16px;
  weight: bold;
}

2.3 混合(Mixins)

基础混合

scss 复制代码
@mixin reset-list {
  margin: 0;
  padding: 0;
  list-style: none;
}

ul {
  @include reset-list;
}

参数化混合

scss 复制代码
@mixin box-shadow($x, $y, $blur, $color) {
  box-shadow: $x $y $blur $color;
}

.card {
  @include box-shadow(0, 2px, 4px, rgba(0,0,0,0.1));
}

内容块

scss 复制代码
@mixin media($width) {
  @media (min-width: $width) {
    @content;
  }
}

.container {
  width: 100%;
  
  @include media(768px) {
    width: 750px;
  }
}

2.4 继承/占位符

基础继承

scss 复制代码
.message {
  padding: 10px;
  border: 1px solid #eee;
}

.success {
  @extend .message;
  border-color: green;
}

占位符选择器

scss 复制代码
%button-style {
  padding: 10px 15px;
  border-radius: 4px;
}

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

2.5 运算系统

数值运算

scss 复制代码
$base-size: 16px;

.container {
  font-size: $base-size * 1.25;
  padding: $base-size / 2;
  width: 100% / 3;
}

颜色运算

scss 复制代码
$primary: #3498db;

.button {
  background: $primary;
  border: 1px solid darken($primary, 10%);
  
  &:hover {
    background: lighten($primary, 10%);
  }
}

2.6 函数系统

内置函数

scss 复制代码
$colors: (primary: #3498db, secondary: #2ecc71);

.element {
  color: map-get($colors, primary);
  background: mix(white, #3498db, 20%);
  width: percentage(2/3);
}

自定义函数

scss 复制代码
@function em($pixels, $context: 16px) {
  @return ($pixels / $context) * 1em;
}

h1 {
  font-size: em(32px); // 2em
}

3. 高级特性

3.1 控制指令

条件语句

scss 复制代码
@mixin theme($dark: false) {
  @if $dark {
    background: #333;
    color: #fff;
  } @else {
    background: #fff;
    color: #333;
  }
}

循环语句

scss 复制代码
@for $i from 1 through 5 {
  .col-#{$i} {
    width: 20% * $i;
  }
}

$sizes: small, medium, large;
@each $size in $sizes {
  .icon-#{$size} {
    font-size: $size;
  }
}

3.2 模块系统

基础用法

scss 复制代码
// _variables.scss
$primary: #3498db !default;

// main.scss
@use 'variables' as vars;

.button {
  color: vars.$primary;
}

模块转发

scss 复制代码
// _library.scss
@forward 'variables';
@forward 'mixins';

// main.scss
@use 'library' as lib;

3.3 错误处理

调试工具

scss 复制代码
@debug "当前颜色值: #{$primary-color}";

@warn "不建议使用此混合,将在下个版本移除";

@error "无效的参数类型";

4. 工程化实践

4.1 目录结构

推荐的项目结构:

csharp 复制代码
styles/
├── abstracts/
│   ├── _variables.scss
│   ├── _functions.scss
│   └── _mixins.scss
├── base/
│   ├── _reset.scss
│   └── _typography.scss
├── components/
│   ├── _buttons.scss
│   └── _cards.scss
├── layouts/
│   ├── _header.scss
│   └── _footer.scss
└── main.scss

4.2 设计系统实现

设计令牌

scss 复制代码
// _tokens.scss
$tokens: (
  colors: (
    primary: #3498db,
    secondary: #2ecc71
  ),
  spacing: (
    base: 16px,
    small: 8px
  )
);

@function token($category, $key) {
  @return map-get(map-get($tokens, $category), $key);
}

响应式工具

scss 复制代码
$breakpoints: (
  mobile: 576px,
  tablet: 768px,
  desktop: 992px
);

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

5. 与现代CSS的配合

5.1 CSS变量集成

scss 复制代码
:root {
  --primary: #{$primary-color};
  --primary-dark: #{darken($primary-color, 10%)};
}

.element {
  color: var(--primary);
  background: $primary-color;
}

5.2 CSS原生嵌套

scss 复制代码
/* 编译为CSS后仍保持嵌套结构 */
.card {
  &__title {
    font-size: 1.2em;
    
    &:hover {
      color: blue;
    }
  }
}

6. 性能优化指南

  1. 控制嵌套深度:建议不超过4层
  2. 合理使用@extend:避免生成过多组合选择器
  3. 混合优化:避免在混合中包含大量样式
  4. 模块化分割:按需加载样式模块
  5. 生产环境压缩:使用compressed输出样式

7. 常见问题解答

Q: SASS变量和CSS变量有何区别? A: SASS变量在编译时确定,CSS变量在运行时可变

Q: 何时使用混合?何时使用继承? A: 混合适合带参数的样式复用,继承适合静态样式复用

Q: 如何组织大型项目的样式? A: 推荐采用ITCSS或7-1模式进行架构设计

附录:资源参考

  1. 官方文档
  2. SASS Playground
  3. Awesome Sass
相关推荐
代码搬运媛4 小时前
Jest 测试框架详解与实现指南
前端
counterxing5 小时前
我把 Codex 里的 Skills 做成了一个 MCP,还支持分享
前端·agent·ai编程
wangqiaowq5 小时前
windows下nginx的安装
linux·服务器·前端
之歆6 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
发现一只大呆瓜6 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
Maimai108086 小时前
React如何用 @microsoft/fetch-event-source 落地 SSE:比原生 EventSource 更灵活的实时推送方案
前端·javascript·react.js·microsoft·前端框架·reactjs·webassembly
kyriewen8 小时前
产品经理把PRD写成“天书”,我用AI半小时重写了一遍,他当场愣住
前端·ai编程·cursor
humcomm8 小时前
元框架的工作原理详解
前端·前端框架
canonical_entropy8 小时前
Attractor Before Harness: AI 大规模开发的方法论
前端·aigc·ai编程
zhangxingchao9 小时前
多 Agent 架构到底怎么选?从 Claude Agent Teams、Cognition/Devin 到工程落地原则
前端·人工智能·后端