写 CSS 时总被 "重复劳动" 困扰?改个主题色要全局搜半天,嵌套层级一深就乱成一团,通用样式只能复制粘贴...... 其实掌握 SCSS,这些问题都能轻松解决。
作为前端最常用的样式工具之一,SCSS 既有原生 CSS 的熟悉感,又多了变量、混合、继承等实用特性。今天就从基础用法 到进阶技巧,带你手把手玩转 SCSS,从此写样式又快又省心~
一、先搞懂:SCSS 和 CSS 有什么不一样?
SCSS 是 CSS 的 "增强版",写法上和 CSS 高度相似(保留{}和;),但多了很多能提升效率的功能:
- 支持变量,统一管理常用值(比如主题色、字体大小)
- 可以嵌套选择器,跟着 HTML 结构写样式,逻辑更清晰
- 能定义 "混合" 代码块,复用通用样式(比如 flex 居中、圆角按钮)
- 支持模块化拆分,把样式拆成多个文件,维护更方便
最重要的是,SCSS 最终会编译成浏览器能识别的原生 CSS,不用担心里兼容性问题~
二、SCSS 基础:3 个核心功能,上手即能用
1. 变量:一次定义,全局复用
写样式时,主题色、字体大小这类常用值,用变量统一管理,改的时候只改一处就行,再也不用全局搜索!语法 :用$开头定义变量,直接在样式中引用。
scss
// 定义变量(建议按用途分类,方便查找)
$color-primary: #0081ff; // 主色
$color-secondary: #f5f5f5; // 辅助色
$font-size-base: 14px; // 基础字体大小
$border-radius: 4px; // 圆角大小
// 引用变量
.btn-primary {
background-color: $color-primary;
color: #fff;
font-size: $font-size-base;
border-radius: $border-radius;
padding: 8px 16px;
}
.card {
background-color: #fff;
border: 1px solid $color-secondary;
border-radius: $border-radius;
}
2. 嵌套:跟着 HTML 结构写,告别冗长选择器
原生 CSS 写嵌套结构时,选择器会越来越长(比如.header .nav .list .item),SCSS 的嵌套语法能完美解决这个问题,直接跟着 HTML 层级写就行。注意:嵌套别超过 3 层,否则编译后的 CSS 选择器过长,影响性能。
scss
// HTML结构:.header > .nav > .list > .item
.header {
width: 100%;
padding: 20px 0;
// 嵌套子选择器
.nav {
display: flex;
justify-content: space-between;
// 嵌套孙子选择器
.list {
display: flex;
gap: 20px;
// 伪类嵌套(用&指代父选择器)
.item {
color: #333;
cursor: pointer;
&:hover {
color: $color-primary; // 引用变量
}
&.active {
font-weight: bold;
border-bottom: 2px solid $color-primary;
}
}
}
}
}
编译后的原生 CSS:
css
.header {
width: 100%;
padding: 20px 0;
}
.header .nav {
display: flex;
justify-content: space-between;
}
.header .nav .list {
display: flex;
gap: 20px;
}
.header .nav .list .item {
color: #333;
cursor: pointer;
}
.header .nav .list .item:hover {
color: #0081ff;
}
.header .nav .list .item.active {
font-weight: bold;
border-bottom: 2px solid #0081ff;
}
3. 混合(Mixin):复用代码块,减少重复
遇到 flex 居中、清除浮动、兼容前缀这类重复样式,用@mixin定义一个 "代码块",需要时用@include调用,不用再复制粘贴了。还能给混合传参数,实现 "个性化复用"~
scss
// 1. 定义无参数混合(通用flex居中)
@mixin flex-center {
display: flex;
justify-content: center;
align-items: center;
}
// 2. 定义带参数混合(自定义flex方向)
@mixin flex-layout($direction: row, $justify: center) {
display: flex;
flex-direction: $direction;
justify-content: $justify;
align-items: center;
}
// 3. 调用混合
.footer {
@include flex-center; // 调用无参数混合
height: 80px;
background-color: #f5f5f5;
}
.form {
@include flex-layout(column, flex-start); // 调用带参数混合
gap: 16px;
padding: 20px;
}
三、SCSS 进阶:3 个技巧,让样式更灵活
1. 继承(Extend):共享样式,减少冗余
如果多个选择器有相同的基础样式(比如不同类型的按钮),用@extend继承基础样式,比混合更简洁,编译后的 CSS 也更精简。
scss
// 基础按钮样式
.base-btn {
padding: 8px 16px;
border-radius: $border-radius;
cursor: pointer;
border: none;
font-size: $font-size-base;
}
// 继承基础样式,再添加个性化样式
.btn-primary {
@extend .base-btn;
background-color: $color-primary;
color: #fff;
}
.btn-secondary {
@extend .base-btn;
background-color: $color-secondary;
color: #333;
}
编译后的 CSS(会合并相同样式):
css
.base-btn, .btn-primary, .btn-secondary {
padding: 8px 16px;
border-radius: 4px;
cursor: pointer;
border: none;
font-size: 14px;
}
.btn-primary {
background-color: #0081ff;
color: #fff;
}
.btn-secondary {
background-color: #f5f5f5;
color: #333;
}
2. 模块化:拆分样式文件,多人协作不冲突
大型项目中,把样式按功能拆分成多个 SCSS 文件(比如变量、混合、组件样式),用@import导入主文件,结构更清晰,多人协作时也不会互相干扰。注意 :拆分的文件建议用_开头(比如_variables.scss),表示 "局部文件",编译时不会单独生成 CSS 文件。
scss
// 1. 拆分文件(示例结构)
- styles/
- _variables.scss // 变量文件
- _mixins.scss // 混合文件
- _header.scss // 头部样式
- _footer.scss // 底部样式
- main.scss // 主文件(导入其他文件)
// 2. 主文件 main.scss 中导入其他文件
@import "./variables"; // 不用写下划线和后缀
@import "./mixins";
@import "./header";
@import "./footer";
// 3. 在项目中引入 main.scss 即可
3. 条件判断与循环:动态生成样式
SCSS 支持@if/@for等语法,能动态生成样式,比如生成栅格系统的类名(.col-1到.col-12),不用手动写 12 遍。
scss
// 1. 条件判断(根据屏幕尺寸切换样式)
@mixin responsive($size) {
@if $size == "small" {
@media (max-width: 768px) {
font-size: 12px;
padding: 4px 8px;
}
} @else if $size == "large" {
@media (min-width: 1200px) {
font-size: 16px;
padding: 12px 24px;
}
}
}
// 调用条件混合
.btn {
@include responsive("small");
@include responsive("large");
}
// 2. 循环(生成栅格类名)
@for $i from 1 through 12 {
.col-#{$i} { // #{} 是插值语法,把变量插入类名
width: (100% / 12) * $i;
float: left;
padding: 0 8px;
box-sizing: border-box;
}
}
四、实战避坑:新手容易踩的 3 个问题
- 版本选择 :优先用
dart-sass(官方推荐),别用node-sass(已废弃,兼容 Node.js 版本麻烦),安装时直接执行npm install sass即可。 - 嵌套深度 :别嵌套超过 3 层,否则编译后的 CSS 选择器过长(比如
.a .b .c .d),影响渲染性能,也难维护。 - 变量命名 :建议统一前缀,比如颜色用
$color-xxx,尺寸用$size-xxx,字体用$font-xxx,项目大了也能快速找到需要的变量。
五、最后:SCSS 怎么融入项目?
无论是 Vue、React 还是原生项目,集成 SCSS 都很简单:
- Vue 项目 :直接在
<style>标签中加lang="scss",比如<style lang="scss" scoped>。 - React 项目 :安装
sass后,把样式文件后缀改成.scss,直接导入即可。 - 原生项目 :用
dart-sass编译 SCSS 文件为 CSS,再引入到 HTML 中。
其实 SCSS 不难,核心就是用 "变量、嵌套、混合" 解决原生 CSS 的痛点。刚开始可以从基础功能用起,熟悉后再尝试进阶技巧,慢慢就能感受到它带来的效率提升~
你平时用 SCSS 时有没有遇到过什么问题?或者有什么实用技巧?欢迎在评论区交流~