Slide 1

Slide 1 text

CSS Custom Properties 実践⼊⾨ フロントエンド交流会 - 2019/07/04 ダーシノ(@bc_rikko)

Slide 2

Slide 2 text

⾃⼰紹介 ダーシノ(@bc_rikko) さくらインターネット フロントエンドエンジニア ファミコン⾵CSSフレームワーク NES.css 世界ランク 4位 ※GitHub css-frameworkトピックしらべ

Slide 3

Slide 3 text

話すこと 1. CSS変数の概要 2. メリット・デメリット 3. CSS変数 vs プリプロセッサ変数 4. JavaScriptで操作 5. CSS変数 実践⼊⾨ CSS Custom Propertiesを「CSS変数」 SassやStylusなどの変数を「プリプロセッサ変数」と呼ぶ

Slide 4

Slide 4 text

概要 • CSS Custom Properties(CSS Variables)は、プロ グラミングの変数と同様の機能をCSSで使う仕組み • CSSプリプロセッサの変数とは違う!(後述) /* 宣⾔ */ [selector] { --variable: value; } /* 使⽤ */ [selector] { property: var(--variable); }

Slide 5

Slide 5 text

概要 • CSS変数は⼦要素にも影響する • 要素にCSS変数がない場合は、親要素の値を使う
.parent { --color: black; --bg-color: white; color: var(--color); background-color: var(--bg-color); } .child { --color: red; color: var(--color); background-color: var(--bg-color); }

Slide 6

Slide 6 text

プリプロセッサ変数との違い // SCSS $color: black; .message { color: $color; } // コンパイル後 .message { color: black; } // CSS変数 :root { --color: black; } .message { color: var(--color); } CSS変数 プリプロセッサ変数 宣⾔ :rootやセレクタ内のみ どこでもOK 変数の値 動的(実⾏時に決定) 静的(変数は消える) 構⽂

Slide 7

Slide 7 text

メリット・デメリット • 疑似クラスやメディアクエリ内で動的に変更できる • JavaScriptで簡単に変更できる • テーマ変更のような操作が楽 • 実⾏時にCSS変数の中⾝が決まるので複雑になりやすい • CSS変数がどこに影響するか分かりづらく保守しづらい • CSS変数を書き換えたら他の要素にも影響する • ファイルサイズがちょっと増える(var(̶variable)と書くため) メリット デメリット

Slide 8

Slide 8 text

CSS変数とプリプロセッサ変数 の使い分け • 可能な限りプリプロセッサ変数を使う • 何も考えずにCSS変数に置き換えるのは危険 • 特にグローバルで静的な値はプリプロセッサ変数を使う • 擬似クラス、メディアクエリで動的に変更したいなど、
 明確な理由があるときはCSS変数を使う

Slide 9

Slide 9 text

使い分けの具体例 $size-s: 1em; $size-m: 1.5em; $size-l: 2em; .btn { --button-size: #{$size-s}; } @media screen and (min-width: 600px) { .btn { --button-size: #{$size-m}; } } @media screen and (min-width: 1200px) { .btn { --button-size: #{$size-l}; } } .btn { font-size: var(--button-size); } グローバルで静的な変数(定数) メディアクエリで 動的に変更したい ボタンのスタイル

Slide 10

Slide 10 text

JSでCSS変数を扱う document .querySelector(':root') .style .setProperty('--button-size', '10px'); CSS変数をJavaScriptで動的に変更し、複数のスタイルに⼀括適⽤する | Black Everyday Company https://kuroeveryday.blogspot.com/2018/03/change-css-valiables-by-javascript.html

Slide 11

Slide 11 text

CSS変数 実践⼊⾨ • NES.css@next(次バージョンのProposals段階)
 https://github.com/nostalgic-css/NES.css/issues/331 • スタイルが複雑で、テーマ⾊を変えるのが⼤変 • CSS変数をベースにフレキシブルな
 CSSフレームワークを⽬指す

Slide 12

Slide 12 text

NES.cssの使いづらいところ①

NES.css@next

Default theme.

NES.css@next

If you want to change the theme color.

.my-theme { background-color: #98E800; }

Slide 13

Slide 13 text

根が深い(詳細度問題)

NES.css@next

/* NG */ .my-theme .title { background-color: #98E800; } .my-theme .nes-container > .title { background-color: #98E800; } /* OK */ .my-theme .nes-container.with-title > .title { background-color: #98E800; } 詳細度が低くて適⽤されない

Slide 14

Slide 14 text

CSS変数で解決

NES.css@next

...

.my-theme { --background-color: #98E800; } // NES.css .nes-container { &.with-title { > .title { background-color: var(--background-color); } } }

Slide 15

Slide 15 text

CSS変数の副作⽤ 顧客が必要だったもの プログラマのコード

NES.css@next

If you want to change the theme color.

Learn more!
.my-theme { --background-color: #98E800; } ⼦要素にも適⽤される

Slide 16

Slide 16 text

NES.cssの使いづらいところ② Normal My Theme .nes-btn.my-theme { color: white; background-color: #5676E7; } 影が変わらない

Slide 17

Slide 17 text

スタイルが当てづらい My Theme .nes-btn.my-theme { color: white; background-color: #5676E7; } .nes-btn.my-theme::after { box-shadow: inset -4px -4px #0E72A3; } ユーザーがボーダーの サイズを知る必要がある

Slide 18

Slide 18 text

CSS変数で解決 My Theme .nes-btn.my-theme { --color: white; --background-color: #5676E7; --shadow-color: #0E72A3; } // NES.css .nes-btn { color: var(--color); background-color: var(--background-color); &::after { box-shadow: inset -4px -4px var(―shadow-color); } }

Slide 19

Slide 19 text

まとめ • CSS変数は便利だけど過信は禁物 • CSS変数をなんとなくで使わない • 闇を⽣み出しやすい • 可能な限り静的な変数のほうが良い • デメリットを理解してから使う

Slide 20

Slide 20 text

参考サイト ✨NES.css@next Proposals - Issue#331 https://github.com/nostalgic-css/NES.css/issues/331 box-shadow - MDN https://developer.mozilla.org/ja/docs/Web/CSS/box-shadow CSS変数をJavaScriptで動的に変更し、複数のスタイルに⼀括適⽤する https://kuroeveryday.blogspot.com/2018/03/change-css-valiables-by-javascript.html