随机选择mixin
Randomly pick mixin
我有三个 mixins,每个都包含一个不同的背景图像 SVG,并传递了一种颜色(简化示例):
@mixin svg-1($color) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="foobar"></svg>');
}
@mixin svg-2($color) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="barfoo"></svg>');
}
@mixin svg-3($color) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="blabla"></svg>');
}
然后我尝试通过执行以下操作在编译时随机选择其中的任何三个:
@include svg-#{random(3)}($color);
这给我一个编译错误:
Error: property "#{random(3)}" must be followed by a ':'
我是不是使用了错误的语法,或者这不是处理这个问题的正确方法?
我通过将我的三个 mixin 更改为一个带数字的 mixin 解决了这个问题:
@mixin svg($num, $color) {
@if ($num == 1) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="foobar"></svg>');
}
@if ($num == 2) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="barfoo"></svg>');
}
@if ($num == 3) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="blabla"></svg>');
}
}
然后通过传递这样的随机数来调用:
@include svg(random(3), $color);
尝试使用您想要的 returns 属性 应用的唯一功能。我使用了这段代码:
@mixin svgRandom($color) {
$randomNum : random(3);
@if $randomNum == 1 {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="foobar"></svg>');
} @else if $randomNum == 2 {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="barfoo"></svg>');
} @else if $randomNum == 3 {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="blabla"></svg>');
}
}
并称它为:
@include svgRandom(#00ff00);
好吧,如果你只改变路径,另一种解决方案是将这些路径放在一个列表中,随机取一个(使用 nth()
函数 => 请参阅文档:http://sass-lang.com/documentation/Sass/Script/Functions.html)和把它作为背景图片。
像这样:
$paths: 'foobar', 'barfoo', 'blabla';
@mixin svg($color) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="#{nth($paths, random(length($paths)))}"></svg>');
}
div{
@include svg(purple);
}
如果这样做,您可以在列表中添加任意数量的路径,而不必担心在混入中添加另一个 @if。 :)
我有三个 mixins,每个都包含一个不同的背景图像 SVG,并传递了一种颜色(简化示例):
@mixin svg-1($color) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="foobar"></svg>');
}
@mixin svg-2($color) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="barfoo"></svg>');
}
@mixin svg-3($color) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="blabla"></svg>');
}
然后我尝试通过执行以下操作在编译时随机选择其中的任何三个:
@include svg-#{random(3)}($color);
这给我一个编译错误:
Error: property "#{random(3)}" must be followed by a ':'
我是不是使用了错误的语法,或者这不是处理这个问题的正确方法?
我通过将我的三个 mixin 更改为一个带数字的 mixin 解决了这个问题:
@mixin svg($num, $color) {
@if ($num == 1) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="foobar"></svg>');
}
@if ($num == 2) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="barfoo"></svg>');
}
@if ($num == 3) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="blabla"></svg>');
}
}
然后通过传递这样的随机数来调用:
@include svg(random(3), $color);
尝试使用您想要的 returns 属性 应用的唯一功能。我使用了这段代码:
@mixin svgRandom($color) {
$randomNum : random(3);
@if $randomNum == 1 {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="foobar"></svg>');
} @else if $randomNum == 2 {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="barfoo"></svg>');
} @else if $randomNum == 3 {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="blabla"></svg>');
}
}
并称它为:
@include svgRandom(#00ff00);
好吧,如果你只改变路径,另一种解决方案是将这些路径放在一个列表中,随机取一个(使用 nth()
函数 => 请参阅文档:http://sass-lang.com/documentation/Sass/Script/Functions.html)和把它作为背景图片。
像这样:
$paths: 'foobar', 'barfoo', 'blabla';
@mixin svg($color) {
background-image: url('data:image/svg+xml;utf8,<svg><g fill="#{$color}"><path d="#{nth($paths, random(length($paths)))}"></svg>');
}
div{
@include svg(purple);
}
如果这样做,您可以在列表中添加任意数量的路径,而不必担心在混入中添加另一个 @if。 :)