sass 3.3 以上で使えるようになった map について

2015.10.07

今更ってかんじですが… css 風の書き方で json みたいなデータを作れるようです。
書き方のサンプルはこんなかんじ

$map: (
  key1: value1,
  key2: value2,
  key3: value3,
);
<||

以下はマップを使ったカラーパレットの管理の例です。

>||
$colors: (
  black: #000,
  gray: #888,
  white: #fff,
);

中の値を取り出すには、map-get()を使います。

@function colors($key){
  @return map-get($colors,$key)
};

.hoge{
  color: colors(black); // #000
}

また、データは入れ子にすることも出来ます。
これを使って、色をトーンにわけて管理したり出来ます。

$colors: (
  black: (
    default: #1a1a1a,
    dark: #000,
  ),
  gray: (
    default: #4c4c4c,
    light: #d8d8d8,
  ),
  white: (
    default: #fff,
    dark: #fafafa
  ),
  green: (
    default: #22d3c7
  ),
);

ネストされた中の値を取り出すには、map-get()をネストして使います。

@function colors($key,$tone: default){
  @return map-get(map-get($colors,$key),$tone)
};

.fuga{
  color: colors(black,dark); // #000
}

引用・参考

Sassで色を管理する色々な方法 - QiitaSassの便利な機能のひとつに変数があります。変数にマップや@eachを併用すると、柔軟に色を管理することができたり、自動化させることができます。 変数 まずはシンプルに変数を使ったパターン。 color-faceboo...Qiita

マップ用の関数は、 map-get も含めて5つ。

  • map-get($map, $key)…キーの値を取得する
  • map-merge($map1, $map2)…マップを結合する
  • map-keys($map)…マップのキーをカンマ区切りで返す
  • map-values($map)…マップの値をカンマ区切りで返す
  • map-has-key($map, $key)…マップにキーが含まれているか調べ真偽値を返す

@each を使って、複数クラスを自動生成するという使い方も。

.box {
    $config: (
        warn: red,
        info: blue,
    );
 
    @each $class, $bg-color in $config {
        @at-root #{&}-#{$class} {
            background-color: $bg-color;
        }
    }
}
<||

コンパイルすると以下のようになります。
>||
.box-warn {
  background-color: red;
}
.box-info {
  background-color: blue;
}

引用・参考

Sass 3.3で追加された新しいデータタイプ「マップ」まとめ解説連載: Sass 3.3まとめ解説 (2)前回の記事では、Sass 3.3で追加される「&」の新機能と@at-rootについて解説しました。今回は新しいデータタイプの「マップ」について解説しまHTML5Experts.jp

@each ってグリッド作るときくらいしか使ったことなかったけど、マップと合わせて使うとすごい強力そう。