Less vs Scss 全解析
在前端开发中,CSS 作为样式描述语言,虽简单直观但缺乏变量、嵌套、逻辑运算等“编程特性”,面对复杂项目时易出现代码冗余、维护困难等问题。Less 和 Scss(Sass 的新语法)作为两大主流 CSS 预处理器,通过补充编程能力,大幅提升了样式开发效率与可维护性。
本文将从语法基础、核心特性、实战差异、选型建议四个维度,帮你彻底搞懂 Less 与 Scss 的使用场景与技巧,结合实际开发案例给出落地建议,无论是新手入门还是老手进阶都能有所收获。
一、基础认知:Less 与 Scss 核心区别
两者本质都是“CSS 增强工具”,最终都会编译为原生 CSS 供浏览器识别,但在设计理念、语法风格、生态支持上存在差异:
Less:2009 年诞生,定位“简洁易用”,语法更贴近原生 CSS,无严格缩进要求,上手成本低,适合中小型项目或对编译速度有要求的场景,常与 Vue 生态搭配。
Scss:Sass 3.0 后推出的新语法(兼容旧版 .sass 缩进语法),定位“功能强大”,语法更接近编程语言(如 Ruby),支持更丰富的逻辑控制、模块系统,生态更完善,常与 React、Angular 生态搭配,也是目前企业级项目的主流选择。
核心结论:Less 胜在简洁灵活,Scss 胜在功能全面与生态成熟。
二、语法基础:快速上手两大预处理器
以下从前端开发高频需求出发,对比两者核心语法的使用方式,均附可直接复用的代码示例。
变量(Variables)
用于存储颜色、尺寸、字体等通用值,减少重复书写,便于全局修改。
// 定义变量
@primary-color: #1890ff;
@font-size-base: 14px;
@border-radius: 4px;
// 使用变量
.button {
color: @primary-color;
font-size: @font-size-base;
border-radius: @border-radius;
}2
3
4
5
6
7
8
9
10
11
// 定义变量
$primary-color: #1890ff;
$font-size-base: 14px;
$border-radius: 4px;
// 特殊用法:默认变量(可被覆盖)
$secondary-color: #f5f5f5 !default;
// 使用变量
.button {
color: $primary-color;
font-size: $font-size-base;
border-radius: $border-radius;
}2
3
4
5
6
7
8
9
10
11
12
13
14
差异点:Less 用 @ 定义变量,Scss 用 $;Scss 支持 !default 声明默认变量,适合组件库开发(外部可覆盖内部默认值),Less 需通过作用域控制变量覆盖。
嵌套(Nesting)
模拟 HTML 层级结构,简化后代选择器书写,让样式结构更清晰,避免选择器冗余。
.card {
width: 300px;
padding: 20px;
border: 1px solid #eee;
// 后代嵌套
.card-header {
font-size: 16px;
font-weight: 600;
}
// 伪类嵌套(& 表示父选择器)
&:hover {
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
// 子代选择器
> .card-body {
margin-top: 10px;
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.card {
width: 300px;
padding: 20px;
border: 1px solid #eee;
// 语法与 Less 一致,支持 & 符号
.card-header {
font-size: 16px;
font-weight: 600;
}
&:hover {
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
> .card-body {
margin-top: 10px;
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
差异点:嵌套语法基本一致,Scss 支持更复杂的嵌套逻辑(如嵌套条件判断),Less 嵌套更侧重简洁性。
混合(Mixins)
用于封装可复用的样式片段(如清除浮动、圆角、阴影),支持参数传递,实现样式模块化。
// 无参数混合
.clearfix() {
&::after {
content: '';
display: table;
clear: both;
}
}
// 带参数混合(可设默认值)
.box-shadow(@x: 0, @y: 2px, @blur: 8px, @color: rgba(0,0,0,0.1)) {
box-shadow: @x @y @blur @color;
}
// 使用混合
.container {
.clearfix();
.box-shadow(0, 4px, 12px, rgba(0,0,0,0.2));
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 无参数混合
@mixin clearfix {
&::after {
content: '';
display: table;
clear: both;
}
}
// 带参数混合(默认值语法不同)
@mixin box-shadow($x: 0, $y: 2px, $blur: 8px, $color: rgba(0,0,0,0.1)) {
box-shadow: $x $y $blur $color;
}
// 使用混合(@include 关键字)
.container {
@include clearfix;
@include box-shadow(0, 4px, 12px, rgba(0,0,0,0.2));
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
差异点:Less 混合无需关键字,直接调用;Scss 需用 @mixin 定义、@include 调用,参数传递语法更严谨,支持可变参数(如 $args...)。
继承(Extend)
用于复用选择器的样式,与混合的区别在于:继承是“合并选择器”,减少 CSS 体积;混合是“复制样式片段”,可能导致冗余。
// 定义基础样式
.base-btn {
padding: 8px 16px;
border: none;
border-radius: 4px;
}
// 继承基础样式
.primary-btn {
&:extend(.base-btn);
background-color: @primary-color;
color: #fff;
}2
3
4
5
6
7
8
9
10
11
12
13
// 定义基础样式(可使用占位符选择器 %,仅用于继承,不单独编译)
%base-btn {
padding: 8px 16px;
border: none;
border-radius: 4px;
}
// 继承基础样式
.primary-btn {
@extend %base-btn;
background-color: $primary-color;
color: #fff;
}2
3
4
5
6
7
8
9
10
11
12
13
差异点:Less 继承用 &:extend(选择器),Scss 用 @extend;Scss 的占位符选择器 % 是核心优势,可避免基础样式被单独编译为 CSS,减少冗余。
三、核心特性深度对比
除基础语法外,两者在高级特性上的差异的直接影响项目开发效率与可维护性,以下是高频高级特性对比:
逻辑运算与函数
Less:支持基础算术运算(+、-、*、/),内置函数较少(主要集中在颜色处理,如 darken()、lighten()),不支持复杂逻辑判断。
Scss:支持算术运算、字符串运算、逻辑判断(@if/@else)、循环(@for/@each/@while),内置函数丰富(颜色、尺寸、字符串、列表处理等),甚至支持自定义函数。
// Scss 循环案例:生成多尺寸按钮
@for $i from 1 to 4 {
.btn-size-#{$i} {
padding: #{4*$i}px #{8*$i}px;
font-size: #{12 + $i}px;
}
}
// 编译后生成 .btn-size-1 至 .btn-size-3 样式2
3
4
5
6
7
8
9
模块化与导入
两者均支持 @import 导入外部文件,但 Scss 的模块化能力更完善:
Less:@import "xxx.less" 直接导入,无内置模块系统,需依赖 Webpack 等构建工具实现模块化隔离。
Scss:支持 @use(替代旧版 @import)实现模块化,可指定命名空间、控制导出范围,避免全局变量污染,是企业级项目的核心优势。
// Scss 模块化导入
@use 'src/styles/vars' as vars; // 命名空间导入
@use 'src/styles/mixins'; // 直接导入
.button {
color: vars.$primary-color; // 通过命名空间使用变量
@include mixins.box-shadow();
}2
3
4
5
6
7
8
生态与工具支持
Less:生态较小,工具支持有限,主要依赖 less-loader 编译,适合简单场景。
Scss:生态成熟,支持工具丰富(如 dart-sass 编译、Stylelint 校验、Scss 插件),主流 UI 组件库(Element Plus、Ant Design)均采用 Scss 开发,社区资源充足。
四、实战场景:如何选择与落地?
选型建议
选 Less 的场景:中小型项目、个人项目、Vue 快速开发场景,追求上手快、语法简洁,无需复杂逻辑控制。
选 Scss 的场景:企业级项目、大型团队协作、需要复杂样式逻辑(如主题切换、组件库开发),追求可维护性与生态支持。
编译配置(Webpack 示例)
// 安装依赖:less less-loader
module.exports = {
module: {
rules: [
{
test: /.less$/i,
use: [
'style-loader',
'css-loader',
{
loader: 'less-loader',
options: {
lessOptions: {
// 允许在 less 中使用 JavaScript
javascriptEnabled: true,
},
},
},
],
},
],
},
};2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 安装依赖:sass sass-loader
module.exports = {
module: {
rules: [
{
test: /.s[ac]ss$/i,
use: [
'style-loader',
'css-loader',
{
loader: 'sass-loader',
options: {
// 使用 dart-sass(推荐,替代 node-sass)
implementation: require('sass'),
},
},
],
},
],
},
};2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
开发最佳实践
变量管理:集中存放全局变量(颜色、尺寸、字体),便于主题切换与维护。
混合封装:将通用样式(清除浮动、响应式适配)封装为混合,避免重复编码。
避免过度嵌套:嵌套层级不超过 3 层,防止编译后 CSS 选择器权重过高,难以覆盖。
优先使用继承:对于相同结构的样式(如按钮组),用继承替代混合,减少 CSS 体积。
模块化隔离:Scss 用
@use实现模块化,Less 可通过文件名前缀(如_vars.less)区分局部文件。
五、总结
Less 与 Scss 都是优秀的 CSS 预处理器,核心价值在于“用编程思维写样式”,提升开发效率与可维护性。选择哪款工具,本质是平衡项目复杂度、团队习惯与生态需求:
追求简洁、快速落地,选 Less;
追求功能全面、可维护性与生态支持,选 Scss。
无论选择哪款,掌握变量、嵌套、混合、继承等核心特性,结合构建工具实现模块化开发,才能真正发挥预处理器的价值。建议根据实际项目场景动手实践,熟练后可轻松应对各类样式开发需求。
最后,你在使用 Less/Scss 时遇到过哪些坑?欢迎在评论区分享你的实战经验!
