【问题标题】:Randomly pick mixin随机选择mixin
【发布时间】:2018-09-10 15:39:01
【问题描述】:

我有三个 mixin,每个都由一个不同的背景图像 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 ':'

我在这里使用了错误的语法还是这不是处理这个问题的正确方法?

【问题讨论】:

    标签: sass mixins scss-mixins


    【解决方案1】:

    好吧,如果您只更改路径,另一种解决方案是将这些路径放在一个列表中,随机取一个(使用 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);
    }
    

    如果这样做,您可以在列表中添加任意数量的路径,而不必担心在您的 mixin 中添加另一个 @if。 :)

    【讨论】:

      【解决方案2】:

      我通过将我的三个 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);
      

      【讨论】:

      • 如果你只改变一个路径,你可以在没有任何@if的mixin中使用nth($path, random(length($path)))来做一个路径列表。
      • @ReSedano 你的建议会给我一个比接受的答案更好的解决方案。您可能需要考虑将其作为解决方案发布,以便读者可以查看我认为更好的替代解决方案。
      • 你说得对,@B68C。我也补充一下我的想法。感谢您的考虑。 :)
      【解决方案3】:

      尝试使用返回您希望应用的属性的唯一函数。我使用了这个代码:

      @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);
      

      【讨论】:

      • 谢谢 Kike,我更喜欢这个解决方案,而不是我想出的解决方案,因为它是 DRY-er
      猜你喜欢
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 2017-07-14
      • 2011-06-30
      • 2011-04-16
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      相关资源
      最近更新 更多