CSS 预处理器 Sass

目录

Sass

一、Sass 是什么?

二、核心功能详解

1. 变量(Variables)

2. 嵌套(Nesting)

3. 混合宏(Mixins)

4. 继承(Inheritance)

5. 运算(Operations)

6. 函数(Functions)

7. 条件与循环

8. 模块化(Modules)

三、Sass 工具链

1. 安装与编译

2. 集成构建工具

3. VS Code 插件

四、最佳实践

五、Sass 与 Less 对比   

Sass 与 Less 核心对比

一、核心对比速览

二、语法细节对比

1. 变量定义

2. 嵌套语法

3. 混合宏(Mixins)

4. 条件控制

三、功能深度对比

1. 函数与运算

2. 继承机制

3. 模块化支持

四、编译与性能

五、社区与生态

六、迁移策略

七、选型建议

Sass 内置函数

一、颜色函数

1. 颜色调整

2. 颜色混合

3. 颜色通道提取

二、数值函数

三、字符串函数

四、列表函数

五、映射函数(Map)

六、其他实用函数

七、实战示例

八、总结


Sass

一、Sass 是什么?

Sass(Syntactically Awesome Style Sheets)是一种 CSS 预处理器,通过增强 CSS 的语法(如变量、嵌套、混合宏等)提升代码的可维护性和开发效率。Sass 最终会编译为标准的 CSS,兼容所有浏览器。

  • 两种语法

    • SCSS.scss):兼容 CSS 语法,使用 {} 和 ;

    • Sass.sass):缩进语法,无 {} 和 ;(较少用)。


二、核心功能详解

1. 变量(Variables)

  • 定义变量:存储颜色、尺寸、字体等重复使用的值。

    $primary-color: #3498db;
    $font-stack: Helvetica, sans-serif;
  • 使用变量

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

2. 嵌套(Nesting)

  • 规则嵌套:简化层级结构。

    .nav {padding: 1rem;ul {margin: 0;li {display: inline-block;a {color: $primary-color;}}}
    }
  • 父选择器引用:使用 & 引用父级。

    .button {&:hover { background: darken($primary-color, 10%); }&-large { padding: 20px; }
    }

3. 混合宏(Mixins)

  • 定义可复用代码块

    @mixin flex-center {display: flex;justify-content: center;align-items: center;
    }
  • 调用混合宏

    .container {@include flex-center;
    }
  • 带参数的混合宏

    @mixin box-shadow($x, $y, $blur, $color) {box-shadow: $x $y $blur $color;
    }
    .card {@include box-shadow(2px, 2px, 10px, rgba(0,0,0,0.1));
    }

4. 继承(Inheritance)

  • 代码复用:通过 @extend 共享样式。

    %button-base {padding: 10px 20px;border-radius: 4px;
    }
    .primary-button {@extend %button-base;background: $primary-color;
    }
    .secondary-button {@extend %button-base;background: #2ecc71;
    }

5. 运算(Operations)

  • 数学运算:支持 +-*/%

    $container-width: 1200px;
    .sidebar {width: $container-width / 4;
    }

6. 函数(Functions)

  • 内置函数:颜色处理、字符串操作等。

    .dark-bg {background: darken($primary-color, 20%);
    }
  • 自定义函数

    @function em($px, $base: 16px) {@return ($px / $base) * 1em;
    }
    h1 {font-size: em(32px); // 2em
    }

7. 条件与循环

  • @if / @else

    @mixin theme($dark: false) {@if $dark {background: #333;color: white;} @else {background: white;color: #333;}
    }
  • @for 循环

    @for $i from 1 through 5 {.col-#{$i} {width: 20% * $i;}
    }
  • @each 遍历

    $colors: red, green, blue;
    @each $color in $colors {.icon-#{$color} {fill: $color;}
    }
  • @while 循环(较少用):

    $i: 1;
    @while $i < 6 {.item-#{$i} { width: 20px * $i; }$i: $i + 1;
    }

8. 模块化(Modules)

  • 分文件管理:通过 @use 或 @import 导入模块。

    // _variables.scss
    $primary-color: #3498db;// main.scss
    @use 'variables' as vars;
    .header {color: vars.$primary-color;
    }

三、Sass 工具链

1. 安装与编译

  • 安装 Sass(需 Node.js):

    npm install -g sass
  • 命令行编译

    sass input.scss output.css
    sass --watch input.scss:output.css  # 监听文件变化

2. 集成构建工具

  • Webpack:使用 sass-loader

    // webpack.config.js
    module: {rules: [{test: /\.scss$/,use: ['style-loader', 'css-loader', 'sass-loader']}]
    }
  • Gulp:使用 gulp-sass

    const gulp = require('gulp');
    const sass = require('gulp-sass')(require('sass'));
    gulp.task('sass', () => {return gulp.src('src/scss/*.scss').pipe(sass().on('error', sass.logError)).pipe(gulp.dest('dist/css'));
    });

3. VS Code 插件

  • Live Sass Compiler:实时编译 .scss 文件为 .css


四、最佳实践

  1. 变量命名规范:使用语义化命名(如 $brand-primary)。

  2. 模块化拆分:按功能分文件(如 _variables.scss_mixins.scss)。

  3. 避免深层嵌套:嵌套层级不超过 3 层,防止选择器冗余。

  4. 慎用 @extend:过度继承可能导致 CSS 文件体积膨胀。

  5. 注释与文档:使用 // 或 /* */ 标注关键逻辑。


五、Sass 与 Less 对比

特性SassLess
语法支持 SCSS 和缩进语法类似 CSS,使用 @ 符号
功能复杂度更强大(条件、循环、自定义函数)较简单
社区生态更广泛(Bootstrap 5+ 使用 Sass)逐渐被 Sass 替代
编译速度较快(Dart Sass)较慢

   

Sass 与 Less 核心对比

一、核心对比速览

特性Sass/SCSSLess
语法支持 .scss(类CSS)和 .sass(缩进语法)类似 CSS,使用 @ 符号定义变量等
变量符$@
混入(Mixins)支持参数传递、内容块(@content支持参数传递,功能相对简单
条件/循环支持 @if@for@each@while支持条件守卫(Guards)、循环功能较弱
函数扩展支持自定义函数,内置函数库丰富内置函数较少,不支持自定义函数
继承通过 @extend 实现通过混入模拟继承,无原生继承语法
模块化通过 @use@forward 管理依赖(推荐)通过 @import 导入(可能重复代码)
编译方式Dart Sass(快)、LibSass(弃用)基于 JavaScript(速度较慢)
社区生态更广泛(Bootstrap 5+、主流框架优先支持)逐渐被 Sass 替代,维护更新较少
浏览器编译不支持支持(通过 <script> 引入 less.js

二、语法细节对比

1. 变量定义

  • Sass

    $primary-color: #3498db;
    $font-size: 16px;
  • Less

    @primary-color: #3498db;
    @font-size: 16px;

2. 嵌套语法

  • Sass(支持属性嵌套):

    .box {border: {width: 1px;style: solid;color: #ddd;}
    }
  • Less(仅支持选择器嵌套):

    .box {border-width: 1px;border-style: solid;border-color: #ddd;
    }

3. 混合宏(Mixins)

  • Sass(支持内容块 @content):

    @mixin media($width) {@media (min-width: $width) {@content;}
    }
    .container {@include media(768px) {padding: 20px;}
    }
  • Less(无内容块支持):

    .mixin(@color) {color: @color;
    }
    .text {.mixin(#333);
    }

4. 条件控制

  • Sass(完整逻辑控制):

    @if lightness($color) > 50% {background: black;
    } @else {background: white;
    }
  • Less(通过守卫条件):

    .mixin(@color) when (lightness(@color) > 50%) {background: black;
    }

三、功能深度对比

1. 函数与运算

  • Sass
    支持复杂数学运算和自定义函数:

    @function em($px, $base: 16px) {@return ($px / $base) * 1em;
    }
    .title { font-size: em(24px); } // 1.5em
  • Less
    仅支持内置函数(如 lighten()darken()),无法自定义函数。

2. 继承机制

  • Sass(高效继承):

    %button-base { padding: 10px; }
    .primary-btn { @extend %button-base; }

    编译后合并相同样式,减少 CSS 体积。

  • Less(通过混入模拟):

    .button-base() { padding: 10px; }
    .primary-btn { .button-base(); }

    编译后重复代码,体积较大。

3. 模块化支持

  • Sass(现代模块系统):

    // _variables.scss
    $primary-color: #3498db;// main.scss
    @use 'variables' as vars;
    .header { color: vars.$primary-color; }
  • Less(传统导入):

    // variables.less
    @primary-color: #3498db;// main.less
    @import "variables";
    .header { color: @primary-color; }

四、编译与性能

维度SassLess
编译器Dart Sass(官方推荐,速度快)less.js(基于 JavaScript)
编译速度快(Dart 引擎优化)较慢(大型项目明显)
实时编译需工具(如 sass --watch、构建工具)浏览器端可实时编译
生产环境必须预编译可预编译或浏览器端运行

五、社区与生态

生态项SassLess
主流框架Bootstrap 5+、Vuetify、Material-UI 等优先支持Bootstrap 3~4 主要支持
插件工具Webpack、Gulp、Vite 深度集成支持但更新较少
学习资源文档完善,社区活跃资源较少,更新滞后
NPM 下载量每周约 2500 万次(2023)每周约 700 万次(2023)

六、迁移策略

  • 从 Less 迁移到 Sass

    1. 重命名文件为 .scss

    2. 替换语法(如 @ → $)。

    3. 逐步替换 Less 特有功能(如 Guards → @if)。

    4. 使用工具转换(如 less2sass)。


七、选型建议

选择 Sass 的场景

  • 项目复杂,需要高级功能(条件、循环、自定义函数)。

  • 团队协作,需模块化管理和样式复用。

  • 长期维护,依赖活跃社区和工具链支持。

  • 使用现代框架(如 React、Vue)和组件库(如 Bootstrap 5+)。

选择 Less 的场景

  • 小型项目或快速原型开发,无需复杂逻辑。

  • 遗留项目维护(如旧版 Bootstrap)。

  • 需要浏览器端实时编译(如简单静态页面)。

  • Sass:功能全面、性能优越、生态完善,现代开发首选

  • Less:简单易学、浏览器兼容性佳,适合轻量级场景

根据项目需求和团队熟悉度选择,优先推荐 Sass 应对未来挑战。


   

Sass 内置函数


一、颜色函数

1. 颜色调整

函数作用示例
lighten($color, $amount)增加颜色亮度(0%~100%)lighten(#336699, 20%) → #6699cc
darken($color, $amount)降低颜色亮度(0%~100%)darken(#336699, 10%) → #1a4d80
saturate($color, $amount)增加饱和度(0%~100%)saturate(#336699, 20%) → #2b5c8c
desaturate($color, $amount)降低饱和度desaturate(#ff0000, 50%) → #808080
opacify($color, $amount)增加不透明度(0~1)opacify(rgba(255,0,0,0.5), 0.2) → rgba(255,0,0,0.7)
transparentize($color, $amount)降低不透明度transparentize(#ff0000, 0.3) → rgba(255,0,0,0.7)

2. 颜色混合

函数作用示例
mix($color1, $color2, $weight)混合两种颜色(权重 0%~100%)mix(red, blue, 50%) → #800080(紫色)
grayscale($color)转为灰度颜色grayscale(#ff0000) → #808080

3. 颜色通道提取

函数作用示例
red($color)提取红色通道值(0~255)red(#ff3366) → 255
green($color)提取绿色通道值green(#ff3366) → 51
blue($color)提取蓝色通道值blue(#ff3366) → 102
alpha($color)提取透明度(0~1)alpha(rgba(255,0,0,0.5)) → 0.5

二、数值函数

函数作用示例
percentage($number)转为百分比(0.5 → 50%percentage(0.3) → 30%
round($number)四舍五入取整round(3.7) → 4
ceil($number)向上取整ceil(3.2) → 4
floor($number)向下取整floor(3.7) → 3
abs($number)取绝对值abs(-10) → 10
min($numbers...)取最小值min(5, 3, 8) → 3
max($numbers...)取最大值max(5, 3, 8) → 8
random($limit?)生成随机数(0~1 或 0~$limit)random(100) → 42

三、字符串函数

函数作用示例
quote($string)添加引号quote(text) → "text"
unquote($string)移除引号unquote("text") → text
to-upper-case($string)转为大写to-upper-case(abc) → ABC
to-lower-case($string)转为小写to-lower-case(ABC) → abc
str-length($string)获取字符串长度str-length("hello") → 5
str-index($string, $substring)查找子串位置str-index("hello", "e") → 2

四、列表函数

函数作用示例
length($list)获取列表长度length(1px 2px 3px) → 3
nth($list, $n)获取第 $n 个元素nth(a b c, 2) → b
join($list1, $list2, $separator)合并列表join(a b, c d) → a b c d
append($list, $value, $separator)追加元素到列表append(a b, c) → a b c
index($list, $value)查找元素位置index(a b c, b) → 2

五、映射函数(Map)

函数作用示例
map-get($map, $key)根据键获取值map-get((a:1, b:2), a) → 1
map-merge($map1, $map2)合并两个映射map-merge((a:1), (b:2)) → (a:1, b:2)
map-keys($map)获取所有键的列表map-keys((a:1, b:2)) → a, b
map-values($map)获取所有值的列表map-values((a:1, b:2)) → 1, 2

六、其他实用函数

函数作用示例
if($condition, $if-true, $if-false)条件判断if(true, 10px, 20px) → 10px
unique-id()生成唯一 ID(如 u0daxxunique-id() → u0daxx
inspect($value)返回值的字符串表示形式inspect(10px) → 10px

七、实战示例

1. 动态生成颜色渐变

$base-color: #3498db;
$steps: 5;@for $i from 1 through $steps {.color-step-#{$i} {background: lighten($base-color, $i * 10%);}
}

2. 响应式断点管理

$breakpoints: (small: 480px,medium: 768px,large: 1024px
);@mixin respond-to($key) {$width: map-get($breakpoints, $key);@media (min-width: $width) {@content;}
}.container {@include respond-to(medium) {padding: 20px;}
}

八、总结

  • 颜色处理lightendarkenmix 快速生成配色方案。

  • 数值计算percentageround 简化布局计算。

  • 字符串操作to-upper-casestr-index 增强动态内容处理能力。

  • 列表与映射map-getnth 管理复杂数据结构。

  • 条件与循环:结合 @if@for 实现动态样式生成。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息收集新利器:SSearch Chrome 插件来了

SSearch 下载地址 SSearch &#x1f623;用途 每次谷歌语法搜索时还得自己写&#xff0c;我想省事一点&#xff0c;弄了一个插件&#xff0c;先加了几个常用的语法&#xff0c;点击后会跳转到对应搜索页面&#xff0c;也可以直接在搜索框微调 后续也会加些其他语法 &#…

Docker搭建SFTP

在这个教程中&#xff0c;我们将通过一个简单的例子来展示如何使用 Docker 和 atmoz/sftp 镜像设置一个基本的 SFTP 服务。这个服务将允许用户通过 SFTP 安全地访问和管理文件。我们将配置一个名为 ops 的用户&#xff0c;其密码为 123456&#xff0c;并限定用户只能访问特定的…

正态分布习题集 · 答案与解析篇

正态分布习题集 答案与解析篇 与题目篇编号一致,如有其他解题思路,欢迎在评论区交流。 1. 基础定义与性质 1.1 密度函数 X ∼ N ( μ , σ 2 ) X \sim N(\mu,\sigma^2) X∼N(μ,σ2) 的 PDF: [ f(x) = \frac{1}{\sigma\sqrt{2\pi}} \exp\left(-\frac{(x-\mu)2}{2\sigma2}\…

Java学习手册:SQL 优化技巧

一、SQL 查询优化 选择合适的索引列 &#xff1a;索引可以显著提高查询速度&#xff0c;但需要选择合适的列来创建索引。通常&#xff0c;对于频繁作为查询条件的列、连接操作的列以及排序或分组操作的列&#xff0c;应该考虑创建索引。例如&#xff0c;在一个订单表中&#xf…

(02)Redis 的订阅发布Pub/Sub

我们为了自己实现一个MQ功能&#xff0c;就要深入底层挖掘现有开源产品的实现过程。 Redis 发布订阅底层结构解析 Redis 不存储消息&#xff0c;仅作为“实时中转”&#xff1b;只有订阅者在线时才能收到消息&#xff1b;消息是广播给所有订阅此频道的客户端。 1. 核心数据结…

使用Docker一键安装SigLens:简单快捷的日志分析解决方案

在当今复杂的IT环境中,高效的日志管理和分析变得越来越重要。SigLens作为一款强大的开源日志分析工具,为开发者和运维人员提供了直观、高效的日志处理体验。本文将介绍如何使用Docker快速安装SigLens,让您在几分钟内就能开始进行日志分析。 为什么选择Docker安装SigLens? Do…

C#与西门子PLC通信:S7NetPlus和HslCommunication使用指南

西门子S7协议是用来和PLC进行通讯的一个协议&#xff0c;默认端口是102&#xff0c;数据会保存在一个个DB块中&#xff0c;比较经典的用法是一个DB块专门用来读取&#xff0c;一个用来写入。 DB&#xff08;数据块&#xff09; {块号}.DBX/DBD/DBW{字节地址}.{位偏移} 1、数据…

【中间件】brpc_基础_remote_task_queue

文章目录 remote task queue1 简介2 核心功能2.1 任务提交与分发2.2 无锁或低锁设计2.3 与 bthread 深度集成2.4 流量控制与背压 3 关键实现机制3.1 数据结构3.2 任务提交接口3.3 任务窃取&#xff08;Work Stealing&#xff09;3.4 同步与唤醒 4 性能优化5 典型应用场景6 代码…

C语言实现数据结构:堆排序和二叉树_链式

一.堆的应用 1.堆排序 void test01() {int arr[] { 17,20,10,13,19,15 };int n sizeof(arr) / sizeof(arr[0]);HP p;HPInit(&p);for (int i 0; i < n; i){HPPush(&p, arr[i]);}int i 0;while (!HPEmpty(&p)){arr[i] HPTop(&p);HPPop(&p);}for (i…

C和指针——预处理

预处理是编译前的过程&#xff0c;主要对define&#xff0c;include以及一些编译器定义的内容进行替换 #define的本质就是替换 1、例子 #define FOREVER for(;;) 2、例子 #define TEMPD "1231231231\ 123123123" \\如果太长了&#xff0c;可以用\换行 3、例子——可…

C++ set和map

目录 一、关联式容器 1.1 键值对 1.1.1 概念 1.1.2 pair 1.2 树形结构的关联式容器 二、set 2.1 set 的介绍 2.2 set 的使用 2.2.1 set 的构造 2.2.2 set 的迭代器 2.2.3 set 的容量操作 2.2.4 set 的修改操作 2.2.5 set 的查找操作 三、multiset 3.1 multiset …

「Mac畅玩AIGC与多模态07」开发篇03 - 开发第一个 Agent 插件调用应用

一、概述 本篇介绍如何在 macOS 环境下,基于 Dify 平台自带的网页爬虫插件工具,开发一个可以提取网页内容并作答的 Agent 应用。通过使用内置插件,无需自定义开发,即可实现基本的网页信息提取与智能体回答整合。 二、环境准备 1. 确认本地部署环境 确保以下环境已搭建并…

cline或业务系统集成n8n的工作流(MCP Server Trigger、Call n8n Workflow Tool node)

1.成果展示 1.1n8n的主工作流 1.2n8n的子工作流 1.3cline集成效果 2.实操过程 2.1Call n8n Workflow Tool node节点 Call n8n Workflow Tool节点是一个工具&#xff0c;它允许代理运行另一个n8n工作流并获取其输出数据。 在此页面上&#xff0c;您将找到“调用n8n工作流工具…

深入了解Linux系统—— 环境变量

命令行参数 我们知道&#xff0c;我们使用的指令它本质上也是一个程序&#xff0c;我们要执行这个指令&#xff0c;输入指令名然后回车即可执行&#xff1b;但是对于指令带选项&#xff0c;又是如何实现的呢&#xff1f; 问题&#xff1a;main函数有没有参数&#xff1f; 在我…

pip安装包时网络不畅,替换国内PyPI镜像源

1、PyPI 镜像源 1.1、定义 PyPI 镜像源是对 Python Package Index&#xff08;PyPI&#xff09;官方仓库的复制。 PyPI 是 Python 社区中最大的软件包仓库&#xff0c;存储着大量的 Python 包&#xff0c;供开发者们下载和使用。 然而&#xff0c;由于 PyPI 服务器位于国外&a…

贪心算法解决会议安排问题

文章目录 前言 一、什么是贪心算法&#xff1f; 贪心算法的基本概念&#xff1a;贪心算法并不从整体最优上加以考虑&#xff0c;所做的选择只是在某种意义上的局部最优选择。 二、会议安排题目 1.题目理解 2.思路剖析 总结 前言 本文将主要介绍贪心算法需要注意的地方以…

从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 4 |IMU 死算与校正:惯性导航在资源受限环境的落地

Part 4 |IMU 死算与校正:惯性导航在资源受限环境的落地 本章聚焦 ESP32-S3 平台上如何利用 LSM6DS3 IMU 实现 死算(Dead Reckoning),并结合 零速更新(ZUPT) 或 磁力计辅助 进行 漂移校正,最终通过 EKF/UKF 融合提升定位精度。 一、传感器简介与校准 LSM6DS3 主要参数 加速…

力扣1128题解

记录 2525.5.4 题目&#xff1a; 思路&#xff1a; 先将dominoes[i]的二元全部变为前大后小的形式&#xff0c;再遍历该数组&#xff0c;用数组来记录。 代码&#xff1a; class Solution {public int numEquivDominoPairs(int[][] dominoes) {int [] [] cnt new int [10…

with的用法

Python SQLite 操作详解 本文档详细解释了使用 Python 操作 SQLite 数据库时涉及的关键概念和代码实践&#xff0c;包括 with 语句、事务处理、批量插入以及相关的优化建议。 一、with 语句的作用&#xff08;自动关门的保险库&#xff09; with sqlite3.connect(city_1301.d…

力扣解题汇总(困难)

文章目录 技巧42_接雨水 技巧 42_接雨水 class Solution {public int trap(int[] height) {int LMax 0, RMax 0;int len height.length;int[] L2R new int[len];int[] R2L new int[len];//计数每一个格的左右边最高柱for (int i 0; i < len; i) {LMax Math.max(LMa…