css预处理器

11 阅读2分钟

一、CSS 预处理器的本质与核心价值

  • 定义:CSS 预处理器是一种将「扩展语法」转换为标准 CSS 的工具(如 Less/Sass/Stylus),解决原生 CSS 在模块化、复用性、逻辑控制上的不足。
  • 核心价值
    • 复用性:通过变量、混合(Mixin)、函数减少重复代码。
    • 逻辑能力:支持条件判断(if)、循环(for)等编程语法。
    • 层级结构:以嵌套语法清晰表达 HTML 元素的层级关系。
    • 工程化:促进团队代码规范统一,提升大型项目维护性。

二、主流预处理器对比(Less/Sass/Stylus)

特性LessSass(含SCSS)Stylus
语法风格接近原生 CSS,简洁易读SCSS 嵌套更灵活,SASS 缩进式极简语法,省略分号/括号
变量定义@color: red;$color: red;color = red
混合(Mixin)@mixin border-radius();@mixin border-radius();border-radius() {}
函数支持内置函数丰富支持自定义函数函数语法更灵活
社区生态浏览器厂商支持(如 Less.js)最广泛使用,工具链成熟小众,适合追求极简的场景
编译方式可浏览器实时编译或预编译需预编译(Node.js 或 Ruby)预编译为主

三、核心功能与应用场景(以 Sass 为例)

1. 变量(Variables):统一管理样式主题

  • 场景:多页面共享主色调、字体大小等,修改时只需更新变量。
  • 示例
    $primary-color: #3498db;
    $font-size-base: 16px;
    
    .btn {
      background-color: $primary-color;
      font-size: $font-size-base;
    }
    

2. 混合(Mixin):复用复杂样式组合

  • 场景:重复使用的样式块(如圆角、弹性布局)。
  • 示例
    @mixin border-radius($radius: 4px) {
      border-radius: $radius;
      -webkit-border-radius: $radius;
      -moz-border-radius: $radius;
    }
    
    .card {
      @include border-radius(8px);
      box-shadow: 0 2px 10px rgba(0,0,0,0.1);
    }
    

3. 嵌套(Nesting):清晰表达层级关系

  • 场景:复杂选择器(如导航菜单的hover状态)。
  • 示例
    .nav {
      ul {
        list-style: none;
        li {
          display: inline-block;
          a {
            color: #333;
            &:hover { color: $primary-color; } // & 表示父选择器
          }
        }
      }
    }
    

4. 函数与运算:动态生成样式

  • 场景:根据主题计算颜色、尺寸等(如透明度、响应式布局)。
  • 示例
    // 生成带透明度的颜色
    @function transparent($color, $alpha) {
      return rgba(red($color), green($color), blue($color), $alpha);
    }
    
    .bg-overlay {
      background-color: transparent($primary-color, 0.5);
    }
    
    // 尺寸计算
    .container {
      width: 100% - 40px; // 支持加减乘除运算
    }
    

5. 继承(Extend):减少冗余选择器

  • 场景:多个元素共享基础样式(如按钮的默认状态)。
  • 示例
    .btn-base {
      padding: 8px 16px;
      border: none;
      border-radius: 4px;
      cursor: pointer;
    }
    
    .btn-primary {
      @extend .btn-base;
      background-color: $primary-color;
      color: white;
    }
    
    .btn-secondary {
      @extend .btn-base;
      background-color: #f5f5f5;
      color: #333;
    }
    

四、工程化应用与性能优化

  1. 项目集成
    • Webpack 中通过 less-loader/sass-loader 编译。
    • Vue 项目可在 <style lang="scss"> 中直接使用。
  2. 性能优化
    • 避免深层嵌套(建议不超过3层),防止生成过长的选择器。
    • 谨慎使用 @import 嵌套导入,可改用 @use(Sass 3.11+)实现模块化。
    • 生产环境开启压缩(如 cssnano),减少文件体积。
  3. 与 PostCSS 的区别
    • 预处理器:编译时扩展语法(如变量、逻辑)。
    • PostCSS:编译后处理 CSS(如 autoprefixer、CSS 模块),两者可配合使用。

五、预处理器的选择与实践建议

“在项目中选择预处理器时,需结合团队技术栈与场景:

  • 若追求简单易上手,选 Less(语法接近原生,浏览器可直接运行);
  • 复杂项目推荐 Sass/SCSS(功能全面,社区生态成熟,支持函数、高级运算);
  • 极简风格或 Node.js 环境可选 Stylus(语法极简,但需学习成本)。