当前位置:   article > 正文

less中混合和嵌套详解_less混合函数

less混合函数

目录

1.混合(Mixin)

1.1 Mixin的定义

1.2 Mixin的定义

1.3 调用混合

1.4 less可以直接继承在其他选择器中的样式

1.5 Mixin的默认值与不定参

1.6 Mixin的判断条件

1.7 模式匹配

2.嵌套(重要)

2.1 嵌套的定义

2.2 使用嵌套的优势

2.3 使用示例


1.混合(Mixin)

1.1 Mixin的定义

Mixin在less官网中的定义为:混合(Mixin)是一种将一组属性从一个规则集包含(或混入)到另一个规则集的方法。

但我感觉这个说法有点难理解,我们可以简单的理解就是函数,可以封装CSS代码,在别的选择器中调用,提高代码的重用性和可维护性.

Mixins 有点像函数,在定义后,可以通过名称调用.(也支持动态传参)

混合可以将一个定义好的class A 轻松 的引入到另一个class B 中,从而简单实现class B继承class A 中的所有属性,我们还可以带参数地调用,就像使用函数一样

先看一个简单的示例:

  1. .color {
  2. background-color:#58a;
  3.    color:18px;
  4. }

应用这个类(class)

  1. .box {
  2. width:100px;
  3. height:50px;
  4. .color();
  5. }
  6. .wrap {
  7. width:100px;
  8. height:50px;
  9.    border:1px solid red;
  10. .color();
  11. }

通过这种方式就可以将color这个类应用到.box和.wrap中了..

接下来我们来详细的看一下Mixins的定义与调用等的具体方法.

1.2 Mixin的定义

混合有两种定义方式,一种是参数的定义,另一种是有参数的定义.

  • 无参数的定义

.混合名() {

封装的css代码

}

  • 有参数的定义

.混合名(@参数1:参数的默认值,@参数2:参数的默认值......) {

封装的css代码

}

1.3 调用混合

语法

选择器{

混合名(@参数)

}

  1. // 使用混入
  2. @baseColor: #369;
  3. .box p {
  4.  .error(@baseColor, 30px)
  5. }

调用示例

值得注意的是在没有参数的情况下,不加括号也可以调用.

  1. .size {
  2.    width: 100px;
  3.    height: 100px;
  4.    border:1px solid green;
  5. }
  6. #box{
  7.    .size(); //加括号调用
  8.    background-color: #58a;
  9. }
  10. .wrap {
  11.    .size; //没有参数的情况下不加括号也可以
  12.    background-color: skyblue;
  13. }

如果Mixin需要动态参数,则必须加括号传参:

  1. .init(@width,@height,@color) {
  2.    width:@width;
  3.    height: @height;
  4.    color:@color;
  5. }
  6. @width:200px;
  7. @height:200px;
  8. @color:red;
  9. .box1{
  10.    .init(@width, @height, @color);
  11.    background-color: skyblue;
  12. }
  13. .wrap {
  14.    .init(300px,100px,red);
  15.    border:1px solid blue;
  16. }

结果如下:

 

1.4 less可以直接继承在其他选择器中的样式

  1. .box {
  2. width:100px;
  3. height:100px;
  4. color:white;
  5. }
  6. .wrap {
  7. .box; //.wrap会直接继承.box中已写的样式
  8. backgorund-color:blue;
  9. }

 Mixin中除了写样式选择器,还可以写变量

  1. //Mixin里除了可以写样式,选择器, 还可以写变量
  2. .mixin() {
  3.  @width:  100%;
  4.  @height: 200px;
  5. }
  6. .box1 {
  7.  .mixin();
  8.  width:  @width;
  9.  height: @height;
  10.  border:1px solid red;
  11. }

Mixin除了返回变量,还可以返回Mixin. 

  1. // Mixins 里除了返回变量,还可以返回Mixins
  2. #box(@color){
  3.   .wrap(){
  4.       width:500px;
  5.       height:100px;
  6.       background:@color;
  7.   }
  8. }
  9. .box1{
  10.   #box(red); // 执行第一个Mixin是为了能够使用里面的Mixin
  11.   .wrap();   // 第二个执行Mixin里面的Mixin
  12. }

3.5 可以在Mixin中使用选择器

  1. .hover(@color){
  2.    &:hover{
  3.        background:@color;
  4.   }
  5. }
  6. .wrap{
  7.    width: 100px;
  8.    height: 100px;
  9.    background: red;
  10.    &:hover > span{  //注意在此处的&与冒号之间不能有空格,等价 于.wrap:hover >span
  11.        background:skyblue;
  12.   }
  13.    // .hover(skyblue)   //如果只是当前元素添加hover效果,而不是给当前元素的子元素或兄弟元素添加,那么&可省略
  14.    
  15. }

单独为box元素添加hover样式

  1. .hover(@color){
  2.    &:hover{
  3.        background:@color;
  4.   }
  5. }
  6. .box1{
  7.    width: 200px;
  8.    height: 200px;
  9.    margin-top:20px;
  10.    background: skyblue;
  11.    &:hover{
  12.        background:red;
  13.   }
  14.    // .hover(red);   //上下两种弄方式等效
  15. }

1.5 Mixin的默认值与不定参

  • 默认值:

mixin中可以使用默认值,如果在没有传入参数的时候,则会使用默认值.

如果不设置默认值,MIxin的值在没有参数的情况下就会报错,且传参时实参的个数必须与设置的默认值的个数相等.

  1. .size(@width : 100px, @height : 100px , @color : pink){
  2.    width: @width;
  3.    height: @height;
  4.    background-color: @color;
  5. }
  6. .box1 {
  7.    .size(50px,50px,#58a);   //使用自己所传入的参数
  8.    border:3px solid pink;
  9. }
  10. .wrap {
  11.    .size;   //使用已经设置的默认参数
  12.    color:#fff;
  13. }
  • 不定参

​...就是@reset剩余参数,会将剩余的所有参数都加到@arguments中

  1. // ... 就是@reset 剩余参数, 会将剩余的所有参数都加到@arguments里
  2. .boxShadow(...){
  3.    box-shadow: @arguments;
  4. }
  5. .box1{
  6. .boxShadow(1px,4px,30px,red);
  7. }
  8. // @arguments是处理第一个实参外的所有实参的集合
  9. .boxShadow(@width,...){
  10.    box-shadow: @arguments;
  11. }
  12. .wrap{
  13. .boxShadow( 50px,1px,4px,30px,red);
  14. }

编译成css之后的结果:

  1. .box1 {
  2.  box-shadow: 1px 4px 30px red;
  3. }
  4. .wrap {
  5.  box-shadow: 50px 1px 4px 30px red;
  6. }

1.6 Mixin的判断条件

Less没有if / else 但是less具有一个when,and,not与“,”语法。

1. when 表示 在使用Mixin的时候必须满足 when后面的条件

  1. #box(@width, @height, @color) when (@width > 100px){
  2.    width: @width;
  3.    height: @height;
  4.    background-color: @color;
  5. }
  6. .box{
  7.    #box(101px,50px,pink)
  8. }

2. 如果有两个必须同时满足的条件,使用 and

  1. // 这里必须满足传递的宽度和颜色必须同时同满足条件才能执行Mixin
  2. #box(@width, @height, @color) when (@width > 100px) and (@color = pink){
  3.    width: @width;
  4.    height: @height;
  5.    background-color: @color;
  6. }
  7. .box{
  8.    #box(100px,50px,skyblue)
  9. }

3. 如果需要排除某个条件才能使用Mixin,使用not

  1. // 这里排除颜色为pink ,除了pink颜色值都可以运行Mixin
  2. #box(@width, @height, @color) when  not (@color = pink){
  3.    width: @width;
  4.    height: @height;
  5.    background-color: @color;
  6. }
  7. .box{
  8.    #box(100px,50px,skyblue)
  9. }

4. 如果需要多个条件只要满足一个就执行Mixin,使用 逗号,

  1. // 虽然不满足宽度大于等于100px,但是满足为了颜色是skyblue 所以Mixin会执行
  2. #box(@width, @height, @color) when (@width >= 100px),(@color = skyblue){
  3.    width: @width;
  4.    height: @height;
  5.    background-color: @color;
  6. }
  7. .box{
  8.    #box(50px,50px,skyblue)
  9. }

1.7 模式匹配

根据条件进行样式显示,类似JS中的switch,有些情况下,我们想根据传入的参数来改变混合的默认呈现.

比如:

相当于定义一个相同的混合名称,根据传入其他混合名称的不同,执行不同混合分,但是有一个公共的分支,任何一个分支都会调用

@_ 表示匹配所有,通常用于定义公共部分

语法:

模式匹配的定义

公共部分

.fun (@_, @color){

// 任何分支都会执行的公共部分

}

.fun( s1,@color){

// s1 分支独有代码

}

 

模式匹配的使用

h1{

.fun(s2, @color)

}

  1. // 三角形公用代码
  2. .sjx(@_, @color, @size) {
  3.    width: 0;
  4.    left: 0;
  5.    display: block;
  6.    border: @size solid transparent;
  7. }
  8.  
  9.  // 左三角形
  10.  .sjx(l, @color, @size) {
  11.    border-left-color: @color;
  12. }
  13.  
  14.  // 右三角形
  15.  .sjx(r, @color, @size) {
  16.    border-right-color: @color;
  17. }
  18.  
  19.  // 上三角形
  20.  .sjx(t, @color, @size) {
  21.    border-top-color: @color;
  22. }
  23.  
  24.  // 下三角形
  25.  .sjx(b, @color, @size) {
  26.    border-bottom-color: @color;
  27. }
  28.  
  29. .trangle1 {
  30. .sjx(t,#00a8ff, 20px) //通过传入不同的参数来产生不同方向的三角形
  31. }
  32. .trangle2 {
  33. .sjx(b, pink, 20px)
  34. }
  35. .trangle3 {
  36. .sjx(r, purple, 20px)
  37. }
  38. .trangle4 {
  39. .sjx(l,#4cd137, 20px)
  40. }

 

2.嵌套(重要)

2.1 嵌套的定义

具有层级关系的CSS样式,CSS的层级是有HTML的结构决定的.

2.2 使用嵌套的优势

  1. 用在具有后代关系和父子 关系的选择器中

  2. 减少代码量,

  3. 代码结构更加清晰

2.3 使用示例

  1. .border {
  2.    border:1px solid #58a;
  3. }
  4. .container {
  5.    width: 200px;
  6.    height: 300px;
  7.    .border();
  8.    ul {
  9.        list-style: none;
  10.        padding:0;
  11.        margin:0;
  12.        .border();
  13.        li {
  14.            width: 100px;
  15.            height: 80px;
  16.            background-color: khaki;
  17.            margin-top:20px;
  18.            span {
  19.                font-size: 20px;
  20.                color:green;
  21.           }
  22.       }
  23.   }
  24.    .box {
  25.        width: 200px;
  26.        height: 50px;
  27.        .border();
  28.        margin-top:30px;
  29.        background-color: lightcoral;
  30.   }
  31. }

编译之后的css代码:

  1. .border {
  2.  border: 1px solid #58a;
  3. }
  4. .container {
  5.  width: 200px;
  6.  height: 300px;
  7.  border: 1px solid #58a;
  8. }
  9. .container ul {
  10.  list-style: none;
  11.  padding: 0;
  12.  margin: 0;
  13.  border: 1px solid #58a;
  14. }
  15. .container ul li {
  16.  width: 100px;
  17.  height: 80px;
  18.  background-color: khaki;
  19.  margin-top: 20px;
  20. }
  21. .container ul li span {
  22.  font-size: 20px;
  23.  color: green;
  24. }
  25. .container .box {
  26.  width: 200px;
  27.  height: 50px;
  28.  border: 1px solid #58a;
  29.  margin-top: 30px;
  30.  background-color: lightcoral;
  31. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/1012416
推荐阅读
相关标签
  

闽ICP备14008679号