sass中 @each in 循环添加不同的样式

444 阅读2分钟

这几天的项目中给循环的项添加不同的渐变背景,sass的循环好久没用,突然有点生疏了,还是记录一下以备不时之需,避免下次也到处翻找.

我使用的是第一种方法 @each多重分配与映射:比较推荐

效果图:

R4KA4N_K}SX99KZHAM12VK9.png

# scss-@each指令

直接上代码:

  • 这是组件中的循环列表:这里数组navbtnarr中 的id 分别是 0, 1, 2, 循环出来的类名分别是: a0 a1 a2
<view class="navbtn">
    <view @click="btn(item.id)"  :class="'a'+item.id" v-for="item in navbtnarr" :key="item.id">
        <image class="image3" :src="item.src" mode=""></image>
        <view >{{item.text}}</view>
    </view>
</view>
  • 这是scss-style样式:
.navbtn{
    display: flex;
    align-items: center;
    justify-content: space-around;
    margin-top: 32rpx;
    cursor: pointer;
    @include color-divs;  // 使用是写在父级里面的
	.image3{
         width: 48rpx;
         height: 48rpx;
	}
	view{
         font-size: 36rpx;
         color: #fff;
	}
}
  • 这是公共样式:
$colors:(    //注意这里是括号
    0:linear-gradient(rgb(251, 54, 54), rgb(252, 200, 189)),  //颜色渐变
    1:linear-gradient(rgb(252, 183, 44), rgb(252, 207, 178)),
    2:linear-gradient(rgb(14, 130, 254), rgb(193, 223, 251)),
);

@mixin color-divs{    //使用 @include color-divs; 放在下面类名的父级的样式里
    @each $key , $color in $colors {     //注意这里有个逗号(当然不使用逗号也是可以的)
      .a#{$key} {        //拼接变量后的类名分别是 a0, a1, a2,
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        width:216rpx;
        height: 140rpx;
        background: $color;  //背景颜色
        border-radius: 20rpx;
      }
    }
  }

编译后的css结果为:

.a0 {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        width:216rpx;
        height: 140rpx;
        background:linear-gradient(rgb(251, 54, 54), rgb(252, 200, 189));  
        border-radius: 20rpx; 
  }

.a1 {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        width:216rpx;
        height: 140rpx;
        background:linear-gradient(rgb(252, 183, 44), rgb(252, 207, 178)); 
        border-radius: 20rpx; 
  }

.a2 {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        width:216rpx;
        height: 140rpx;
        background: linear-gradient(rgb(14, 130, 254), rgb(193, 223, 251));  
        border-radius: 20rpx; 
  }

第二种方法(没有逗号的) @each指令实例: (这种方法可以更改的样式太少)

公共样式这样写:

@mixin color-divs{    
  @each $color in red, green, yellow, {
    .a#{$color} {    
      background-color: #{$color};
    }
  }
}

或者这样写:
$list:(red, green, yellow);
@mixin color-divs{    
  @each $color in $list {
    .a#{$color} {    
      background-color: #{$color};
    }
  }
}

编译后的css结果为:

.ared {
  background-color: red; }

.agreen {
  background-color: green; }

.ayellow {
  background-color: yellow; }

这里也要循环列表来使用的话,列表每一项的类名也得拼接:这里数组navbtnarr中 的 id 分别就是颜色名字了:red ,green ,yellow

<view class="navbtn">
    <view @click="btn(item.id)"  :class="'a'+item.id" v-for="item in navbtnarr" :key="item.id">
        <image class="image3" :src="item.src" mode=""></image>
        <view >{{item.text}}</view>
    </view>
</view>

第三种方法 @each多重分配 : 比较推荐 可运用于多个样式不同

公共样式这样写:

@mixin color-divs{ 
  @each $color, $border,$radus in (red, solid,50px),
                                   (green, double,30px),
                                   (yellow, dotted,20px){
    .a#{$color} {
      background-color : $color;
      border: $border;
      border-radius: $radus;  
          ......    //这里还可以不断的添加属性样式
    }
  }
}

编译后的css结果为:

.ared {
  background-color :red;
      border: solid;
      border-radius: 50px;
      }

.agreen {
  background-color : green;
      border: double;
      border-radius: 30px; 
  }

.ayellow {
  background-color : yellow;
      border:dotted;
      border-radius: 20px; 
  }