ホームページを眺めながらCSS設計の初歩を学ぼう

## はじめに
今回は[『CSS設計完全ガイド』](https://www.amazon.co.jp/CSS%E8%A8%AD%E8%A8%88%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E8%A9%B3%E7%B4%B0%E8%A7%A3%E8%AA%AC-%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E9%9B%86-%E5%8D%8A%E7%94%B0-%E6%83%87%E5%BF%97/dp/429711173X)という書籍の内容を元に、実際のホームページを見ながらCSS設計にふれてみよう！という内容になっております。

- とりあえずデザインやデモサイトを見ながらHTML、CSSを使ってコーディングできるけど、これからどのようにレベルアップすれば良いかわからない。
- CSS設計って聞いたことあるけど、難しそう...

そんな方に読んでいただければと思います。

## CSS設計を始めるための目を養う
CSS設計において大切な２つの法則があります。

1.  **抽象化する**
2.  **分ける**

「抽象化するってなに？」「分けるってなにを？」って感じだと思いますので、よりわかりやすくすると

1. **共通する部分を見つける**
2. **（パーツの大きさ・役割で）分ける**

となります。
では、上のことを意識しながら弊社のホームページを眺めてみてください。

![prum.jpのコピー2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783222/c839afa2-5f63-08cb-6e49-71ed2d3c1ee0.png)

共通する部分はわりと見つけやすいのではないでしょうか。
例えばこんなものが挙げられます。

タイトル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783222/b8bda971-2d4c-648e-d08e-42d9cf17791f.png)


メディア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783222/2098be73-3d9e-c08f-fa4f-dd1519e641cb.png)


ボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783222/a14f1598-93bc-3976-bdb5-7693d98b9b9d.png)


また、少し視野を広げると**色**も共通していますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783222/05dafdb5-b7ca-deea-9669-fae85e9e30f2.png)
[Adobe Color](https://color.adobe.com/ja/create/image)

こんな感じで共通項が見つかれば、各々にクラス名やスタイルを振らなくても、共通のパーツとして使い回すことができそうです。

## 人によってCSSが変わる問題
今回はわかりやすく「ボタン」と「メディア」という２つのパーツを取り上げていきたいと思います。

### ボタンコンポーネント
先ほどのホームページを見るに、ボタンはどのセクションでも共通のデザインです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783222/752744ec-af3a-c723-0cdb-47f0ded90ea8.png)
あらかじめページで共通のボタンとスタイルを作っておけば、ボタンが必要になったタイミングで`<a class="btn">`を設置するだけよさそうですね。

### メディアコンポーネント
では今度は「メディア」を見てみましょう。
こうした画像とテキストフィールドが横並びに配置されたパーツ（コンポーネント）をよくメディアと呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783222/03f545d5-46bc-0b04-b4d3-e90083f2ac3c.png)
いま上で紹介した**ボタン**が含まれていますね。
ボタンを先に見ていたので、「`<div class="media">`の中に`<a class="btn">`が入っている(ネストしている）」と想像ができます。

しかし、先にメディアを見ていたとしたらどうでしょう？
**A. ボタンが独立した一つのパーツなのか**
**B. メディアの中にあるボタンなのか**
少し迷ってしまいませんか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3783222/5b1003a6-ff52-e6ab-7bd5-21802947f653.png)

これこそ、CSS設計における問題点です！
具体的にクラス名を付けるとわかりやすいかと思います。

ボタンのクラス名に注目してください。
```html
// Aパターン
<div class="media">
  <img src="../images/sample.jpeg" alt="sample" class="media-img" />
  <div class="media-body">
    <h3 class="media-title">タイトルタイトルタイトル</h3>
    <p class="media-text">
      テキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
    </p>
    <a href="#" class="btn">詳細はこちら</a>
  </div>
</div>
```
こちらはボタンが独立したパーツなので、「.btn」というクラス名です。

```html
// Bパターン
<div class="media">
  <img src="" alt="" class="media-img" />
  <div class="media-body">
    <h3 class="media-title">タイトルタイトルタイトル</h3>
    <p class="media-text">
      テキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
    </p>
    <a href="#" class="media-btn">詳細はこちら</a>
  </div>
</div>
```
こちらはメディアの中のボタンのため、「.media-btn」というクラス名です。

:::note
CSS設計なのにHTMLの話？と思うかもしれませんが、この**クラス名の付け方**というのはCSSでスタイルを当てていく上でとても大切です！
:::

この問題の答えとしては、**基本的にはAパターンで実装する**方がCSS設計としては正しいです。
メディアというパーツの中に、異なるパーツであるボタンが含まれている、ということですね。

この **「どこまでが1パーツなのか」** という感覚を養うことで、変更に強い、しっかりとしたCSSを設計していくことができます！

## まとめ
CSSの難しいところは、共通化しすぎても、しなさすぎてもダメというところだと思います。
なんでも上書きしていけばとりあえずのデザインはできてしまうため、いろいろな人が考えなしにコードを書いていくと、最終的にとんでもないカオスCSSが生み出されるわけですね。

今回は本当にさわりの話だけで、具体的なCSSのコードは紹介しませんでしたが、次のCSS設計レイアウト編でより実践的なCSSの書き方をまとめて紹介したいと思います！

## 参考
[『CSS設計完全ガイド』](https://www.amazon.co.jp/CSS%E8%A8%AD%E8%A8%88%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-%E8%A9%B3%E7%B4%B0%E8%A7%A3%E8%AA%AC-%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E9%9B%86-%E5%8D%8A%E7%94%B0-%E6%83%87%E5%BF%97/dp/429711173X)