CSS は構造化が難しくスタイルを宣言していくだけで目的が達成できてしまいます。上書きの繰り返しによって肥大化しないための設計ヒントをまとめます。
CSS の詳細度はルーティングテーブルのロンゲストマッチのようなものです。一致度の高いとされるセレクタで指定したスタイルが優先的に適用されます。同じ詳細度の場合は後から指定したスタイルで上書かれて適用されます。
↑高い
!important (避けるべき)
HTML の style 属性でのインライン記述 (避けるべき)
ID セレクタ (避けることを推奨(後述))
クラスセレクタ (推奨)
要素セレクタ ('p' 等。HTML 構造への依存は避けます(後述)。リセット用途で使用)
ユニバーサルセレクタ '*' (リセット用途で使用。パフォーマンスの問題などからあまり推奨されない)
↓低い
important
は基本的には使用しないようにします。CSS 内で詳細度が高騰してくるとスタイルを適用するための応急処置として以下のようなコードを書かざるを得なくなってきます。
p {
font-size: 6px !important;
}
可能なかぎり詳細度の高騰は避けましょう。例えば以下のようにします。
.mylist li a {
}
↓
.mylist a {
}
相対値を使用すると独立パラメータ変数の個数を削減できます。以下の line-height
の例では子要素に属性値が伝搬するためコード量も削減できています。
<div class="myouter">
<p class="myinner">文章</p>
<p>文章</p>
</div>
<style>
.myouter {
font-size: 12px;
line-height: 24px;
}
.myinner {
font-size: 24px;
line-height: 48px;
}
</style>
<style>
.myouter {
font-size: 12px;
line-height: 2.0;
}
.myinner {
font-size: 24px;
}
</style>
要素セレクタや ID セレクタは HTML の特定の場所に依存しがちです。クラスで部品化しましょう。ただし汎用部品化には時間がかかります。結局使用しない部品の可能性もあるため何度か出現してから抽出してコンポーネント化するようにします。
h1 が h2 に変更されると困ります。
<div id="container">
<h1>見出し</h1>
<p>文章</p>
</div>
<style>
div h1 {
font-size: 24px;
}
</style>
要素セレクタではなくクラスでセレクトしましょう。h1.myheadline
ではなく、要素セレクタを使用せずに省略して .myheadline
とします)。
<div id="container">
<h1 class="myheadline">見出し</h1>
<p>文章</p>
</div>
<style>
.myheadline {
font-size: 24px;
}
</style>
id container はページ内に一箇所しか存在できません。詳細度の高騰にもつながります。
<div id="container">
<h1>見出し</h1>
<p>文章</p>
</div>
<style>
#container h1 {
font-size: 24px;
}
</style>
<div id="container">
<h1 class="myheadline">見出し</h1>
<p>文章</p>
</div>
<style>
.myheadline {
font-size: 24px;
}
</style>
クラスを用いた部品化ではスタイルの削除ではなく追加を心がけます。コード量を削減できます。以下の例ではスタイル三行を二行に削減できています。
<div>
<h1 class="myheadline myheadline-no-underline">見出し</h1>
<h1 class="myheadline">下線あり見出し</h1>
</div>
<style>
.myheadline {
font-size: 24px;
border-bottom: 2px solid #000;
}
.myheadline-no-underline {
border-bottom: none;
}
</style>
ルールを追加するように設計すると行数が削減できます。
<div>
<h1 class="myheadline">見出し</h1>
<h1 class="myheadline myheadline-underline">下線あり見出し</h1>
</div>
<style>
.myheadline {
font-size: 24px;
}
.myheadline-underline {
border-bottom: 2px solid #000;
}
</style>