Live2d Test Env

Less预处理器的使用

练习页面:

<body>
   <div class="div1">
       <div class="div2"></div>
   </div>
</body>

第一:基本使用

less使用嵌套的方式实现子类或者后代选择器:

1,实现后代选择器

使用大括号嵌套表示祖先和后代之间的关系

.div1{
    width: 200px;
    height: 200px;
    margin: 0 auto;
    position: relative;
    border: 1px red solid;
    .div2{
        position: absolute;
       width: 50px;
       height: 50px;
       background-color:black;
       top: 0;
       right: 0;
       left: 0;
       bottom: 0;
       margin: auto;

    }
}

编译之后

.div1 {
  width: 200px;
  height: 200px;
  margin: 0 auto;
  position: relative;
  border: 1px red solid;
}
.div1 .div2 {
  position: absolute;
  width: 50px;
  height: 50px;
  background-color: black;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  margin: auto;
}

变量的使用:

使用方法:通过@变量名:变量值的方式来定义变量;使用变量规则:若该变量表示的是样式的属性值,使用@变量名;如果该变量表示的是一个样式的属性或者选择器或者一个url时,则使用:@{变量名}的方式引入。

@colorBGC:black;/*定义属性值变量*/
@posi:position;/*定义属性变量*/
@selecter:div2;/*定义选中器变量*/
.div1{
    width: 200px;
    height: 200px;
    margin: 0 auto;
    position: relative;
    border: 1px red solid;
    .@{selecter}{/*使用选择器变量*/
        @{posi}: absolute;/*使用属性变量*/
       width: 50px;
       height: 50px;
       background-color:@colorBGC;/*使用属性值变量*/
       top: 0;
       right: 0;
       left: 0;
       bottom: 0;
       margin: auto;

    }
}

编译结果和上一步编译成的css结果一样。

变量的延迟加载:定义变量尽量定义在全局,如果定义在使用之后,加载同一个同名变量会加载最后一个变量作为其变量名。同时变量还有域的概念,先在本作用域找变量,在到其祖先选择器找变量。

@v:1;
.div1{
    @v:2;
    .div2{
        @v:3;
        top:@v;
        @v:4;
    }
    height: @v;
}

输出结果为:

.div1 {
  height: 2;
}
.div1 .div2 {
  top: 4;
}

由此可看出,变量首先赋值,再使用。

2,&的使用

&表示的是平级,通常使用在并集选择器或者伪类伪元素之中

@colorBGC:black;/*定义属性值变量*/
@posi:position;/*定义属性变量*/
@selecter:div2;/*定义选中器变量*/
div{
    
    .@{selecter}{/*使用选择器变量*/
        @{posi}: absolute;/*使用属性变量*/
       width: 50px;
       height: 50px;
       background-color:@colorBGC;/*使用属性值变量*/
       top: 0;
       right: 0;
       left: 0;
       bottom: 0;
       margin: auto;
       &:hover{/*表示选择器   div   div2:hover */
        background-color:red;
       }

    }
    &.div1{/*表示选择器 div.div1 */
        width: 200px;
        height: 200px;
        margin: 0 auto;
        position: relative;
        border: 1px red solid;
    }
}

输出结果为:

div .div2 {
  /*使用选择器变量*/
  position: absolute;
  /*使用属性变量*/
  width: 50px;
  height: 50px;
  background-color: black;
  /*使用属性值变量*/
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  margin: auto;
}
div .div2:hover {
  background-color: red;
}
div.div1 {
  width: 200px;
  height: 200px;
  margin: 0 auto;
  position: relative;
  border: 1px red solid;
}

第二:混合mixins

1,普通混合

通过定义样式规则的方式,通过样式规则名引用规则就可;

样式规则:

.样式规则名(args){
样式.....
}

引用:

.样式规则名(args)

注意:可以不转参数或者省略小括号,省略小括号表示的是将该规则编译到css文件中。

.guize(){//定义混合
    width: 200px;
    height: 200px;
    margin: 0 auto;
    position: relative;
    border: 1px red solid;
}
div{
    .guize;//引入混合
    .div2{
        position: absolute;
       width: 50px;
       height: 50px;
       background-color:red;
       top: 0;
       right: 0;
       left: 0;
       bottom: 0;
       margin: auto;
       &:hover{
        background-color:blue;
       }
    } 
}

2,带参数混合

带参数表示的是变量,通过定义变量,将变量转入混合中。

.guize(@color,@h,@w){//传参的形式
    width: @w;
    height: @h;
    margin: 0 auto;
    position: relative;
    border: 1px @color solid;
}
div{
    .guize(red,200px,200px);//传入参数S
    .div2{
        position: absolute;
       width: 50px;
       height: 50px;
       background-color:red;
       top: 0;
       right: 0;
       left: 0;
       bottom: 0;
       margin: auto;
       &:hover{
        background-color:blue;
       }
    } 
}

可以通过传不同的参数,来实现对不同选择器的相同属性的不同属性值的控制。

3,带参数且有默认值混合

.guize(@color:red,@h:100px,@w:100px){//传参的形式
    width: @w;
    height: @h;
    margin: 0 auto;
    position: relative;
    border: 1px @color solid;
}
div{
    .guize(red,200px,200px);//传入参数S
    .div2{
        position: absolute;
       width: 50px;
       height: 50px;
       background-color:red;
       top: 0;
       right: 0;
       left: 0;
       bottom: 0;
       margin: auto;
       &:hover{
        background-color:blue;
       }
    } 
}

如果我们少少传参数的时候,它会按照顺序进行匹配,此时如果传一个200px传给@w,则@color的值会是一个200px,不符合,此时可以通过命名参数实现对应传参。在调用的时候使用: .guize(@w:200px)就可将数据传给@w。

4,匹配混合

如我们画三角形,想要获取对应方向的三角形,需要一个个的动手换样式。为了代码复用,我们可以将四个方向的三角形样式都定义在一个文件中,然后再引入,通过特定的标识来匹配不同的样式:

四个角的样式:

.guize(@_){
    width: 0;
    height: 0;
    border-width: 40px;
    border-style: solid;
}
.guize(R){
    
    border-color:  transparent red transparent transparent;
}
.guize(T){
 
    border-color: red transparent transparent transparent ;
}
.guize(L){

    border-color:  transparent   transparent  transparent red; 
}
.guize(B){
  
    border-color:  transparent  transparent red transparent;
}

注意:将相同的样式定义在同名函数内,通过参数@_   可以实现在编译的时候将样式编译到被匹配的样式中去。

匹配调用:

获取上三角

@import ‘./guize.less’
.div1{
    height: 200px;
    width: 200px;
    border: blueviolet solid 1px;
    .div2{
       .guize(T);
    }
}

获取下三角:

@import ‘./guize.less’
.div1{
    height: 200px;
    width: 200px;
    border: blueviolet solid 1px;
    .div2{
       .guize(B);
    }
}

注意:这个就是画三角形的API。

5,@arguments混合

就是在传参的使用,直接通过@arguments获取实参列表而不是一个个写。

.guize(@1,@2,@3){
    border:@arguments;
}

.div1{
    height: 200px;
    width: 200px;
    border: blueviolet solid 1px;
    .div2{
        height: 50px;
        width: 50px;
       .guize(red,solid,1px);
    }
}

编译后:

.div1 {
  height: 200px;
  width: 200px;
  border: blueviolet solid 1px;
}
.div1 .div2 {
  height: 50px;
  width: 50px;
  border: red solid 1px;
}

第三:less计算

less中的可计算值数值可以实现加减乘除运算(加入计算的数值只需要一个数值有单位就可,都有也可以)

.guize(@1,@2,@3){
    border:@arguments;
}

.div1{
    height: 200px;
    width: 200px;
    border: blueviolet solid 1+2px;//计算

    .div2{
        height: 50px;
        width: 50px;
       .guize(red,solid,1px);
    }
}

编译:

.div1 {
  height: 200px;
  width: 200px;
  border: blueviolet solid 3px;/*结果为3px*/
}
.div1 .div2 {
  height: 50px;
  width: 50px;
  border: red solid 1px;
}

posted @ 2021-09-07 13:32  waywardcode  阅读(184)  评论(0)    收藏  举报