LoginSignup
9
12

More than 5 years have passed since last update.

設計が破綻しにくいCSSの書き方

Last updated at Posted at 2018-01-24

デザインと並行してコーディングを進めざるを得ない案件では、
デザインの全貌がわからないままコーディングを進めなくてはならない場合があるため、例外スタイルの多発でCSSが煩雑化し、設計が破綻しやすい。(デザイナー含む)

デザイナー「このページだけ例外で、ボタンのmargin-topを○○pxにして欲しい。」× ∞

そんな場合に例外スタイルを管理して、設計が破綻しにくく、効率良くコーディングを進めるCSSの書き方。

基本設計

HTMLとCSSの基本設計。

HTML

ページ識別用のclassを付与する。(CSSシグネチャ)
(例:<body>にclass="page-xxx")

CSSシグネチャとは、ページのbodyなどにidやclassを設定し、 CSSでページごとのスタイルの切り替えを行う手法です。

a.html
<body class="page-a">
  <div class="foo">
    <p>ふー</p>
    <button class="btn" type="button">ボタン</button>
b.html
<body class="page-b">
  <div class="bar">
    <p>ばー</p>
    <button class="btn" type="button">ボタン</button>

CSS

CSS大きく分けて共通CSSとページ固有CSSの2つ。

CSS構成
├── common.scss …共通CSS
├── page-a.scss …ページ固有CSS(例:aページ用CSS)
├── page-b.scss …ページ固有CSS(例:bページ用CSS)
common.scss
// 例)共通ボタン コンポーネント ---------
.btn {
  margin-top: 10px;
  width: 100px;

  // バリエーション -------
  &.btn-s {
    margin-top: 5px;
    width: 50px;
  }

  &.btn-l {
    margin-top: 20px;
    width: 200px;
  }
}
page-a.scss
// 例)a.htmlにしかない要素
.foo {
  background: red;
  width: 500px;
}

コーディングの進め方

デザイナー「ページAだけ例外でボタンのmargin-topを30pxにして欲しい。」

Badパターン

1.ページ固有CSSの記述する。

page-a.scss
.hoge {
  background: red;
  width: 500px;
}

.btn {
  margin-top: 30px;
}

同じセレクターに対するスタイルを複数のCSSに記述すると、スタイルを俯瞰して見にくくなり、煩雑化して保守性が低くなる。

2.共通CSSにバリエーションを増やす。

common.scss
.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を上書きする

common.scss
.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パターンで制作を進めることで、例外スタイルを管理がしやすくなり、
以下のようなタイミングでスムーズにリファクタリングを実行できるようになる。

リファクタリングを実行するタイミング

common.scss
.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を書くことできる。

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12