【问题标题】:Auto generated sass maps自动生成的 sass 地图
【发布时间】:2018-07-09 06:21:51
【问题描述】:

我正在尝试生成一个自动化系统来定义 SASS 中的颜色。

我有一张名为 $brand-colors 的颜色地图,我希望这张地图的颜色用于在第二张地图中生成色调和阴影,无论 $brand-colors 中有多少种颜色.

这是我到达的地方:

$brand-colors: (
  brand-color: (
    primary-color:        #0096d6,
    secondary-color:      #1a4760,
  ),
) !default;

@function generate-map($map) {
  @each $item, $colors in $map {
    @each $color-name, $value in $colors {
      @return(
        $color-name: (
          light-30:   mix(white, $value, 30%),
          light-20:   mix(white, $value, 20%),
          light-10:   mix(white, $value, 10%),
          base:       $value,
          dark-10:    mix(black, $value, 10%),
          dark-20:    mix(black, $value, 20%),
          dark-30:    mix(black, $value, 30%),
        ),
      );
    };
  };
};

$brand-palette: (
  brand-palette:(
    generate-map($_new-brand-colors)
  ),
) !default;

使用上面的代码,我从终端得到这个结果:

brand-palette:(
  primary-color:(
    light-30: #4db6e2,
    light-20: #33abde,
    light-10: #1aa1da,
    base: #0096d6,
    dark-10: #0087c1,
    dark-20: #0078ab,
    dark-30: #006996
  )
)

总之,只取第一个键值对,不明白为什么。 谁能给我答案?

【问题讨论】:

    标签: sass sass-maps


    【解决方案1】:

    函数和返回语句

    @return 语句告诉函数停止一切返回值。

    @function myFunction() {
        @each $item in [a, b, c, d] {
            @return $item;
        }
    }
    

    myFunction() 只会返回a。即使我们有一个包含四个项目的循环,它也只会运行一次(第一次),因为它会立即命中 @return 语句。


    函数结束时返回一次的最佳实践

    函数的一个最佳实践是有一个$result 变量,并且只在函数的结尾调用@return $result一次

    @function myFunctionFixed() {
        $result;
        @each $item in [a, b, c, d] {
            $result: $result + a;
        }
        @return $result;
    }
    

    myFunctionFixed() 将返回 abcd,因为我们允许循环从头到尾运行而不会被 @return 打断,并且我们只在循环完成后在函数结束时返回。


    使用map-merge 增量构建地图

    应用上述最佳实践,我们可以将@return 语句移至函数末尾,并使用map-merge 逐步构建$result-map 变量。

    @function generate-map($map) {
        $result-map: () !default;
        @each $item, $colors in $map {
            @each $color-name, $value in $colors {
                $result-map: map-merge($result-map, 
                    ($color-name: (
                      light-30:   mix(white, $value, 30%),
                      light-20:   mix(white, $value, 20%),
                      light-10:   mix(white, $value, 10%),
                      base:       $value,
                      dark-10:    mix(black, $value, 10%),
                      dark-20:    mix(black, $value, 20%),
                      dark-30:    mix(black, $value, 30%),
                    ))
                );
            };
        };
        @return $result-map;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 2017-03-06
      • 2017-08-16
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 2011-06-10
      相关资源
      最近更新 更多