SASS:如何使用循环生成地图

Vla*_*mir 3 css loops sass sass-maps

我的目标是生成一个SASS map来存储存储在以下地图中的颜色变体:

  $colors : (

    jet                 : #333333,
    wintergreen-dream   : #588C73,
    eton-blue           : #8FC0A9,
    sunglow             : #FFC33C,
    light-kaki          : #F2E394,
    bege                : #FAF3DD

  );
Run Code Online (Sandbox Code Playgroud)

到目前为止,我使用a @function来检索这些变体:

  @function light       ($color, $val) { @return lighten($color, $val);     }
  @function dark        ($color, $val) { @return darken($color, $val);      }
  @function transparent ($color, $val) { @return transparent($color, $val); }
Run Code Online (Sandbox Code Playgroud)


我期望能够生成的地图看起来与以下相似:

  $colors-map : (

    eton-blue : (

        base  : $eton-blue,
        light : lighten($eton-blue, 15%),
        dark  : darken($eton-blue, 15%),
        trans : transparent($eton-blue, .5)


    ),

    jet : (

      base  : $jet,
      light : lighten($jet, 15%),
      dark  : darken($jet, 15%),
      trans : transparent($jet, .5)

    )

    // ...

  );
Run Code Online (Sandbox Code Playgroud)


然而,我已经尝试过应用的循环,如下所示:

@for $key, $value in $colors {}
Run Code Online (Sandbox Code Playgroud)

但是,我天真地相信它可以在地图内部工作.


回答的问题可以更容易地回答这个疑问:

  • 如何将值添加到SASS映射(函数),(键:值)?
  • map-merge/的基本用法map-set?(@return map-merge($map, $new))

严格来说,我正在寻找以下内容:

$alternative-colors : (

    @each $color, $hex in $colors {

        #{$color} : (

            light : lighten($color, 25%),
            dark  : darken($color, 25%)

        );

    }

);
Run Code Online (Sandbox Code Playgroud)

但是,它返回以下错误:

Error: Invalid CSS after \"...tive-colors : (\": expected \")\", was \"@each (...)
Run Code Online (Sandbox Code Playgroud)

结论

很长一段时间过去了,如果我能和其他人分享我的解决方案,我会很高兴.

我创建了一个repo来存储解决问题的结果,https://github.com/vladimirlisovets/SASS-Color-Palettes.

希望它对某人有用,或者激励一些更好的东西.

干杯.

Bla*_*gma 6

$colors : (
  jet                 : #333333,
  wintergreen-dream   : #588C73,
  eton-blue           : #8FC0A9,
  sunglow             : #FFC33C,
  light-kaki          : #F2E394,
  bege                : #FAF3DD
);

$colors-map: ();

@function create_colour_map($color, $percentage, $opacity) {
  $map: (
    base: $color,
    light: lighten($color, $percentage),
    dark: darken($color, $percentage),
    trans: transparentize($color, $opacity)
  );
  @return $map;
}

@each $key, $value in $colors {
  $map: ();
  $map: map-merge($map, ($key: create_colour_map($value, 15%, 0.5)) );
  $colors-map: map-merge($colors-map, $map);
}

@debug $colors-map; //prints out the map below 
  (jet:               (base: #333333, 
                       light: #595959,
                       dark: #0d0d0d,
                       trans: rgba(51, 51, 51, 0.5)), 
   wintergreen-dream: (base: #588C73, 
                       light: #81b099,
                       dark: #3a5d4c,
                       trans: rgba(88, 140, 115, 0.5)),
   eton-blue:          (base: #8FC0A9,
                        light: #c0dccf,
                        dark: #5ea483,
                        trans: rgba(143, 192, 169, 0.5)), 
   sunglow:            (base: #FFC33C,
                        light: #ffdb89,
                        dark: #efa500,
                        trans: rgba(255, 195, 60, 0.5)),
   light-kaki:         (base: #F2E394,
                        light: #faf5d8,
                        dark: #ead150,
                        trans: rgba(242, 227, 148, 0.5)),
   bege:               (base: #FAF3DD,
                        light: white,
                        dark: #f0db9a,
                        trans: rgba(250, 243, 221, 0.5)))
Run Code Online (Sandbox Code Playgroud)

我将你的三个函数合并为一个create_colour_map函数.它需要三个参数colour,percentageopacity.该函数返回一个map

create_colour_map(#333333, 15%, 0.5)用那些args 调用返回一个map

(base: #333333, 
 light: #595959,
 dark: #0d0d0d,
 trans: rgba(51, 51, 51, 0.5)
);
Run Code Online (Sandbox Code Playgroud)

我只是循环遍历$colors地图,每次调用生成一个映射的函数,每次迭代都会成为键的值.

如何向地图添加值以及地图合并的基本用法?

我用来map-merge为a添加值map.正如名称所暗示的那样,它将两个映射连接在一起,因为它是一个函数,所以可以在Sass 期望值的地方使用它.所以以下面的代码为例

$map: ( colour: red);
$new_map: (class: blue);
Run Code Online (Sandbox Code Playgroud)

如果我们想要$map与两个地图具有相同的键和值,我们可以写

$map: map-merge( $map, $new_map); // $map: (colour: red, class: blue)
Run Code Online (Sandbox Code Playgroud)

这基本上是说return函数的值(将两个映射连接在一起)是值$map

简单地说,只需将该行代码视为编程语言中的可变重新分配.这是您可以用来map-merge在地图中设置值的方法.该map-merge方法的第二个参数不需要是预定义的映射变量.它可以这样写

$map: map-merge( $map, (class: blue) );
Run Code Online (Sandbox Code Playgroud)

所以在这里它只是看起来就像是增加了新的keyvalue$map变量