Help us understand the problem. What is going on with this article?

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

その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に追加します。

できましたか?

以下は筆者だったらこう作る例です(追加分のみ)。

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はデフォルト値でわざわざ書く必要はないのですが、後にメンテする人たちに少しでもデザイン意図が伝わるよう、コードに明示的に書くことを筆者は好みます。

コード例

要素を3つ横並びにしよう

次はPC時にパネルを横並びにするクラスを作ります。

いきなりパネルを並べようとせず、まずはテキストを3つ横並びにしてみます。
PC時の要求

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

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

スマホ時のスタイルを作る

SP時は次の条件が指定されています。
SP時の要求

  • パネルは縦積みになり、パネル間は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

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

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

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

コード例

次は実際にパネルを横並びにしていきます
その3へ続く。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away