介绍

CSS 预处理器是一个能让你通过预处理器自己独有的语法来生成CSS的程序。市面上有很多CSS预处理器可供选择,且绝大多数CSS预处理器会增加一些原生CSS不具备的特性,例如代码混合,嵌套选择器,继承选择器等。这些特性让CSS的结构更加具有可读性且易于维护。

  • 嵌套 反映层级和约束
  • 变化和计算 减少重复代码
  • Extend 和 Mixin代码片段
  • 循坏 适用于复杂有规律的样式
  • import CSS文件模块化

分类

  • Sass:2007年诞生,最早也是最成熟的CSS预处理器,拥有ruby社区的支持和compass这一最强大的css框架,目前受LESS影响,已经进化到了全面兼容CSS的SCSS。sass 中文文档Sass 参考手册

  • Less:2009年出现,受SASS的影响较大,但又使用CSS的语法,让大部分开发者和设计师更容易上手,在ruby社区之外支持者远超过SASS,其缺点是比起SASS来,可编程功能不够,不过优点是简单和兼容CSS,反过来也影响了SASS演变到了SCSS的时代,著名的Twitter Bootstrap就是采用LESS做底层语言的。Less 中文文档

  • Stylus:2010年产生,来自Node.js社区,主要用来给Node项目进行CSS预处理支持,在此社区之内有一定支持者,在广泛的意义上人气还完全不如SASS和LESS。Stylus 中文文档

SCSS

在线编译器https://www.sassmeister.com/

嵌套

  1. .clearfix {
  2. display: block;
  3. zoom: 1;
  4. &:after {
  5. content: " ";
  6. display: block;
  7. font-size: 0;
  8. height: 0;
  9. clear: both;
  10. visibility: hidden;
  11. }
  12. }
  1. .parent {
  2. ...
  3. @at-root .child { ... }
  4. }
  5. //输出为
  6. .parent { ... }
  7. .child { ... }

变量

  1. $width: 10px;

Mixin

  1. /* 混入接收两个参数 */
  2. @mixin bordered($color, $width) {
  3. border: $width solid $color;
  4. }
  5. .myArticle {
  6. @include bordered(blue, 1px); // 调用混入,并传递两个参数
  7. }
  8. .myNotes {
  9. @include bordered(red, 2px); // 调用混入,并传递两个参数
  10. }

@content用在mixin 里面的,当定义一个mixin 后,并且设置了@content
@include的时候可以传入相应的内容到 mixin 里面

  1. $color: white;
  2. @mixin colors($color: blue) {
  3. background-color: $color;
  4. @content;
  5. border-color: $color;
  6. }
  7. .colors {
  8. @include colors { color: $color; }
  9. }
  10. 编译后:
  11. .colors {
  12. background-color: blue;
  13. color: white;
  14. border-color: blue;
  15. }

Extend

继承

  • sass
    1. .subClassOne{
    2. @extend .parentClass;
    3. }

Loop

  • sass ```less @mixin gen-col($n){ @if $n > 0{ @mixin gen-col($n - 1); .col-#{$n} {
    1. width: 100px + 12*$n ;
    } } }

@mixin gen-col(12);

//直接使用for循坏 @for $i from 1 throught 12 { .col-#{$i} { width: 100px + 12*$i ; }

  1. <a name="QCybE"></a>
  2. ## Function
  3. - SASS允许用户编写自己的函数。
  4. ```css
  5. @function double($n) {
  6. @return $n * 2;
  7. }
  8. #sidebar {
  9. width: double(5px);
  10. }

import

  1. @import "xxx";

LESS

变量

  1. @width: 10px;

Mixin

  1. .bordered {
  2. border-top: dotted 1px black;
  3. border-bottom: solid 2px black;
  4. }
  5. #menu a {
  6. color: #111;
  7. .bordered();
  8. }
  9. .post a {
  10. color: red;
  11. .bordered();
  12. }

Extend

  1. .parentClass{
  2. color:red;
  3. }
  4. .subClassOne{
  5. &:extend(.parentClass);
  6. }
  7. .subClassTwo:extend(.parentClass){
  8. }
  9. //编译后
  10. .parentClass,
  11. .subClassOne,
  12. .subClassTwo {
  13. color: red;
  14. }

Loop

  • less 使用递归 ```less .gen-col(@n) when(@n > 0){ .gen-col((@n - 1)); .col-@{n} {
    1. width: 100px + 12*@n ;
    } }

.gen-col(12);

  1. <a name="gTIgX"></a>
  2. ## import
  3. ```less
  4. @import "xxx";

CSS预处理器框架

  • SASS - Compass
  • Less - Lesshat / EST
  • 提供现成的mixin
  • 类似JS类库 封装常用功能