【CSS】画像を重ねて横並びにする方法|スマホでは2列に切り替え

CSS Gridを使って、画像を少しずつ重ねながら横並びに配置する方法を紹介します。PC・タブレットでは4列に並べた画像を重ねて表示し、スマートフォンでは重なりを解除して2列に切り替えます。制作工程やサービスの流れ、手順紹介などに活用できるレスポンシブ対応のレイアウトを、HTMLとCSSのサンプルコード付きで解説します。

HTML サンプル

4つのパーツが横並びになるコードを記載します。

<ul class="flow-unit">
    <li>
        <img src="flowimg001.png" alt="流れ1">
        <h4>流れ01</h4>
        <p>流れ01の説明が入ります。</p>
    </li>
    <li>
        <img src="flowimg002.png" alt="流れ2">
        <h4>流れ02</h4>
        <p>流れ02の説明が入ります。</p>
    </li>
    <li>
        <img src="flowimg003.png" alt="流れ3">
        <h4>流れ03</h4>
        <p>流れ02の説明が入ります。</p>
    </li>
    <li>
        <img src="flowimg004.png" alt="流れ4">
        <h4>流れ04</h4>
        <p>流れ02の説明が入ります。</p>
    </li>
</ul>

コピペで使えるCSSサンプル

PCサイズでは画像を重ねるが、スマホサイズでは見やすさを優先して重ねないレイアウトにする

/* PC・タブレットで4列 */
ul.flow-unit {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0;
  padding: 0;
  list-style: none;
}

ul.flow-unit > li {
  min-width: 0;
}

ul.flow-unit > li:not(:first-child) {
  margin-left: -16px;
}
.flow-unit h4{
  text-align: center;
  font-weight: bold;
}
ul.flow-unit img {
  display: block;
  width: 100%;
  height: auto;
}

/* スマホ:2列 */
@media (max-width: 767px) {
  ul.flow-unit {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 20px;
  }

  ul.flow-unit > li {
    margin-left: 0;
  }
}

CSS解説

display: grid;
子要素を格子状に配置します。

grid-template-columns: repeat(4, minmax(0, 1fr));
PC・タブレットでは4つの要素を均等な幅で横並びにします。

gap: 0;
要素同士の間隔をなくします。

min-width: 0;
子要素が内容によって必要以上に広がるのを防ぎます。

li:not(:first-child)
最初の要素を除いた、2番目以降の要素を指定します。

margin-left: -16px;
2番目以降の要素を左に16pxずらし、隣の画像と重なるように表示します。

width: 100%; height: auto;
画像を親要素の幅に合わせ、縦横比を維持して表示します。

@media (max-width: 767px)
画面幅767px以下の場合に、スマートフォン用のスタイルを適用します。

grid-template-columns: repeat(2, minmax(0, 1fr));
スマートフォンでは2列に変更します。

gap: 20px;
スマートフォンでは要素同士に20pxの間隔を設けます。

margin-left: 0;
PCで設定したマイナスマージンを解除し、スマートフォンでは画像が重ならないようにします。