CSS、Less、Sass(含 SCSS)、Stylus

CSS、Less、Sass(含 SCSS)、Stylus

一、CSS(原生层叠样式表)

往期链接:

CSS语法学习文档 - 汇总篇-CSDN博客

CSS前端布局总指南_mdn css 布局手册-CSDN博客

最新动态

现代浏览器已原生支持嵌套、容器查询、:has()、级联层 @layer、作用域 @scope、锚点定位、视图过渡、滚动驱动动画等。CSS 正从"描述性语言"向"具备一定逻辑和响应能力"演进。

核心特征

变量 :通过 --* 自定义属性,可继承、可参与级联,支持运行时更改。

嵌套 :原生 CSS 嵌套(& 代表父选择器),减少重复,但要求嵌套规则必须以符号开头(如 &)。

容器查询@container 根据父容器尺寸而非视口尺寸应用样式。

级联层@layer 精确控制样式优先级,便于管理大型项目的样式覆盖。

条件选择器:has() 实现"父选择器"效果,根据后代决定父元素样式。

新视口单位dvh, svh, lvh 解决移动端视口动态变化问题。

颜色扩展 :OKLCH 等广色域颜色、color-mix() 混合函数。

动画增强 :滚动驱动动画、离散属性过渡(如 display)。

主要缺陷

依然是声明式语言,不支持循环、条件判断、自定义函数等编程特性(无法写逻辑)。

动态计算能力有限(calc() 仍较原始,无法定义复杂公式)。

缺少"混合/继承"抽象机制,重复代码需依靠类组合,冗余度高于预处理器。

浏览器兼容性仍有差异,部分新特性需渐进增强。

二、Less

最新版本

Less 4.2(稳定,基于 JavaScript)

核心特征

变量@ 符号,如 @primary: #333;支持插值和懒加载,可在选择器、URL 中使用。

嵌套与父选择器 :标准嵌套;支持多个 & 实现复杂父选择器拼接(4.0+)。

混合( Mixin :可直接复用类名样式;支持带参数、默认值的参数化混合;可通过 when 守卫实现条件混合。

运算与函数 :数值、颜色、字符串运算;内置数学函数(sin, cos, pow, sqrt 等 4.2 增强)、颜色操作函数(如 darken, lighten,部分已支持 OKLCH 空间)。

命名空间与映射 :可组织变量和混合,支持 #namespace > .mixin() 访问;映射可作为只读对象遍历。

循环 :通过递归混合模拟循环,或使用 each() 遍历列表和映射。

导入@import 可内联多个文件,支持参考导入(reference)、懒加载。

插件系统:可通过 JavaScript 扩展自定义函数(需运行环境支持)。

主要缺陷

内置无原生 if/for/while****控制流,复杂逻辑只能靠守卫和递归模拟,可读性较差。

早期基于 JavaScript 编译(Less.js 浏览器端),大型项目编译效率不如 Dart Sass。

部分高级功能(如 @extend 继承)易产生冗余选择器,相比 Sass 功能较弱。

社区和生态规模小于 Sass,插件和框架默认集成度较低。

自定义函数无法在纯 Less 中定义,必须借助 JS,限制了可移植性。

三、Sass(含 SCSS 与缩进语法 .sass)

往期链接:

SCSS语法学习文档 - 汇总篇-CSDN博客

Sass 是预处理器名称,提供两种语法:

SCSS@mixin@if 等,大括号分号,完全兼容 CSS)

缩进语法(.sass,无大括号分号,靠缩进)。

当前主流实现为 Dart Sass (最新 1.83.x),@import 已弃用,全面转向 @use 模块系统。

核心特征

变量$ 定义,如 $color: red;可通过 !default 覆盖,作用域清晰。

嵌套与父选择器 :与 Less 类似,& 代表父级,支持嵌套属性(如 font: { weight: bold; })。

混合与继承@mixin / @include 传参复用;@extend 实现选择器群组继承,配合 %placeholder 减少输出冗余。

编程控制 :完整的 @if@for@each@while 指令,可遍历 map、list。

函数与模块化@function 自定义返回值;@use@forward 构建命名空间模块,内置模块 sass:mathsass:mapsass:color 等取代全局函数。

插值与静默注释#{} 插入动态值,// 静默注释不输出到 CSS。

原生 CSS 嵌套兼容:最新版允许直接书写原生嵌套,并能与 Sass 嵌套无缝混用。

调试@debug@warn@error 提供强大调试能力。

主要缺陷

必须经过编译(Dart/Node),增加构建步骤。

SCSS 语法灵活,滥用 @extend 可能生成臃肿选择器、降低渲染性能。

学习曲线较原生 CSS / Less 更陡,特别是模块系统(@use 规则、作用域等)新用户上手慢。

编译器选择:Dart Sass 为唯一主流,LibSass(Node-sass)已停更,老项目迁移需成本。

缩进语法(.sass)与 JS/HTML 习惯差异大,团队协作易因空格缩进出错。

四、Stylus

最新版本

0.63.0(2024年初发布,后续更新缓慢)

核心特征

极简语法:花括号、分号、冒号均可省略,靠缩进和换行界定规则(与 Python 类似)。

透明混合:定义和调用混合无需特殊符号,直接写属性/选择器,调用时就像写普通属性。

变量$ 或裸标识符均可,如 color = red,访问作用域灵活,甚至可沿调用栈向上"属性查找"。

强大的编程特性 :支持 if / elsefor in 循环、内置函数(数学、颜色、图像尺寸等),可直接嵌入 JavaScript 表达式。

动态作用域与父引用:可引用父级的属性值,构建动态样式。

内置函数丰富:覆盖路径、图像处理、单位转换等,无需额外配置。

条件导入与压缩输出:支持特定媒体/条件下导入,编译时可生成多种压缩级别。

主要缺陷

语法过于自由,不同开发者写出的代码风格差异极大,强制规范性差,长期维护成本高。

社区小、更新极慢:0.63.0 之后几乎停滞,新 CSS 特性跟进不及时,存在被淘汰风险。

调试困难,编译错误信息有时晦涩,与主流工具(如 DevTools)的 Source Map 映射偶现问题。

缺少类似 Sass 的丰富内置模块和严格作用域控制,大型项目易发生样式泄露和冲突。

编辑器和 IDE 的智能提示、代码格式化支持普遍弱于 SCSS/Less。

五、核心区别对比表

|---------------------|--------------------|-------------------------|----------------------------|----------------------------|
| 维度 | CSS (最新原生) | Less | Sass (SCSS) | Stylus |
| 变量符号 | --var | @var | $var | $var 或裸名 |
| 嵌套 | 原生嵌套(需符号开头) | 标准嵌套,多 & 拼接 | 标准嵌套,属性嵌套,兼容原生 | 缩进嵌套,极简 |
| 混合 (Mixin) | 无(靠类组合) | .mixin() 调用,参数+守卫 | @mixin / @include,功能最强 | 透明混合,调用无需关键词 |
| 继承 | 无(:where 可辅助) | :extend() 伪类继承 | @extend + 占位符 % | 内建 @extend,使用较少 |
| 条件 / 循环 | 无(依赖媒体/容器查询) | 递归 + when 守卫 + each | @if @for @each @while 全套 | if/elsefor in,直接嵌入 JS |
| 函数定义 | 无(calc() 有限) | 需通过 JS 插件 | @function @return,内置丰富模块 | 可定义函数,支持 JS 表达式 |
| 模块系统 | @layer 提供部分分层 | 命名空间 + 导入 | @use/@forward 强作用域模块 | 导入 + 无强制作用域 |
| 编译依赖 | 浏览器原生支持 | Node.js / 浏览器端 | Dart Sass / Node | Node.js |
| 学习曲线 | 低(但需跟进新特性) | 中 | 中高 | 高(语法过灵活) |
| 生态与维护 | 标准,全浏览器跟进 | 成熟,中小项目常用 | 极成熟,社区最大,主流框架内置 | 社区萎缩,维护风险高 |
| 输出控制 | 直接生效 | 可配置压缩、sourcemap | 压缩、sourcemap、调试信息完善 | 压缩、sourcemap 基本支持 |

六、总结与选型建议

CSS 原生能力已大幅提升:中小型项目或对构建工具零依赖的诉求下,完全可以不引入预处理器,搭配 PostCSS 可弥补部分不足。

Less 学习成本低,适合从 CSS 渐进迁移、对逻辑需求不复杂的团队;但在复杂逻辑和大型工程中,能力上限不如 Sass。

Sass SCSS 仍是最强、最活跃的 CSS 预处理器,拥有最完善的编程特性、模块系统和社区生态,是多数中大型项目的首选。

Stylus 因其极度灵活的语法和停滞的维护状态,已不再推荐用于新项目,除非团队有强偏好并愿承担维护风险。

相关推荐
不听话坏10 小时前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
likeyi0710 小时前
require 和 import的区别
开发语言·前端
pany11 小时前
做 AI 友好的开源 Vue3 模板 🌈
前端·vue.js·ai编程
小二·11 小时前
React 19 + Next.js 15 现代前端开发实战:App Router / Server Components / 流式渲染
前端·javascript·react.js
谙忆102412 小时前
前端图片直传对象存储:OSS/S3 预签名 URL、STS 临时凭证与回调校验
前端
CHNE_TAO_EMSM13 小时前
Android studio 打开文件时自动下载源码
前端·javascript·android studio
一孤程14 小时前
Airtest自动化测试第五篇:小程序与Web测试——跨平台自动化全覆盖
前端·自动化测试·小程序·自动化·测试·airtest
IT_陈寒14 小时前
SpringBoot自动配置不是你以为的那样的智能
前端·人工智能·后端
yume_sibai15 小时前
大屏数据可视化 - 边框红绿呼吸灯实现详解
前端·信息可视化·typescript