css预处理器-less

876 阅读4分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

什么是less

less-是一种css预处理器,我们可以通过less语法来编写更为简洁的css语法

为什么要有less

WeChatcfe3e8cba40d9b73af62cfa7fef974db.png

<style>
    .box1 {
      width: 300px;
      height: 300px;
      background-color: lightcoral;
    }
    .box1 .box2 {
      width: 200px;
      height: 200px;
      background-color: lightblue;
    }
    .box1 .box2 .box3 {
      width: 100px;
      height: 100px;
      background-color: lightgreen;
    }
</style>
<body>
    <div class="box1">
        <div class="box2">
            <div class="box3"></div>
        </div>
    </div>
</body>

image.png
我们用css语法为页面中的3个div设置背景色的时候需要一层一层分别设置,这样写的嵌套关系不是很明确,在less中,我们可以用下面的语法去写这种嵌套关系

.box1{
    width: 300px;
    height: 300px;
    background-color: lightcoral;
    .box2{
        width: 200px;
        height: 200px;
        background-color: lightblue;
        .box3{
            width: 100px;
            height: 100px;
            background-color: lightgreen;
        }
    }
}

这种写法和原生的CSS语法效果相同,既减少了代码量,又明确的div的嵌套关系。

变量

在变量中,我们可以任意设置变量的值。
使用变量:

  • 直接使用变量:@变量名
  • 作为css类名使用: .@{变量名}{...}

优点:可复用、修改方便(修改变量值,所有用到该变量的地方都会改变)

<body>
    <div class="box1">
    </div>
    <div class="box2">
    </div>
</body>
    @width:200px;
    @height:200px;
    @color:red;
    @box:box2;

    .box1{
        width: @width;
        height: @height;
        background-color: @color;
    }
    .@{box}{
        width: @width;
        height: @height;
        background-color: lightgreen;
    }

效果

image.png

:extend()

对当前选择器扩展指定选择器的样式
使用方法:当前选择器:extend(指定选择器)


<body>
    <div class="box1">
    </div>
    <div class="box2">
    </div>
</body>
.box1{
    width: 200px;
    height: 200px;
    border: 1px solid #000;
    margin-bottom: 10px;
}
.box2:extend(.box1){
    background: lightgreen;
}

image.png

混合(Mixins)

类似js中的函数调用,可以将当前的css代码块复制到其他选择器中
使用方法:选择器()

<body>
    <div class="box1">
    </div>
    <div class="box2">
    </div>
</body>
.box1{
    width: 200px;
    height: 200px;
    border: 1px solid #000;
    margin-bottom: 10px;
}
.box2{
    .box1();
    background: lightgreen;
}

image.png

:extend VS 混合(Mixins)

从上面的两个例子中,我们可以看到:extend和混合(Mixins)这两种用法不同,但是实现的效果是相同的,那么他们到底也什么区别呢?下面我把以上两种less写法编译后的css贴出来

//:extend编译前
.box1{
    width: 200px;
    height: 200px;
    border: 1px solid #000;
    margin-bottom: 10px;
}
.box2:extend(.box1){
    background: lightgreen;
}
//编译后的css代码
.box1,
.box2 {
  width: 200px;
  height: 200px;
  border: 1px solid #000;
  margin-bottom: 10px;
}
.box2 {
  background: lightgreen;
}

//混合(Mixins)编译前
.box1{
    width: 200px;
    height: 200px;
    border: 1px solid #000;
    margin-bottom: 10px;
}
.box2{
    .box1();
    background: lightgreen;
}
//编译后的css代码
.box1 {
  width: 200px;
  height: 200px;
  border: 1px solid #000;
  margin-bottom: 10px;
}
.box2 {
  width: 200px;
  height: 200px;
  border: 1px solid #000;
  margin-bottom: 10px;
  background: lightgreen;
}

通过对比我们可以发现,:extend,编译后是用了css选择器分组的方式,而混合(Mixins)编译后是复制了一份css代码

混合(Mixins)高级用法

通过上面的对比,我们知道混合函数的用法和:extend的用法还是有一些区别的。但是这些区别并不足以说明问题,反而让我们觉得混合函数使代码量更多了。但真的是这样嘛?

<body>
    <div class="box">
    </div>
</body>
.test(@w,@h,@color){
    width: @w;
    height: @h;
    border: 1px solid #000;
    background-color: @color;
}
.box{
    .test(200px, 200px,yellow)
}

image.png
这才是混合函数真正厉害的用法,我们定义好函数后,完全可以像js函数一样去传参去调用。

image.png

如何使用less

说了半天less语法,我们到底如何使用less呢?要知道,在浏览器中是不支持less语法的!!! 所有的less语法都需要编译成css语法才能让浏览器认识。下面介绍2种less用法

  • 非构建工具创建的项目中使用less 这种项目我们一般写测试会用到。我们可以在vscode中安装一个Easy LESS的插件,这个插件的作用就是可以把我们创建的less文件自动生成一份编译后的css文件,我们在页面中引入css文件的时候直接引入编译后的css文件即可

image.png

image.png

  • 框架中使用less 框架中使用less就简单了,我们直接安装对应的依赖即可
    npm install less less-loader --save-dev
    注意:这里推荐指定版本号去安装,不然有可能会报错(贴一张我安装的版本)

image.png
用法:我们以vue框架为例子,直接将style中的lang设置为less,引入对应的less文件即可

image.png

结尾

当然,less的语法不止这些。这里只介绍一些常用的比较方便的语法,更多用法请移步至less快速入门