less基础详解

此文转载自:https://blog.csdn.net/h907310116/article/details/109819846#commentBox

 

1.初识less

     less作为一门CSS扩展语言,也就是说CSS预处理器。(Leaner Style Sheets)简称less,它只不过是为css新增这些的功能,比如说:变量、函数、作用域等等。它的优点是:更具有维护性、扩展性等,可以降低了维护的成本,根据按这样的话,那么less可以让我们写更少的代码做更多的事情。

    和css相比下,css的语法非常简单,而且对开发者来说要求比较低,比较合适小白者,但是遇到有些问题,比如没有这种变量、函数等等,的确还不如less的扩展性,需要写大量的代码,但是看眼中的确没有逻辑的代码,CSS冗余度是比较高的。不方便维护,不利于复用,而且没有计算的能力。

   如果对css有基础的话,less很容易上手的。因为css和less区别不大的,反正可以通过编译生成浏览器能识别的css文件

 2.less使用

  这个less使用不用复杂,就是新建一个后辍名为less文件即可,然后在less文件使用less语句,当写完less语句编译后就会自动生成多了一个后辍名为css文件即可。

3.less和css简单的语句区别

  style.less

style.css

相比一下,还是感觉less语句的代码比较舒服,以上代码内容就是叫嵌套写法,这样的话大大减少了代码量,less代码看起来更加清晰。

4.less语法

4.1变量(variables)

4.1.1普通的变量

变量的定义方式为@,可以赋给变量!

语法:@变量名:值。

less:

// 1.普通的变量
@bgColor:white;
@Height:50rpx;
.contain{
    background-color: @bgColor;

}
.row{
    height:@Height;
    margin-left:@Height;
}   

编译后的css:

.contain {
  background-color: white;
}
.row {
  height: 50rpx;
  margin-left: 50rpx;
}

注意:最好尽量用全局变量,避免无法复用!比如我写变量(Height)在contain{}里面,但却row{}里面的变量不存在,导致出错,这是叫局部变量。

4.1.2选择器和属性名

这个选择器和属性名可以均作为变量

语法:@选择器的名:属性名;

// 2.作为选择器和属性名

@Mycontain:width;

.@{Mycontain}{//选择器
    height:300rpx;
    @{Mycontain}:200rpx;//属性名
}

编译后的css:

.width {
  height: 300rpx;
   200rpx;
}

4.1.3作为URL

使用时候,使用“ ”将变量的值扩起来,使用同样将变量以@{变量名}的方式使用;

语法:@变量:作路径;

less:

// 3.作为URL
@img-url:"../imgs/idnex";
img{
    background-image: url("@{img-url}/shouye.png");
}

编译后的css:

img {
  background-image: url("../imgs/idnex/shouye.png");
}

4.1.4延迟加载

什么是延迟加载?变量是延迟加载的,在使用前不一定要预先声明。

语法:@变量1:@变量2;

           @变量2:9%;

less:

// 4.延迟加载
.lazy-eval{
    @var;
}

@var:@a;
@a:9%;

编译后的css:

.lazy-eval {
   9%;
}

4.1.5定义多个相同名称的变量时

在定义一个变量两次时,只会使用最后定义的变量,less会从当前作用域向上搜索(比如就是从下往上搜索)。这个行为类似于CSS的定义中始终使用最后定义的属性值。

less:

.class{
    @var:1;
    @var:2;//选中的搜索
    .brass{
        @var:2;
        three:@var;//结果为three:4;
        @var:3;
        @var:4;//选中的搜索
    }
    one:@var;//结果为one:2;
}

编译后的css:

.class {
  one: 2;
}
.class .brass {
  three: 4;
}

5.1混合(mixins)

5.1.1 普通混合

混合就是一种将一系列属性从一个规则引入(“混合”)到另一个规则集的方式。这个意思是在less中定义的选择器类可以直接放入其他选择器类里面,这种重复使用很强。

less:

//1.普通混合
.bor{
    background-color: aqua;
     32rpx;
}
.poop{
    color:white;
    .bor;
}

.boom{
    height:200rpx;
    .bor;
}

编译后的css:

.bor {
  background-color: aqua;
   32rpx;
}
.poop {
  color: white;
  background-color: aqua;
   32rpx;
}
.boom {
  height: 200rpx;
  background-color: aqua;
   32rpx;
}

5.1.2不带输出的混合

如果你想要创建一个混合的类,但是我不想让它输出到css的样式并显示。

只要类的名字后面加上括号,就可以实现的,这样不会到css样式中显示!

less:

// 2.不带输出的混合
.mymix{
    color:black;
}
.mymix-echa(){//css样式中不显示
    background-color: white;

}
.dad{
     30rpx;
    height:30rpx;
}

编译后的css:

.mymix {
  color: black;
}
.dad {
   30rpx;
  height: 30rpx;
}

在css样式中实现不显示.mymix-echa()类。

5.1.3带选择器的混合

这个带选择器,可以放入选择器。

语法:{&:选择器}

less:

//3.带选择器的混合
.father(){
    &:hover{
        background-color: white;
        font-size:32px;
    }
}

.child{//类名字后面多了:hover
    .father;
}
.son{//类名字后面多了:hover
    .father;
}

编译后的css:

.child:hover {
  background-color: white;
  font-size: 32px;
}
.son:hover {
  background-color: white;
  font-size: 32px;
}

5.1.4带参数的混合

带参数就是传递参数。

语法:类的名称(形参){}

less:

// 4.带参数的混合
.son(@width){
    @width;
}
.dad{
    .son(300px);//需要传一个参数进去
}

编译后的css:

.dad {
   300px;
}

那如果形参如何使用默认值呢?

形参是可以默认值,这样不需要传递参数,如下:

less:

//5.带参数的混合默认值
.son(@200px){
    @width;
}
.dad{
    .son();
}

编译后的css:

.dad {
   200px;
}

5.1.5带多个参数的混合

一个组合可以带多个参数,参数之间可以使用分号或者逗号来分割。

比如:.mini(形参1;形参2)这代表是分号;.mini(形参1,形参2)这代表是逗号。

但是建议尽量使用分号来分隔,因为这逗号可以编译为参数分割或者css为列表分割。

(1)如果两个参数,而且每个参数都是逗号分割的列表,最后到分号表示结束:.mini(1,2,3;something, ele);

less:

//6.带多个参数的混合
.mini(@color;@padding:xxx;@margin:2){
    color-1:@color;
    padding-2:@padding;
    margin-3:@margin;
}
.div{
    .mini(1,2,3;something, ele);
}

编译后的css:

.div {
  color-1: 1, 2, 3;
  padding-2: something, ele;
  margin-3: 2;
}

分析:在less的.div{.mini(1,2,3;something,ele)}参数只有两个,那么就会传到形参1和形参2,但由于形参3有默认值,所以生成编译后css的结果(如上)。

(2)如果三个参数里面都是逗号来分割,就会传到各种参数:.mini(1,2,3)。

less:

//6.带多个参数的混合
.mini(@color;@padding:xxx;@margin:2){
    color-1:@color;
    padding-2:@padding;
    margin-3:@margin;
}
.div1{
    .mini(1,2,3);
}

编译后的css:

.div1 {
  color-1: 1;
  padding-2: 2;
  margin-3: 3;
}

分析:由于参数都是三个,而且采用逗号进行分割,就会传到形参1,形参2,形参3,生成了编译后css的结果(如上)。

(3)如果参数里面有逗号,也有分号,那么会传到第一个参数,也就是说传到形参1:.mini(1,2,3;);

less:

//6.带多个参数的混合
.mini(@color;@padding:xxx;@margin:2){
    color-1:@color;
    padding-2:@padding;
    margin-3:@margin;
}
.div2{
    .mini(1,2,3;);
}

编译后的css:

.div2 {
  color-1: 1, 2, 3;
  padding-2: xxx;
  margin-3: 2;
}

分析:多个参数里面有逗号,也有分号,整个多个参数的值就会传到形参1,而且形参2和形参3有默认值,生成了编译后css的结果(如上)。

5.1.6 arguments变量

arguments变量表示可变参数,意思是形参从先到后的顺序。注意:这个是参数值位置必须是一一对应。

less:

//7.arguments变量
.son3(@dd1:20px;@dd2:solid;@dd3:white){
    border:@arguments;
}
.div4{
    .son3();
}

编译后的css:

.div4 {
  border: 20px solid white;
}

6.1匹配模式

当传值的时候定义一个字符,在使用那个一个字符,就调用规则集。

less:


// 8.匹配模式
.border(all,@w){
    border-radius: @w;
}

.border{
    .border(all,50%);
}

编译后的css:

.border {
  border-radius: 50%;
}

7.1得到混合中的变量的返回值

就像调用函数一样的过程。

less:

//9.得到混合中变量的返回值
.ave(@x,@y){
    @ave:(@x+@y);
}
.son{
    .ave(20px,40px);
    @ave;
}

编译后的css:

.son {
   60px;
}

分析代码过程:

1.首先把二个参数分别为20px和40px传到.ave(@x,@y);

2.在.ave{}里面获取了两个值并进行计算结果,然后给变量@ave;

3.在.son{}中调用了@ave的值;

4.最后生成了编译后css的结果width为60px。

8.1嵌套规则(nested-rules)

8.1.1普通的写法

less:

//10.嵌套规则
.contain{
  .dad{
      30px;
      background-color: #fff;
      .son{
          border-radius: 40px;
      }
  }  
  .dad1{
      height:300px;
      background-color: black;
  }
}

编译后的css:

.contain .dad {
   30px;
  background-color: #fff;
}
.contain .dad .son {
  border-radius: 40px;
}
.contain .dad1 {
  height: 300px;
  background-color: black;
}

less写法结构当然很清晰,后期有利于维护,非常简便。

8.1.2父元素选择器&

表示当前选择器的所有父选择器,使用&符引用选择器的名。

less:

//11.父元素选择器&
.bgcolor{
    background: black;
    a{
        color:#fff;
        &:hover{
            color:blue;
        }
    }
}

编译后的css:

.bgcolor {
  background: black;
}
.bgcolor a {
  color: #fff;
}
.bgcolor a:hover {
  color: blue;
}

或者也可以用这个

less:

.contain{
    &>p{
        color:red;
    }
    &+.contain{
        background-color: black;
    }
    & div{
         300px;
    }
}

编译后的css:

.contain > p {
  color: red;
}
.contain + .contain {
  background-color: black;
}
.contain div {
   300px;
}

8.1.3改变选择器的顺序&

如果将当前的选择器名字后面放在&,就会当前的选择器提到父级。

less:

// 12.改变选择器的顺序&
.contain{
    h1&{
        200px;
        height:300px;
    }
}

#son{
    ul{
        li{
            .contain&{
                height:100px;
                background-color: #fff;
            }
        }
    }
}

编译后的css:

h1.contain {
   200px;
  height: 300px;
}
.contain#son ul li {
  height: 100px;
  background-color: #fff;
}

9.1运算(operations)

任何数值,颜色和变量都可以计算的,less当然会自动推断数值的单位,所以不必每一个值都加上单位。

less:

// 13.运算
.contain{
    font-size:300px+200*2;
}

编译后的css:

.contain {
  font-size: 700px;
}

10.1 命名空间

如果将一些变量或者混合块一起打包起来,这样可以支持复用性,也可以通过嵌套多层id或者class来实现。

使用#contain()来作为命名空间,而且是在css样式中不会显示#contain()命名空间。

less:

// 14.命名空间
//实例1
#contain(){//加(),表示css不输出
    background-color: blue;
    .dad{
        300px;
        &:hover{
            height:200px;
        }
    }
    .father{
        100px;
        height:200px;
    }
}

//实例2
.tiweq(){
    color:#fff;
    height:200px;
    .eitw{
        100px;
        border:200px;
    }
}

//到css中显示
.contain1{
    background-color: aqua;
    #contain>.dad;
}

.contain2{
    .tiweq>.eitw;
}

编译后的css:

.contain1 {
  background-color: aqua;
   300px;
}
.contain1:hover {
  height: 200px;
}

.contain2 {
   100px;
  border: 200px;
}

分析:如果在命名空间中想获取的某样式中,比如想要获取dad{..}模块里面数据的话,那么写#contain>.dad即可,然后到css中就会显示你需要的数据;

另外,最省略就是“>”写法。只要你不写“>”,一样都可以获取数据。

less:


// 14.命名空间
.tiweq(){
    color:#fff;
    height:200px;
    .eitw{
        100px;
        border:200px;
    }
}
.cotain3{
    .tiweq .eitw;
    
}

编译后css:

.cotain3 {
   100px;
  border: 200px;
}

11.1作用域

less中的作用域与编程语言中的作用域概念非常类似。首先会在局部查找变量和混合,如果没找到,编辑器就会在父作用域中查找,以此类推。

less:

//15.作用域 
@clolor:#ffffff;

.contain{
   50px;
  a{
    color: @clolor;
  }
  @clolor:blue;
}

编译后的css:

.contain {
   50px;
}
.contain a {
  color: blue;
}

12.1引入(importing)

可以引入一个或多个.less文件,然后这个文件中的所有变量都可以在当前的less项目中使用!比如我有一个main.less文件,而且里面有变量,所以想引入这个main.less文件并使用它的变量。

main.less

@baby:300px;

index.less

//16.引入
@import "../main";//引入main.less文件

.contain-qq{
    @baby;
}

index.css

.contain-qq {
   300px;
}

另外可带参数:

//@import "main.less";
//@import (reference) "main.less";  //引用LESS文件,但是不输出
//@import (inline) "main.less";  //引用LESS文件,但是不进行操作
//@import (once) "main.less";  //引用LESS文件,但是进行加工,只能使用一次
//@import (less) "index.css";  //无论是什么格式的文件,都把它作为LESS文件操作
//@import (css) "main.less";  //无论是什么格式的文件,都把它作为CSS文件操作
@import (multiple) "../main.less";  //multiple,允许引入多次相同文件名的文件
@import (multiple) "../main.less";  //multiple,允许引入多次相同文件名的文件

13.1函数库(function)

这个函数库里面很多各种函数,而且内容有点多,有空会补上Less函数库。

金句:不只是学习一门语言,而且要多练习多敲代码,这样才有进步的效果。

欢迎各位大佬评论、点赞和收藏!Thanks

原文地址:https://www.cnblogs.com/phyger/p/14043644.html