運用できるCSS設計を考える

会社のcssがレガシーでずっと書いていたり、継ぎ足し継ぎ足しだったりしたので、sassやcss設計を取り入れて、ソースの共有と補完を少し改善した。
今回は、その時に考えたcss設計を記録として残しておきます。

## BEMを基準に設計した
いろんなcss設計がありますが、個人的にBEMの `.foo__bar` が見やすいので、BEMベースで設計しました。
イメージとしては以下のような感じ。  
![css_01.png](https://qiita-image-store.s3.amazonaws.com/0/55010/0413d54e-cbcb-24db-a01f-5f9ff8e9fa6e.png "css_01.png")

それでは少し解説していきましょう。

## 親セクションから子セクションの振り分けについて
`#header`など、サイトでざっくりとセクションがわかれる場合ありますよね。
`#nav` `#main` `#section_01~...` `#aside` `#footer` など想像できると思います。
この場合のスタイルは基本`background-color`のみにします。
また命名の方法は、そのセクションがサイトのどこを表しているか明確に記述する必要があります。  
大セクションの次に大体来るのが、`div.container`になります（最近はそうとも言いがたい時ありますが）。
このクラスは基本要素の中央寄せしかしません。
**それ以外のプロパティを使用するのは不可としました。**   

次に、`.foo-box`の次の要素が`.foo__left` `.foo__right`に分かれていますね。この`.foo__left` `.foo__right`はそのセクションの要素の左と右を表すだけでのプロパティにします。

![css_02.png](https://qiita-image-store.s3.amazonaws.com/0/55010/395fc520-1c19-f79d-ef53-d0cb8707b348.png "css_02.png")

## 小セクションからの設計
`.foo__left` `.foo__right`に振り分けた後は、`.foo__left__bar` `.foo__right__hoge`などと名前を継承になるかと思いますが、  

**しません**

この場合は、セクションを上下左右に振り分けた直後の、セクションは、`大セクション__子セクション`とします。
ですので、例のソースは`.foo__bar-box`や`.foo__hoge-box`になっていると思います。さらに、子のセクションでいくつかのセクションに別れる場合、`大セクション__子セクション__孫セクション`とします。

![css_03.png](https://qiita-image-store.s3.amazonaws.com/0/55010/24907853-d95c-a2fa-63e4-3b73192571d2.png "css_03.png")

また、各セクションをどんどん振り分けていった先、一番下層にくるセクションがこれ以上分離できないという場合は、直接そのセクションに `float` のプロパティを記述しても良いということにしました。
これは最後まで振り分けの規則に従っていると、`text` と`img` の振り分けに `left` や `right` の `div` がネストする可能性があるので、逆に見難くなるということが運用中に起きたからです。

![css_04-1.png](https://qiita-image-store.s3.amazonaws.com/0/55010/ba3c48c6-f9a0-d1c4-8e42-ba83d332cb99.png "css_04-1.png")

![css_04-2.png](https://qiita-image-store.s3.amazonaws.com/0/55010/a85b7138-5b19-deac-ea7f-cb6f019b7c45.png "css_04-2.png")


## 各セクションのスタイルについて
各セクションのスタイルは、`.foo` `.foo__bar`で定義づけていますが、そのclassやidにcssプロパティを全て記述してしまうと、非常に修正が難しくなり、cssも読みづらくなりますね。
そこで、各セクションのプロパティの機能をハイフンを使って分離することで、そのセクション内でのスタイルを細分化します。  

**※ アンダーバー2本はサイトのセクションどうしの関係を表し、ハイフンはそのセクションに対するcssのプロパティとセクションのパーツに当たる対応と考えます。**  

大体ハイフンの先に使う（使っていた）接尾辞は以下になります。
● `.foo-box` ：そのセクションの入れ物としてのプロパティを記述
● `.foo-head` ：そのセクションの見出しだったりする要素に対するプロパティ
● `.foo-txt` ：そのセクションの文章などを記述しているタグに対するプロパティ
● `.foo-link` ：<a href="hoge"></a>に対するプロパティ
● `.foo-img` ：<img />に対するプロパティ
● `.foo-modify` ：上記以外で、装飾だったりのプロパティが必要な場合に使う

などです。
それぞれの役割をざっと書いておきます。

```css:css
.foo-box { /* 入れ物の機能なので、文字に関する記述はしない */
  float: left; /* 上述で、最小となるセクションに到達したばあい、-boxに直接書き込む */
  width: 200px;
  height: 100px;
  padding: 4px 14px 6px 4px;
  margin: 14px;
  background-color: $base;
  text-align: center; /* imgを中央寄せになどにする場合のみ使う */
}

.foo-head { /* 見出しに相当するプロパティか記述 */
  font-size: large;
  font-weight: bold;
  color: $red;
}

.foo-txt { /* 文字に関するプロパティ以外の記述は一切しない */
  font-size: 16px;
  line-height: 1.5em;
  color: $black;
  margin: 4px;
}

/*
<a href="hoge"></a>はもともとインライン要素ですが、スタイルによってはブロック要素にする必要があるので、
プロパティの制限は原則しない。
ただし、プロパティが嵩張る場合、<span>などをネストさせて対応する必要がある。
*/
.foo-link {
  display: block;
  color: $blue;
}

/*
レイアウトによっては、使用しない場合もあるけど、
これは例として中央寄せする場合を書いてます。
*/
.foo-img {
  display: block;
  width: 80%;
  margin: 0 auto;
}

.foo-modify {
  /* 任意でお好きにどうぞ */
}
```
![css_05.png](https://qiita-image-store.s3.amazonaws.com/0/55010/086fa333-a046-b9a6-ffcd-9722acdbf957.png "css_05.png")

## 設計にベストはない
マークアップや、cssの記述の見通しを良くすることは確かに大事ですが、なかなか弊害も多いので、上手いところで落とし所を見つけるのも必要ですね。

もっと精進していきたい今日この頃。