その1では、PC時のパネルのスタイルを作るところまでやりました。
本記事はその続きです。
パネルをレスポンシブにしよう
SP時の要求
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
に追加します。
できましたか?
以下は筆者だったらこう作る例です(追加分のみ)。
@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はデフォルト値でわざわざ書く必要はないのですが、後にメンテする人たちに少しでもデザイン意図が伝わるよう、コードに明示的に書くことを筆者は好みます。
要素を3つ横並びにしよう
次はPC時にパネルを横並びにするクラスを作ります。
いきなりパネルを並べようとせず、まずはテキストを3つ横並びにしてみます。
PC時の要求
- パネルは3つとも同じ幅
- パネルとパネルの間隔は20px
- パネル3つとその間の余白の横幅合計が960px
1つのパネルの幅は(960 - 20 * 2) / 3 = 306.7px です。
でもページ要素幅の指定が変わったときに毎回計算するのは面倒なのでパーセント指定したいです。
スマホ時のスタイルを作る
SP時は次の条件が指定されています。
SP時の要求
- パネルは縦積みになり、パネル間は20px空く。
メディアクエリを使ってうまく切り替えてください。
できましたか?
以下は筆者だったらこう作る例です。
<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>
.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
今回作ったクラスはこの2つです。
繰り返し要素のクラス名に、筆者はよくitem
を使います。
パネルのアイコンとテキストと同様に、今回もflexboxを使って横並び(3等分)を実現しています。
この辺の書き方はbootstrapのrow/colを参考にしています。
bootstrapのお世話になっている人も多いでしょう。当たり前ですがよくできているので一度中身を覗いてみることをおすすめします。
.panels__item
の代わりに横着して.panels > *
のように直下の要素でスタイルを指定してしまうこともあります(ulタグを使うこと前提)。
次は実際にパネルを横並びにしていきます
その3へ続く。