HTML/CSS初心者から中級者への一歩を踏み出す練習課題 その２

[その１](https://qiita.com/yanda/items/3a99891f03e9e84ceed8)では、PC時のパネルのスタイルを作るところまでやりました。
本記事はその続きです。

# パネルをレスポンシブにしよう
[SP時の要求](https://qiita.com/yanda/items/3a99891f03e9e84ceed8#sp%E6%99%82%E7%94%BB%E9%9D%A2%E5%B9%85768px%E6%9C%AA%E6%BA%80)
SP時(768px未満)はアイコンとタイトルを横並びにします。  
以下のクラスにメディアクエリでブレークポイントを設定します。

* `.panel__header`
* `.panel__header__icon`
* `.panel__header__text`

CSSで要素を横並びにするには以下の選択肢があります。

* `float`で浮かせる。
* `position:absolute;`で浮かせる。
* `table`タグまたは`display:table;`でテーブル組みをする。
* `display:flex;`でflexboxを利用する。

この中ではflexboxが圧倒的に便利です。
flexboxは昔は一部のブラウザしかサポートしていなかったのですが、今はほぼすべてのブラウザがサポートしているので積極的に使っていきましょう（2018年時点でまだバグも多いけど）。

また、SP時ページ要素内の左右余白は15px条件もあるため`.belt__content`に追加します。

# できましたか？
以下は筆者だったらこう作る例です（追加分のみ）。

```style.css
@media all and (max-width: 767px) {
    .panel__header {
        display: flex;
        align-items: center;
    }

    .panel__header__icon {
        flex: 0 0 auto;
        margin-bottom: 0;
    }

    .panel__header__icon > img {
        width: 60px;
    }

    .panel__header__text {
        flex: 1 1 auto;
        margin-left: 15px;
        text-align: left;
    }

    .belt {
        min-width: 100%;
    }

    .belt__content {
        width: 100%;
        padding: 30px 15px;
    }
}
```

`.panel__header__icon`のflex-basisや`.panel__header__text`のflex-shrinkとflex-basisはデフォルト値でわざわざ書く必要はないのですが、後にメンテする人たちに少しでもデザイン意図が伝わるよう、コードに明示的に書くことを筆者は好みます。

[コード例](https://github.com/yonda-yonda/html-css-bootcamp/tree/master/stage2)

# 要素を3つ横並びにしよう
次はPC時にパネルを横並びにするクラスを作ります。

いきなりパネルを並べようとせず、まずはテキストを3つ横並びにしてみます。
[PC時の要求](https://qiita.com/yanda/items/3a99891f03e9e84ceed8#sp%E6%99%82%E7%94%BB%E9%9D%A2%E5%B9%85768px%E6%9C%AA%E6%BA%80)

* パネルは3つとも同じ幅
* パネルとパネルの間隔は20px
* パネル3つとその間の余白の横幅合計が960px

1つのパネルの幅は(960 - 20 * 2) / 3 = 306.7px です。
でもページ要素幅の指定が変わったときに毎回計算するのは面倒なのでパーセント指定したいです。  

# スマホ時のスタイルを作る
SP時は次の条件が指定されています。
[SP時の要求](https://qiita.com/yanda/items/3a99891f03e9e84ceed8#sp%E6%99%82%E7%94%BB%E9%9D%A2%E5%B9%85768px%E6%9C%AA%E6%BA%80)

* パネルは縦積みになり、パネル間は20px空く。

メディアクエリを使ってうまく切り替えてください。

## できましたか？
以下は筆者だったらこう作る例です。

```index.html
<div class="belt">
  <div class="belt__content">
    <ul class="panels">
        <li class="panels__item">
            <p style="text-align:center; background-color: white;">パネル</p>
        </li>
        <li class="panels__item">
            <p style="text-align:center; background-color: white;">パネル</p>
        </li>
        <li class="panels__item">
            <p style="text-align:center; background-color: white;">パネル</p>
        </li>
    </ul>
  </div>
</div>
```

```style.css
.panels {
    display: flex;
    margin-left: -10px;
    margin-right: -10px;
}

.panels__item {
    flex: 0 0 calc(33.3% - 20px);
    margin-left: 10px;
    margin-right: 10px;
}

@media all and (max-width: 767px) {
    .panels {
        display: block;
    }

    .panels__item:not(:last-child) {
        margin-bottom: 20px;
    }
}
```
疑似パネル要素にはわかりやすくインラインでスタイルをつけています（今だけ）。

* `.panels`
* `.panels__item`

今回作ったクラスはこの２つです。
繰り返し要素のクラス名に、筆者はよく`item`を使います。
パネルのアイコンとテキストと同様に、今回もflexboxを使って横並び(3等分)を実現しています。

この辺の書き方は[bootstrap](https://getbootstrap.com/)のrow/colを参考にしています。
bootstrapのお世話になっている人も多いでしょう。当たり前ですがよくできているので一度中身を覗いてみることをおすすめします。

`.panels__item`の代わりに横着して`.panels > *`のように直下の要素でスタイルを指定してしまうこともあります（ulタグを使うこと前提）。  

[コード例](https://github.com/yonda-yonda/html-css-bootcamp/tree/master/stage3)

次は実際にパネルを横並びにしていきます
[その３](https://qiita.com/yanda/items/8cc43ded868fbf953676)へ続く。