blog
SCSSでカラーコードを管理する関数を作る
この記事は書かれてから1年以上経過しており、内容が古い場合があります。
はじめに
関数といってもとても簡単なもので配列で管理したカラーコードをmap-get()
で取得します。色の変更も容易になり、管理しやすくなります。
関数の定義
5行だけ、とっても簡単。
@function palette( $palette_name, $tone_name: 'base' ) {
$palette: map-get( $palettes, $palette_name );
$torn: map-get( $palette, $tone_name );
@return $torn;
}
カラーコード
カラーコードは$palettes
に定義します。
配列でグループ名を定義して連想配列で色名とカラーコードを指定します。base
がデフォルト値です。
$palettes: (
'typo': (
'base': #444,
'inverse': #eee
),
'anchor': (
'base': #82baff,
'inverse': #9ae7f0
),
'bg': (
'base': #242b33,
'dark': #131519,
'light': #374251,
'inverse': #fafafa
)
);
使う
引数にグループ名(必須)、色名(オプション)を指定します。
div {
background: palette( 'bg' );
}
CSSは以下のようになります。
div {
background: #242b33;
}
色名を指定した場合
第2引数に色名を指定します。
div {
background: palette( 'bg', 'inverse' );
}
CSSは以下のようになります。
div {
background: #fafafa;
}
第3引数にdarkenやlightenを指定できるようにして、指定色から少し暗い、明るい色も取得できるようになるとシャドウやボーダー指定に便利かもしれません。
おまけ
HSBでHueを基準にしたカラーパレットを作ったけど、それほど使い勝手も良くなかった。とりあえず参考資料として載せておきます。HSBへの変換とかブレンドモード、アルファ指定ができるので、こっちの方が高機能です。
関数(hsb_palette)
HSVへの変換はhsvtohsl.scssを参考にしています。
@function hsb_palette( $palette_name, $tone_name: 'base', $blending: 'normal', $degree: 0, $alpha: 1.0 ) {
//get torn
$palette: map-get( $hsb_palettes, $palette_name );
$torns: map-get( $palette, 'torn' );
$torn: map-get( $torns, $tone_name );
//get hsb
$hue: map-get( $palette, 'hue' );
$saturation: map-get( $torn, 's' );
$brightness: map-get( $torn, 'b' );
//blending
@if $blending == 'burn' {
$saturation: $saturation + $degree;
$brightness: $brightness - $degree;
} @else if $blending == 'dodge' {
$saturation: $saturation - $degree;
$brightness: $brightness + $degree;
} @else if $blending == 'desaturate' {
$saturation: $saturation - $degree;
} @else if $blending == 'saturate' {
$saturation: $saturation + $degree;
} @else if $blending == 'lighten' {
$brightness: $brightness + $degree;
} @else if $blending == 'darken' {
$brightness: $brightness - $degree;
}
//round
@if $saturation > 100% {
$saturation: 100%;
} @else if $saturation < 0% {
$saturation: 0%;
}
@if $brightness > 100% {
$brightness: 100%;
} @else if $brightness < 0% {
$brightness: 0%;
}
//convert hsl
$hsl: hsb_to_hsl( $hue, $saturation, $brightness );
@return hsla( nth($hsl, 1), nth($hsl, 2), nth($hsl, 3), $alpha);
}
@function hsb_to_hsl($h, $s: 0, $b: 0) {
@if type_of($h) == 'list' {
$b: nth($h, 3);
$s: nth($h, 2);
$h: nth($h, 1);
}
@if unit($h) == 'deg' {
$h: 3.1415 * 2 * ($h / 360deg);
}
@if unit($s) == '%' {
$s: 0 + ($s / 100%);
}
@if unit($b) == '%' {
$b: 0 + ($b / 100%);
}
$ss: $s * $b;
$ll: (2 - $s) * $b;
@if $ll <= 1 {
$ss: $ss / $ll;
} @else if ($ll == 2) {
$ss: 0;
} @else {
$ss: $ss / (2 - $ll);
}
$ll: $ll / 2;
@return 360deg * $h / (3.1415 * 2), percentage(max(0, min(1, $ss))), percentage(max(0, min(1, $ll)));
}
カラーパレット
/*
$hsb_palettes: (
'name': (
hue : 0deg,
torn: (
'2x-light' : ( s: 0%, b: 10% ),
'x-light' : ( s: 0%, b: 10% ),
'light' : ( s: 0%, b: 10% ),
'mid-light' : ( s: 0%, b: 10% ),
'base' : ( s: 0%, b: 10% ),
'mid-dark' : ( s: 0%, b: 10% ),
'dark' : ( s: 0%, b: 10% ),
'x-dark' : ( s: 0%, b: 10% ),
'2x-dark' : ( s: 0%, b: 10% )
)
),
*/
$hsb_palettes: (
'mono': (
hue : 0deg,
torn: (
'2x-light' : ( s: 0%, b: 95% ),
'x-light' : ( s: 0%, b: 85% ),
'light' : ( s: 0%, b: 70% ),
'mid-light' : ( s: 0%, b: 60% ),
'base' : ( s: 0%, b: 50% ),
'mid-dark' : ( s: 0%, b: 40% ),
'dark' : ( s: 0%, b: 30% ),
'x-dark' : ( s: 0%, b: 15% ),
'2x-dark' : ( s: 0%, b: 5% )
)
),
'bg': (
hue : 210deg,
torn: (
'asphalt' : ( s: 45%, b: 37% ),
'midnight' : ( s: 45%, b: 31% ),
'dark' : ( s: 45%, b: 25% )
)
),
'board': (
hue : 192deg,
torn: (
'cloud' : ( s: 2%, b: 95% ),
'silver' : ( s: 5%, b: 78% ),
'concrete' : ( s: 10%, b: 65% ),
'asbestos' : ( s: 10%, b: 55% )
)
),
'red': (
hue : 6deg,
torn: (
'base' : ( s: 74%, b: 91% )
)
),
'orange': (
hue : 32deg,
torn: (
'base' : ( s: 79%, b: 95% )
)
),
'yellow': (
hue : 47deg,
torn: (
'base' : ( s: 94%, b: 95% )
)
),
'lime': (
hue : 85deg,
torn: (
'base' : ( s: 75%, b: 87% )
)
),
'green': (
hue : 138deg,
torn: (
'base' : ( s: 76%, b: 83% )
)
),
'emerald': (
hue : 161deg,
torn: (
'base' : ( s: 78%, b: 87% )
)
),
'cyan': (
hue : 186deg,
torn: (
'base' : ( s: 76%, b: 88% )
)
),
'aqua': (
hue : 202deg,
torn: (
'base' : ( s: 68%, b: 89% )
)
),
'blue': (
hue : 219deg,
torn: (
'base' : ( s: 71%, b: 89% )
)
),
'deepblue': (
hue : 234deg,
torn: (
'base' : ( s: 70%, b: 84% )
)
),
'violet': (
hue : 268deg,
torn: (
'base' : ( s: 72%, b: 88% )
)
),
'purple': (
hue : 288deg,
torn: (
'base' : ( s: 65%, b: 88% )
)
),
'winered': (
hue : 340deg,
torn: (
'base' : ( s: 69%, b: 92% )
)
),
);
以上、SCSSを使ったカラーコードの管理でした。