问题描述
如何使用 @each循环
显示具有HEX和RGB格式的调色板调色板变量:
$colors: (
"transparent": transparent,"current": currentColor,"white": (
hex: #FFFFFF,rgb: (255,255,255)
),"black": (
hex: #000000,rgb: (0,0)
)
) !default;
编译为CSS后的预期结果:
.color-transparent {
color: transparent;
}
.color-current {
color: currentColor;
}
.color-white {
--color-opacity: 1;
color: #FFFFFF;
color: rgba(255,var(--color-opacity));
}
.color-black {
--color-opacity: 1;
color: #000000;
color: rgba(0,var(--color-opacity));
}
解决方法
这是您使用@each
和地图的方式。
$colors: (
"transparent": transparent,"current": currentColor,"white": (
hex: #FFFFFF,rgba: (255,255,var(--color-opacity))
),"black": (
hex: #000000,rgba: (0,var(--color-opacity))
)
) !default;
// $COLOR = KEY,$VALUE = VALUE,$COLORS = MAP
@each $color,$value in $colors {
// SINGLE VALUE
@if $color == "transparent" {
.color-#{$color} {
color: #{$value};
}
} @else if $color == "current" {
.color-#{$color} {
color: $value;
}
// SUBMAP - SINCE $VALUE IS ANOTHER MAP HERE.
} @else {
// SET THE COLOR NAME
.color-#{$color} {
// SET YOUR COLOR OPACITY
--color-opacity: 1;
// LOOP THROUGH THE TWO COLORS IN THE SUBMAP
@each $color_name,$value_c in $value {
@if $color_name == hex {
color: $value_c;
} @else {
color: rbga( $value_c );
}
}
}
}
}
CSS输出
.color-transparent {
color: transparent;
}
.color-current {
color: currentColor;
}
.color-white {
--color-opacity: 1;
color: #FFFFFF;
color: rbga(255,var(--color-opacity));
}
.color-black {
--color-opacity: 1;
color: #000000;
color: rbga(0,var(--color-opacity));
}
编辑RGBA()函数问题
要解决如果rgba()
引发频道错误的问题,可以在@else
部分后面删除hex
,并将十六进制值传递到rgba()
函数中。这会将十六进制转换为rgb值。
$colors: (
"transparent": transparent,$value in $colors {
// SINGLE VALUE
@if $color == "transparent" {
.color-#{$color} {
color: #{$value};
}
} @else if $color == "current" {
.color-#{$color} {
color: $value;
}
// SUBMAP - SINCE $VALUE IS ANOTHER MAP HERE.
} @else {
// SET THE COLOR NAME
.color-#{$color} {
// SET YOUR COLOR OPACITY
--color-opacity: 1;
// LOOP THROUGH THE TWO COLORS IN THE SUBMAP
@each $color_name,$value_c in $value {
// WE ONLY WANT TO USE HEX,BECAUSE RGBA() IS A NATIVE FUNCTION
@if $color_name == hex {
color: $value_c;
color: rgba( $value_c,var(--color-opacity));
}
}
}
}
}