首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动生成的sass映射

自动生成的sass映射
EN

Stack Overflow用户
提问于 2018-01-30 11:21:58
回答 1查看 158关注 0票数 0

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

我有一张名为$品牌颜色的颜色地图,我希望这张地图的颜色能在第二张地图中生成颜色和色调,不管有多少种颜色在$品牌颜色中。

这就是我到达的地方:

代码语言:javascript
复制
$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;

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

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

总之,只取了第一个键值对,我不明白为什么.有人能给我一个答案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-30 22:12:01

函数和返回语句

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

代码语言:javascript
复制
@function myFunction() {
    @each $item in [a, b, c, d] {
        @return $item;
    }
}

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

在功能结束时返回一次的最佳实践

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

代码语言:javascript
复制
@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变量。

代码语言:javascript
复制
@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;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48520177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档