CSS 設計に関するヒント
[最終更新] (2019/06/03 00:45:54)
最近の投稿
注目の記事

概要

CSS は構造化が難しくスタイルを宣言していくだけで目的が達成できてしまいます。上書きの繰り返しによって肥大化しないための設計ヒントをまとめます。

詳細度の高騰が発生した CSS は破綻しやすい

CSS の詳細度はルーティングテーブルのロンゲストマッチのようなものです。一致度の高いとされるセレクタで指定したスタイルが優先的に適用されます。同じ詳細度の場合は後から指定したスタイルで上書かれて適用されます。

↑高い
!important (避けるべき)
HTML の style 属性でのインライン記述 (避けるべき)
ID セレクタ (避けることを推奨(後述))
クラスセレクタ (推奨)
要素セレクタ ('p' 等。HTML 構造への依存は避けます(後述)。リセット用途で使用)
ユニバーサルセレクタ '*' (リセット用途で使用。パフォーマンスの問題などからあまり推奨されない)
↓低い

important は基本的には使用しないようにします。CSS 内で詳細度が高騰してくるとスタイルを適用するための応急処置として以下のようなコードを書かざるを得なくなってきます。

p {
  font-size: 6px !important;
}

可能なかぎり詳細度の高騰は避けましょう。例えば以下のようにします。

.mylist li a {
}
↓
.mylist a {
}

絶対値を多用した CSS は破綻しやすい

相対値を使用すると独立パラメータ変数の個数を削減できます。以下の 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>

HTML の構造に依存した CSS は破綻しやすい

要素セレクタや 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 セレクタは避ける

悪い例

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>

スタイルの取り消しがある CSS は破綻しやすい

クラスを用いた部品化ではスタイルの削除ではなく追加を心がけます。コード量を削減できます。以下の例ではスタイル三行を二行に削減できています。

悪い例

<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>

シングルクラスとマルチクラス

この続きが気になる方は

CSS 設計に関するヒント

残り文字数は全体の約 23 %
tybot
100 円
関連ページ