浅谈css预处理器

177 阅读3分钟

抛出疑问:CSS预处理器是什么?
一般来说,是基于CSS扩展了一套属于自己的DSL,来解决我们写CSS时难解决的问题
例如:
1.语法不够强大,比如无法嵌套书写导致模块开发中需要写很多的重复的选择器
2.没有变量和合理的样式复用机制,使得逻辑上相关的属性值必须以字面量的形式重复输出,导致难以维护。

// 下面的内容写了两遍 .box
<div class=“box”>
    <p class=“title”>css预处理器</p>
    <p class=“content”>正文文章内容</p>
</div>
<style>
.box .title {
    font-size: 16px;
}
.box .content {
    font-size: 12px;
}
</style>

CSS 预处理器用一种专门的编程语言,进行 Web 页面样式设计,然后再编译成正常的 CSS 文件,以供项目使用。CSS 预处理器为 CSS 增加一些编程的特性,无需考虑浏览器的兼容性问题。

主流的预处理器

sass(scss)/less/Stylus

Sass是一种成熟且广泛使用的CSS预处理器。它引入了许多强大的功能,使得CSS更易于维护和模块化。Sass提供了两种语法选项:原始的缩进语法(称为Sass)和更新的SCSS语法(Sassy CSS),后者更接近使用花括号和分号的CSS语法。Sass支持变量、嵌套、混合、继承、控制指令、函数等功能。Sass提供了完善的文档、社区支持,并且可以与构建系统和框架进行无缝集成。

Less是另一种常见的CSS预处理器,与Sass类似。它旨在简化CSS,并引入了变量、嵌套、混合和导入外部文件等功能。Less采用类似CSS的语法,同时提供了一些额外的增强功能。它支持变量、混合、嵌套规则、运算、函数等特性。Less兼容浏览器和服务器端环境,可以编译成常规的CSS,并无缝集成到Web开发项目中。

Stylus是一种动态的样式表语言,采用类似Python的简洁语法。它以最小化和表达性强的语法闻名,使得编写CSS变得简洁灵活。Stylus支持变量、混合(mixins)、嵌套选择器、条件语句、循环以及函数等特性。Stylus可以编译成常规的CSS,并且可以在Node.js环境或浏览器中使用。它在样式表的组织结构上提供了很大的灵活性和自由度。

关于sass和scss的区别。其实两者都是同一种东西,两者均可以可以通过编译生成浏览器能识别的css文件。这两种的区别:
1.扩展名不同; 
2.SCSS 的语法书写和CSS 语法书写方式非常类似,.sass文件对代码的排版有着非常严格的要求,而且没有大括号,没有分号;
我更倾向于使用scss,因为与css的写法很类似,并且有大括号和分号的标志,代码更加清晰

sass声明变量时候符号使用$,less则使用@,stylus对变量名没有任何限定,变量名与变量值之间可以用冒号、空格和等号隔开。 例如:

@orange:#feb914;
header {
     background-color:@orange;
}
$orange:#feb914;
header
    background-color:$orange;
bgorange = #feb914;
header
     background-color bgorange

具体的案例说明

1. 变量

CSS预处理器中的一个重要功能是引入变量。通过使用变量,我们可以定义和使用颜色、字体、边框宽度等样式的值。这样一来,如果需要修改某个样式,我们只需要在变量的定义处修改,而不需要逐个查找和替换所有的使用地方。下面是使用变量的例子:

$primary-color: #007bff; 
.button { 
    background-color: $primary-color; 
    color: white; 
    padding: 10px; 
}

在上面的例子中,我们使用$primary-color变量定义了按钮的背景颜色,然后在.button选择器中通过background-color: $primary-color;来使用这个变量。

2. 嵌套

CSS预处理器还允许我们在样式规则中进行嵌套。这样一来,我们可以更好地组织和管理我们的样式规则,减少代码重复。例如,下面是使用嵌套的例子:

.container { 
    width: 100%; 
    .header { 
        background-color: #f1f1f1; 
        padding: 20px; } 
    .content { 
        margin-top: 10px; 
        padding: 20px; 
    } 
}

在上述例子中,我们使用了.container选择器嵌套了.header.content选择器。这样一来,我们可以更清晰地表达这些选择器之间的关系,并且可以减少代码的冗余。

3. 混合(Mixins)

混合是CSS预处理器中非常有用的功能之一。通过使用混合,我们可以将一组CSS属性和值定义为一个可重用的代码块,并在需要的地方调用它们。这样一来,我们可以更方便地定义和使用常用的样式规则。下面是使用混合的例子:

.rounded-corners { 
    border-radius: 5px; 
} 
.button { 
    .rounded-corners; 
    background-color: #007bff; 
    color: white; 
    padding: 10px; 
}

在上述例子中,我们将border-radius属性值定义为.rounded-corners混合,并在.button选择器中通过.rounded-corners;来调用它。这样一来,我们可以在多个地方重用这个带有圆角边框的样式。

4.函数

把常用的运算操作抽象出来,我们就得到了函数。
我们可以自定义函数,预处理器自己也内置了大量的函数。最常用的内置函数应该就是颜色的运算函数了
举个例子,我们要给一个按钮添加鼠标悬停效果,而最简单的悬停效果就是让按钮的颜色加深一些。我们写出的 CSS 代码可能是这样的:

.button {
    background-color: #ff4466;
}

.button:hover {
    background-color: #f57900;
}

看到这段代码很难分清 #ff4466 和 #f57900 这两种颜色到底有什么关联。而如果我们的代码是用预处理语言来写的,那事情就会变的直观:

.button {
    $color = #ff9833;
    background-color: $color;
    &:hover {
        background-color: darken($color, 20%);
    }
}   

darken()就是预处理器内部自带的函数,使$color颜色加深,类似于rgba()
此外,预处理器的函数往往还支持默认参数、具名实参、arguments 对象等高级功能,内部还可以设置条件分支,可以满足复杂的逻辑需求。

总结

对Web项目的高要求促使CSS预处理和后处理器的涌现,传统CSS的复杂问题一部分来源于CSS本身的不灵活,一部分来源于浏览器的不同实现带来的兼容性问题。CSS预处理器的出现为CSS的编写、管理和维护提供了新思路,Sass, Scss, Stylus等预处理器实现了可以用编程的方式编写css样式,通过对CSS进行不同的转换和处理,从而把繁琐的工作交由程序处理。

参考资料

www.sass.hk/docs/
sass.bootcss.com/documentati…