CSS 预处理器 Less 和 Sacc

753 阅读2分钟

CSS 预处理器

一、CSS 预处理器是什么

  • 基于 CSS 的另一种语言
  • 通过工具编译成 CSS
  • 添加了很多 CSS 不具备的特性
  • 能提升 CSS 文件的组织

1. 预处理器的作用

  • 帮助更好地组织 CSS 代码
  • 提高代码复用率
  • 提升可维护性

2. 预处理的能力

  • 嵌套 反应层级和约束
  • 变量和计算 减少重复代码
  • Extend 和 Mixin 代码片段
  • 循环适用于负载有规律的样式
  • import CSS 文件模块化
    • css 中也存在,但 css 不会进行代码合并,而是浏览器会进行动态引用,每个文件间浏览器会单独发一个请求

提高代码复用率和可维护性吧

二、Less

1. 安装

npm i less -D
// 编译
npx lessc test.less
// 编译输出文件名和路径
npx lessc test.less>test.css
.wrapper {
    background: white;
    .nav {
        font-size: 12px;
    }
    .content {
        font-size: 14px;
        &:hover {
			background: red;
        }
    }
}

2. less 变量

& 代表同级

@fontSize: 12px;
@bgColor: red;

body {
    padding: 0;
    margin: 0;
}

.wrapper {
    background: lighten(@bgColor, 40%);
    
    .nav {
        font-size: @fontSize;
    }
    .content {
        // 乘法不用带单位
        font-size: @fontSize + 2px;
    }
}

3. less mixin

@fontSize: 12px;
@bgColor: red;

body {
    padding: 0;
    margin: 0;
}

.block(@fontSize) {
    font-size:  @fontSize;
    border: 1px solid #ccc;
    border-radius: 4px;
}

.wrapper {
    background: lighten(@bgColor, 40%);
    
    .nav {
     	.block(@fontSize)   
    }
    .content {
        // 乘法不用带单位
        .block(@fontSize)
    }
}

4. less extend

@fontSize: 12px;
@bgColor: red;

.block {
	font-size: @fontSize;
    border: 1px solid #ccc;
    border-radius: 4px;
}

body {
    padding: 0;
    margin: 0;
}

.wrapper {
    background: lighten(@bgColor, 40%);
    
    .nav:extend(.block) {
    }
	
    .content{
        &:extend(.block);
        &:hover {
            background: red;
        }
    }
}

5. less loop

.gen-col(@n) when (@n > 0) {// 终止条件
    // 递归
    .gen-col(@n - 1);
    .col-@{n} {
        width: 1000px / 12 * @n;
    }
}

.gen-col(12);

6. less import

@import 'test.less'

三、Sass

1. 安装

npm i node-sass
// 编译
npx node-sass test.scss
// 编译输出
npx node-sass test.scss>test.css
// 打平嵌套结构
npx node-sass --out-style expanded test.scss>test.css

2. Sass 变量

$fontSize: 12px;
$bgColor: red;

body {
    padding: 0;
    margin: 0;
}

.wrapper {
    background: lighten($bgColor, 40%);
    
    .nav {
        font-size: $fontSize;
    }
    .content {
        // 乘法不用带单位
        font-size: $fontSize + 2px;
    }
}

3. Sass mixin

$fontSize: 12px;
$bgColor: red;
@mixin block($fontSize) {
    font-size: $fontSize;
    border:  1px solid #ccc;
    border-radius: 4px;
}

.wrapper {
    background: lighten($bgColor, 40%);
    
    .nav {
        @include block($fontSize);
    }
    .content {
        // 乘法不用带单位
        @include block($fontSize + 2px);
    }
}

4. Sass extend

$fontSize: 12px;
$bgColor: red;
.block {
    font-size: $fontSize;
    border:  1px solid #ccc;
    border-radius: 4px;
}

.wrapper {
    background: lighten($bgColor, 40%);
    
    .nav {
        @extend .block;
    }
    .content {
        // 乘法不用带单位
        @extend .block;
    }
}

5. Sass loop

@mixin gen-col($n) {
    @if $n > 0 {
		@include gen-col($n - 1);
        .col-#P{$n} {
            width: 1000px/12 * $n;
        }
    }
}

@include gen-col(12);
// sass 支持 for 循环 less 不支持
@for $i from 1 through 12 {
    .col-#{$i} {
        width:  1000px / 12 * $i;
    }
}

6. sass import

@import 'test.scss'

四、CSS 预处理器框架

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

@import "est/all"

// 清空默认样式
.global-reset();

.box {
    // 行内块元素
	.inline-block();
    // 透明度
    .opacity(60);
}