【问题标题】:How to use SCSS variables in combination with @each directive如何结合使用 SCSS 变量和 @each 指令
【发布时间】:2017-03-07 15:51:07
【问题描述】:

我正在尝试重写一些 SCSS 以减少下面编写的重复代码...

.bg-primary {
   background: $primary;
}
.bg-secondary {
   background: $secondary;
}
.bg-tertiary {
   background: $tertiary;
}

...到这样的事情:

$colors: primary secondary tertiary;

@each $color in $colors {
   .bg-#{$color}{
      background: $color;
   }
}

但问题是background: $color 将输出background: primary; 而不是background: $primary;,而他应该将其处理为background: #000;。关于如何使这项工作的任何想法?谢谢!

【问题讨论】:

    标签: sass


    【解决方案1】:

    一种方法是使用键值对定义颜色映射。然后可以将键用作类名的一部分:

    $colors: (primary: #000, secondary: #f00, tertiary: #00f);
    
    @each $colorkey, $value in $colors {
       .bg-#{$colorkey}{
          background: $value;
       }
    }
    

    要在其他地方使用颜色,您必须使用

    .example {
      color: map-get($colors, tertiary);
    }
    

    在某些情况下,颜色值已经定义,例如通过一个底层框架。可以在地图中使用之前定义的颜色,但是如果您想在循环中使用单个变量(重复的变量名称),这当然会带来一些您无法避免的冗余:

    $primary: #000;
    $secondary: #f00;
    $tertiary: #00f;
    
    $colors: (primary: $primary, secondary: $secondary, tertiary: $tertiary);
    /* loop see above... */
    

    另一方面,这使得在其他地方访问颜色变得更加容易。

    【讨论】:

    • 感谢您对此进行调查。您的解决方案有效,但对我来说不是很自然。你知道一种简单地在 $color 输出中添加 $ 符号的方法吗?类似background: $#{$color}。
    • 我完全理解你,如果有一种方法可以引用动态创建的变量,那就太好了。在发布答案之前,我查看了规范并进行了快速研究,但我找不到任何对这种情况有用的东西。我所知道的是这个问题出现了多次already several years ago,它曾经通过使用列表解决,然后使用后来引入的地图。
    • 我将把它标记为答案,因为似乎没有其他方法,而且这个解决方案使它稍微干净一些。谢谢Marvin
    猜你喜欢
    • 2013-05-05
    • 2017-03-15
    • 2020-01-09
    • 2020-03-28
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2018-01-08
    • 2021-03-17
    相关资源
    最近更新 更多