CSS 预处理器与后处理器
中等 🟡CSS 布局
4 个标签
预计阅读时间:8 分钟
CSSSassLessPostCSS
CSS 预处理器与后处理器
CSS 预处理器和后处理器扩展了 CSS 的功能,提高了开发效率和代码可维护性。
Sass/SCSS
变量:
•$primary-color: #007bff;
•支持各种数据类型
•作用域:全局和局部
嵌套:
•选择器嵌套
•属性嵌套
•& 父选择器引用
混合(Mixins):
•@mixin 定义
•@include 调用
•支持参数和默认值
继承:
•@extend 继承选择器
•%placeholder 占位符
•避免代码重复
函数:
•内置函数:color、string、math
•自定义函数:@function
•返回值使用 @return
控制指令:
•@if、@else if、@else
•@for、@each、@while
•逻辑控制流程
模块化:
•@import 导入(已废弃)
•@use 使用模块
•@forward 转发模块
Less
变量:
•@primary-color: #007bff;
•延迟加载
•作用域规则
混合:
•.mixin() 定义和调用
•支持参数
•带条件的混合
嵌套:
•选择器嵌套
•& 父选择器
•媒体查询嵌套
函数:
•内置函数
•命名空间
•JavaScript 表达式
导入:
•@import 导入文件
•导入选项
PostCSS
概念:
•用 JavaScript 工具和插件转换 CSS
•解析 CSS 为 AST
•插件生态系统
常用插件:
•autoprefixer:自动添加浏览器前缀
•postcss-preset-env:现代 CSS 特性
•cssnano:CSS 压缩
•postcss-import:导入文件
•tailwindcss:实用工具类框架
配置:
•postcss.config.js
•插件顺序
•选项配置
代码示例
Sass 变量和嵌套
scssCode
// 变量定义
$primary-color: #007bff;
$secondary-color: #6c757d;
$font-size-base: 16px;
$spacing-unit: 8px;
// 嵌套选择器
.card {
background-color: white;
border-radius: 8px;
padding: $spacing-unit * 2;
&__header {
padding: $spacing-unit;
border-bottom: 1px solid #eee;
&--highlight {
background-color: $primary-color;
color: white;
}
}
&__body {
padding: $spacing-unit * 2;
p {
margin: 0 0 $spacing-unit 0;
line-height: 1.6;
}
}
&__footer {
padding: $spacing-unit;
border-top: 1px solid #eee;
text-align: right;
.button {
margin-left: $spacing-unit;
}
}
&:hover {
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
}Sass 混合(Mixins)
scssCode
// 定义混合
@mixin button($bg-color: $primary-color, $text-color: white) {
padding: 10px 20px;
background-color: $bg-color;
color: $text-color;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
&:hover {
background-color: darken($bg-color, 10%);
}
&:active {
transform: translateY(1px);
}
}
// 使用混合
.button-primary {
@include button();
}
.button-secondary {
@include button($secondary-color);
}
.button-success {
@include button(#28a745);
}
// 响应式混合
@mixin respond-to($breakpoint) {
@if $breakpoint == 'small' {
@media (max-width: 640px) {
@content;
}
} @else if $breakpoint == 'medium' {
@media (max-width: 768px) {
@content;
}
} @else if $breakpoint == 'large' {
@media (max-width: 1024px) {
@content;
}
}
}
.container {
width: 100%;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
@include respond-to('small') {
padding: 10px;
}
@include respond-to('medium') {
padding: 15px;
}
}PostCSS 配置
javascriptCode
// postcss.config.js
module.exports = {
plugins: [
// 自动添加浏览器前缀
require('autoprefixer')({
overrideBrowserslist: [
'> 1%',
'last 2 versions',
'not dead'
]
}),
// 现代CSS特性
require('postcss-preset-env')({
stage: 3,
features: {
'nesting-rules': true
}
}),
// CSS压缩
require('cssnano')({
preset: 'default'
})
]
};比较与选择
Sass vs Less:
•Sass 功能更强大
•Less 更接近 CSS 语法
•Sass 社区更活跃
•两者都广泛使用
预处理器 vs PostCSS:
•预处理器:扩展语法
•PostCSS:转换和优化
•可以结合使用
选择建议:
•新项目推荐 Sass/SCSS
•需要现代 CSS 特性用 PostCSS
•大型项目考虑 CSS-in-JS
最佳实践
•建立变量命名规范
•合理使用嵌套(不超过 3 层)
•混合 vs 继承的选择
•模块化管理样式
•编译后的代码检查
•版本控制原始文件
•文档化预处理器代码