デザインと並行してコーディングを進めざるを得ない案件では、
デザインの全貌がわからないままコーディングを進めなくてはならない場合があるため、例外スタイルの多発でCSSが煩雑化し、設計が破綻しやすい。(デザイナー含む)
デザイナー「このページだけ例外で、ボタンのmargin-topを○○pxにして欲しい。」× ∞
そんな場合に例外スタイルを管理して、設計が破綻しにくく、効率良くコーディングを進めるCSSの書き方。
基本設計
HTMLとCSSの基本設計。
HTML
ページ識別用のclassを付与する。(CSSシグネチャ)
(例:<body>
にclass="page-xxx")
CSSシグネチャとは、ページのbodyなどにidやclassを設定し、 CSSでページごとのスタイルの切り替えを行う手法です。
<body class="page-a">
<div class="foo">
<p>ふー</p>
<button class="btn" type="button">ボタン</button>
<body class="page-b">
<div class="bar">
<p>ばー</p>
<button class="btn" type="button">ボタン</button>
CSS
CSS大きく分けて共通CSSとページ固有CSSの2つ。
├── common.scss …共通CSS
├── page-a.scss …ページ固有CSS(例:aページ用CSS)
├── page-b.scss …ページ固有CSS(例:bページ用CSS)
// 例)共通ボタン コンポーネント ---------
.btn {
margin-top: 10px;
width: 100px;
// バリエーション -------
&.btn-s {
margin-top: 5px;
width: 50px;
}
&.btn-l {
margin-top: 20px;
width: 200px;
}
}
// 例)a.htmlにしかない要素
.foo {
background: red;
width: 500px;
}
コーディングの進め方
デザイナー「ページAだけ例外でボタンのmargin-topを30pxにして欲しい。」
Badパターン
1.ページ固有CSSの記述する。
.hoge {
background: red;
width: 500px;
}
.btn {
margin-top: 30px;
}
同じセレクターに対するスタイルを複数のCSSに記述すると、スタイルを俯瞰して見にくくなり、煩雑化して保守性が低くなる。
2.共通CSSにバリエーションを増やす。
.btn {
margin-top: 10px;
width: 100px;
// バリエーション -------
&.btn-s {
margin-top: 5px;
width: 50px;
}
&.btn-l {
margin-top: 20px;
width: 200px;
}
&.btn-mt-l {
margin-top: 30px;
}
}
例外スタイルに対してバリエーションを増やすと、バリエーションの管理が煩雑化して保守性が低くなる。
Goodパターン
ページ識別用のclassで共通CSSを上書きする
.btn {
margin-top: 10px;
width: 100px;
// バリエーション -------
&.btn-s {
margin-top: 5px;
width: 50px;
}
&.btn-l {
margin-top: 20px;
width: 200px;
}
// 例外 ---------------
.page-a & {
margin-top: 30px;
}
}
Goodパターンで制作を進めることで、例外スタイルを管理がしやすくなり、
以下のようなタイミングでスムーズにリファクタリングを実行できるようになる。
リファクタリングを実行するタイミング
.btn {
margin-top: 10px;
width: 100px;
// バリエーション -------
&.btn-s {
margin-top: 5px;
width: 50px;
}
&.btn-l {
margin-top: 20px;
width: 200px;
}
// 例外 ---------------
.page-a &,
.page-c &,
.page-d & { // ケース1
margin-top: 30px;
}
.page-e & { // ケース2
margin-top: 32px;
}
.page-f &,
.page-g & { // ケース3
margin-top: 50px;
}
}
ケース1
3回以上同じパターンが出てきた場合、バリエーションとして設計し直す。
ケース2
プロパティの値が別のスタイルの僅差の場合、上記にスタイルに統合出来ないかデザイナーに確認する。
ケース3
3回以下の場合は、まだ例外としておく。
まとめ
- 複数のCSSに同じセレクターのスタイルを書かない。
- 例外スタイルを俯瞰して管理する。
- 同じ例外スタイルが3回出てきた時にバリエーションとして整理する。
上記の3点を意識しておくことで、デザイン上で例外スタイルが多発しても設計が破綻しにくいCSSを書くことできる。