跟我一起了解less(4):函数与混合

讲函数之前先说说我对“混合”的理解,“混合”官网称作mixin,理解为可以把一个集合体嵌入到另一个集合体中、也可以把两个集合体捏合成一个集合体,而这个集合体就称作mixin。

举个例子:.cls { background:#000000;} 这是最常见class选择器的样式,但在less认为,这就是一个mixin。

 

除去上面的废话,先来看看函数的语法:

1、函数(语法:.aaa(参数) { 内容 } ),函数名前一般用类选择器的符号“.”,但我发现用“#”也可以,有兴趣的同学可以多试试

//用法一:
.size() { //没有参数的函数,函数体是样式,调用后直接返回函数体的样式
    width: 50px;
    height: 50px;
}
.func1(@c) { //函数内部可以声明变量,同一作用域内都可以调用
    .size();
    @col: @c;
}
.box-part1 {
    .func1(#F90); //我们给函数传参后,@col就有值了,下面就可以调用@col变量,而函数中的样式.size()会直接显示出来
   
}
.func2(@c:#F30, @bc:#999) { //函数可以有多个参数,参数可以有默认值
    .size();
    background-color: @c;
    border:1px solid @bc;
}
.box-part2 {
    .func2(#045,#0F0); //实参可以少于形参,但一定会是按顺序传入,less中的函数无法指定要传入哪个参数
}
.box-part3 { //我们也可以不传参数,使用参数的默认值
    .func2();
}

 

2、混合(Mixin)

说完函数,再说混合就容易理解了,因为less的函数就是一种混合,所以在很多情况下,如果函数里面的是样式,并且函数没有参数,在调用这个函数的时候是可以不用加括号的,就像上面的“用法一”中 .size(); 等同于 .size; 。

但函数的命名并非是选择器名,但如果把各种选择器以类似于函数的这种用法来使用,这就是Mixin。

//用法二:模拟函数的用法,直接调用
#box1 { //最正常的id选择器
    width:50px;
    height:50px;
   
}
#box2(@w:50px,@h:50px,@c:#0F0) { //选择器加了参数就会变成函数,只能被调用
    width:@w;
    height:@h;
    background-color:@c;
}
#box3 { //让#box3来沿用#box1的样式
    #box1;
}
#box4 {
    #box2(40px,40px,#888); //#box4来调用#box2函数,来使用#box2内部的样式
}

 

//用法三:当选择器一层层包含关系时,可以嵌套使用,也可以嵌套调用
#box5 {
    #box5-sub1{ //指选择#box5里面的#box5-sub1
       
    }
    .box5-sub-part { //也可以嵌套不同的选择器
        width:25px;
        height:25px;
        background-color:#F10;
    }
    #box5-sub3{
        #box5-sub1; //嵌套的选择器也可以互相调用
    }
}

 

3、作用域

less中的变量和函数也可以在指定作用域中使用,下面我举几个案例

//用法四:函数调用
.space { // .space 并不是一个类,而是定义的一个作用域
    .size() { //.size() 函数是在 .space域中的
        @width:50px;
        @height:50px;
    }
}
.box-part1 {
    .size(); // 这是在.space作用域外调用.size()函数
    width:@width; //并使用函数中的变量值
    height:@height;
}

结果会提示报错,因为.size()找不到,当我稍微改动一下 .size() 的调用,如下:
.box-part1 {
    .space > .size(); //通过 “>” 符号来指定作用域中的方法,就可以调用了
    width:@width;
    height:@height;
}

 

//用法五:作用域对变量的影响

@height:25px;
.space-box {
    .space {
        .size {
            @width:50px; //作用域中的值=50
            @height:50px;
        }
    }
}
@width:25px; //作用域外的值=25
.box-part2 {
    width:@width; //取的是作用域外的值=25
    height:@height;
   
}
.box-part3 {
    .space-box > .space > .size;
    width:@width; //取的是作用域中的值=50
    height:@height;
    background-color: aquamarine;
}
.box-part4 {
    width:@width;
    height:@height; //作用域中的变量@height被赋值并不影响作用域外@height的值,仍然=25
    background-color: aquamarine;
}

 

总结:因为有作用域的约束,我们就可以大胆的使用less了,也不用担心多个人开发项目时对于变量重名所遇到的风险

作用域表示方法:官方给出了下面几种写法,但总体来说就是“>”加不加都行(但我认为为了增加代码可读性建议加上符号)

#outer > .inner;

#outer > .inner();

#outer.inner;

#outer.inner();

 

 

to be continue ....

 
posted @ 2017-05-10 14:53  冉夜  阅读(632)  评论(0编辑  收藏  举报