介绍

LESS以类似编程语言形式去书写CSS代码,可以解决下列的问题:

  • 重复的样式值:例如基本的颜色、常用长度宽度大小等
  • 重复的CSS代码段:例如浮动和清除浮动代码大多数地方是一致的
  • 重复的嵌套书写:利用各种选择器选择元素的重复难以阅读的嵌套书写

原理

LESS本身是一个预编译器,使用LESS语法的代码,浏览器是不能识别的,需要通过LESS预编译器编译成.css文件才能正常使用。

安装

这里我选择开发环境安装。

npm i less --save-dev

编译命令

npx lessc 【需要编译的.less文件路径】 【编译后的.css文件路径】

在webpack中使用less-loader

npm i less-loader --save-dev

webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    mode: "development",
    devServer: {
        open: true
    },
    module: {
        rules: [
            { test: /\.less$/, use: ["style-loader", "css-loader?modules", "less-loader"] },
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: "./public/index.html"
        })
    ]
}

使用

变量(Variables)
@base-color:#000;
@border-color:#782;
@border-color-hover:lighten(@link-color,20%);
body{
  background-color: @base-color;
}
.footer{
  border: 1px solid @base-color;
}
.border{
  color:@border-color
}
.border:hover{
  color: @border-color-hover;
}

编译为:

body {
  background-color: #000;
}
.footer {
  border: 1px solid #000;
}
.border {
  color: #782;
}
.border:hover {
  color: #30360e;
}

以上封装了@border-color-hover,@border-color,@border-color-hover三个变量

混合(Mixins)
.clearFloat{
  display: block;
  content: '';
  clear: both;
}

.nav::after{
  .clearFloat()
}

.footer::after{
  .clearFloat()
}

编译为:

.clearFloat {
  display: block;
  content: '';
  clear: both;
}
.nav::after {
  display: block;
  content: '';
  clear: both;
}
.footer::after {
  display: block;
  content: '';
  clear: both;
}

通过混合把.clearFloat的代码直接复用到伪元素::after中,不用重复书写相同代码。

嵌套(Nesting)
.nav{
  width: 80%;
  .nav-item{
    float: left;
    width: 60px;   
    &>.point{
      width: 5px;
      height: 5px;
      border-radius: 50%;
    } 
  }
}

编译为:

.nav {
  width: 80%;
}
.nav .nav-item {
  float: left;
  width: 60px;
}
.nav .nav-item > .point {
  width: 5px;
  height: 5px;
  border-radius: 50%;
}

通过编译后的代码可以看出,LESS嵌套可以减少书写重复的CSS嵌套。& 表示代表父级元素。

运算(Operations)
@a:300px;
@b:10cm;
@c:@b - @a;
@e:15%;
.nav{
  width: @c;
  height: @e * 3;
}

编译为:

.nav {
  width: 2.0625cm;
  height: 45%;
}

算术运算符 +、-、*、/ 可以对任何数字、颜色或变量进行运算。如果可能的话,算术运算符在加、减或比较之前会进行单位换算。计算的结果以最左侧操作数的单位类型为准。如果单位换算无效或失去意义,则忽略单位。无效的单位换算例如:px 到 cm 或 rad 到 % 的转换。

转义(Escaping)
@max-mda:~"(max-width:850px)";
.nav{
  @media @max-mda{
    background-color: #000;
  }
}

编译为:

@media (max-width:850px) {
  .nav {
    background-color: #000;
  }
}

任何 ~“anything” 或 ~‘anything’ 形式的内容都将按原样输出。
从 Less 3.5 开始,可以简写为:

@max-mda:(max-width:850px);
.nav{
  @media @max-mda{
    background-color: #000;
  }
}
函数(Functions)
@base: #f04615;
@width: 0.5;

.class {
  width: percentage(@width);
  color: saturate(@base, 5%);
  background-color: spin(lighten(@base, 25%), 8);
}

编译为:

.class {
  width: 50%;
  color: #f6430f;
  background-color: #f8b38d;
}

Less 内置了多种函数用于转换颜色、处理字符串、算术运算等。这些函数在Less 函数手册中有详细介绍。

命名空间和访问符
#base() {
  .button {
    &>.child{
      color: #fff;
    }
  }
}

.nav{
  #base.button.child();
}

编译为:

.nav {
  color: #fff;
}

.child 的css代码混入到 .nav 类中。

映射(Maps)

从 Less 3.5 版本开始,混合(mixins)和规则集(rulesets)作为一组值的映射(map)使用。

#config-color(){
  base:#fff;
  error:red;
}
.msg{
  color:#config-color[base];
  background-color: #config-color[error];
}

编译为:

.msg {
  color: #fff;
  background-color: red;
}
作用域(Scope)
@width:100px;
.nav{
  @width:150px;
  .item{
    width: @width;
  }
}
.list{
  width: @width;
}

编译为:

.nav .item {
  width: 150px;
}
.list {
  width: 100px;
}

和javascript的作用域类似,先使用当前作用域下的变量,如果查找不到,继续查找使用父级或祖先的变量。

注释(Comments)
/* 一个块注释
 * style comment! */
@var: red;

// 这一行被注释掉了!
@var: white;

块注释和行注释都可以使用

导入(Importing)

index.less

@import "a"; //引入a.less
@import "base.css";
.nav{
  width: @width;
  height: @heigh;
}

a.less

@width:100px;
@heigh:50px;

base.css

body{
    margin: 0;
    padding: 0;
}

编译为:

@import "base.css";
.nav {
  width: 100px;
  height: 50px;
}

导入一个 .less 文件,此文件中的所有变量就可以全部使用了。如果导入的文件是 .less 扩展名,则可以将扩展名省略掉。