9/7まで 最大30%OFF 初心者編|無料コーディング教材|HTML・CSS・jQueryを実践で学ぶ

HTMLとCSSで画像を横並びにする方法|初心者向けにFlexboxを解説

HTMLとCSSで画像を縦並びから横並びへ変更するイメージ

HTMLで画像を3枚置いたものの、縦に並んでしまった。これを横一列に並べるには、どこへCSSを書けばよいのでしょうか。

画像の横並びは、CSSのFlexboxを使うと簡単です。この記事では、何も指定していない状態からコードを少しずつ追加し、横並び、中央寄せ、余白、スマートフォン対応まで実際の表示を見ながら進めます。

縦に並んだ3枚の画像をFlexboxで横並びに変更する流れ

先に結論を書くと、横並びにしたい画像を囲む親要素へ display: flex; を指定します。ただし、画像の幅や余白も一緒に整えないと、画面からはみ出したり窮屈に見えたりします。

画像を横並びにする基本の方法

まずは変更前の状態を確認しましょう。下の画像では、3枚の画像が縦方向に並んでいます。

CSSを指定する前に山、海、森の3枚の画像が縦に並んでいる表示

HTMLでは、横並びにしたい画像を1つの div で囲みます。今回は親要素に image-list、それぞれの画像に image-list__item というクラス名を付けました。

<div class="image-list">
  <img class="image-list__item" src="mountain.jpg" alt="青空の下に広がる山">
  <img class="image-list__item" src="sea.jpg" alt="砂浜と青い海">
  <img class="image-list__item" src="forest.jpg" alt="緑に囲まれた森">
</div>

クラス名はCSSを適用する目印です。imgdiv へ直接指定すると、ページ内にある別の画像まで横並びの影響を受けるため、専用のクラス名を付けておくと安心です。

続いて、親要素の image-list へ次のCSSを追加します。

.image-list {
  display: flex;
}

display: flex; を指定すると、親要素の直下にある子要素が横方向に並びます。ブラウザを更新して、表示を確認してみましょう。

display flexを指定して山、海、森の3枚の画像が横並びになった表示

画像が横一列になりました。Flexboxについて先に詳しく知りたい方は、次の記事も参考にしてください。

画像の幅をそろえて余白を空ける

横並びにはできましたが、実際のWebページでは画像同士に少し余白がある方が見やすくなります。3枚を同じ幅にそろえ、画像の間へ16pxの余白を付けてみましょう。

.image-list {
  display: flex;
  gap: 16px;
}

.image-list__item {
  width: calc((100% - 32px) / 3);
  height: auto;
  display: block;
}

gap は子要素同士の間隔を指定するプロパティです。3枚の画像の間には余白が2つできるため、全体の幅から32pxを引き、残った幅を3等分しています。

height: auto; は、画像本来の縦横比を保ったまま高さを自動調整する指定です。横幅だけを変更したときに画像が不自然につぶれるのを防げます。

画像のグループを中央寄せする

画像を固定幅で表示すると、横並びにした画像の右側へ空きができる場合があります。グループ全体を中央に置きたいときは、親要素へ justify-content: center; を追加します。

.image-list {
  display: flex;
  justify-content: center;
  gap: 16px;
}

.image-list__item {
  width: 280px;
  max-width: 100%;
  height: auto;
  display: block;
}

justify-content は、Flexboxの並ぶ方向に沿って子要素の位置を調整します。今回は横並びなので、center を指定すると画像のグループが左右の中央へ移動します。

横並びにした山、海、森の3枚の画像を中央寄せし余白を付けた表示

上の画像では、3枚が中央へまとまり、画像の間にも余白が入りました。以前は2枚目だけに margin を付ける方法もよく使われましたが、現在は要素の数が変わっても扱いやすい gap が便利です。

スマートフォンでは縦並びに切り替える

パソコンではきれいに見えても、幅の狭いスマートフォンで3枚を横並びにすると、1枚ずつが小さくなってしまいます。そこで、画面幅が767px以下になったときだけ縦並びへ切り替えます。

パソコンでは画像を横並びにしスマートフォンでは縦並びに切り替える表示例
.image-list {
  display: flex;
  gap: 16px;
}

.image-list__item {
  width: calc((100% - 32px) / 3);
  height: auto;
  display: block;
}

@media (max-width: 767px) {
  .image-list {
    flex-direction: column;
  }

  .image-list__item {
    width: 100%;
  }
}

@media から始まる部分をメディアクエリと呼びます。条件に合う画面幅だけへCSSを適用できるため、パソコンとスマートフォンで並べ方を変えられます。

flex-direction: column; は、子要素の並ぶ方向を横から縦へ変更する指定です。画像幅も 100% にすることで、スマートフォンの横幅を無駄なく使えます。

画像の高さがそろわない場合の対処法

縦長と横長の画像を一緒に並べると、高さが不ぞろいになることがあります。カード一覧などで高さをきれいにそろえたい場合は、aspect-ratioobject-fit を追加します。

.image-list__item {
  width: calc((100% - 32px) / 3);
  aspect-ratio: 3 / 2;
  object-fit: cover;
  display: block;
}

aspect-ratio: 3 / 2; は、表示する枠を横3・縦2の比率にそろえる指定です。object-fit: cover; を使うと画像を変形させずに枠いっぱいへ表示できます。

ただし、枠と元画像の比率が違う場合は、上下または左右の一部が切り取られます。人物の顔や商品の全体像など、切れてはいけない部分がある画像では表示を確認してください。

横並び画像のデザイン例

基本の横並びができたら、画像の見せ方も少し整えてみましょう。ここでは、画像の角を丸める方法と、画像を使ったカードデザインを紹介します。

画像の角を丸める

まずは何も装飾していない画像です。四隅が直角になっています。

border-radiusを指定する前の四隅が直角になっている山の画像

画像の角を丸めるには、border-radius を使います。今回は変化が分かりやすいように12pxを指定します。

.image-list__item {
  border-radius: 12px;
}
border-radiusを指定して四隅を丸めた山の画像

四隅が少し丸くなり、やわらかい印象になりました。数値を大きくするほど丸みも強くなります。

border-radiusが半径12pxの円の丸みを利用する仕組みを示した図

border-radius: 12px;を指定すると、画像の各角に半径12pxの円弧を作るイメージで丸みが付きます。radiusは英語で「半径」という意味です。

画像と文章をカードとして横並びにする

画像の下にタイトルや説明文を置くと、記事一覧や商品一覧でよく見るカードデザインになります。完成イメージは次のとおりです。

山、海、森の画像と説明文を組み合わせた3枚のカードを横並びにした表示

カード全体を囲む親要素にもFlexboxを使えます。画像だけを並べる場合と同じ考え方です。

<div class="card-list">
  <article class="card">
    <img class="card__image" src="mountain.jpg" alt="青空の下に広がる山">
    <h3 class="card__title">山の写真</h3>
    <p class="card__text">青空と山の風景を紹介します。</p>
  </article>

  <article class="card">
    <img class="card__image" src="sea.jpg" alt="砂浜と青い海">
    <h3 class="card__title">海の写真</h3>
    <p class="card__text">砂浜から見える海を紹介します。</p>
  </article>

  <article class="card">
    <img class="card__image" src="forest.jpg" alt="緑に囲まれた森">
    <h3 class="card__title">森の写真</h3>
    <p class="card__text">木々に囲まれた風景を紹介します。</p>
  </article>
</div>
.card-list {
  display: flex;
  gap: 16px;
}

.card {
  flex: 1;
  overflow: hidden;
  border: 1px solid #ddd;
  border-radius: 12px;
}

.card__image {
  width: 100%;
  aspect-ratio: 3 / 2;
  object-fit: cover;
  display: block;
}

.card__title,
.card__text {
  margin-right: 16px;
  margin-left: 16px;
}

@media (max-width: 767px) {
  .card-list {
    flex-direction: column;
  }
}

flex: 1; によって、3つのカードが利用できる横幅を均等に分け合います。カードの数や文章量を変えたときは、パソコンとスマートフォンの両方で崩れていないか確認しましょう。

alt属性には画像の内容を書く

alt 属性には、画像が表示されない場合やスクリーンリーダーで読み上げられる場合に伝えたい内容を書きます。「画像1」ではなく、「砂浜と青い海」のように内容を簡潔に表しましょう。

画像が装飾だけを目的としており、なくても情報が変わらない場合は alt="" とします。すべて空にするのではなく、その画像が本文の理解に必要かどうかで判断します。

画像を横並びにする完成コード

最後に、基本の横並び、余白、高さの統一、スマートフォン対応をまとめたコードを掲載します。まずはこのコードをそのまま試し、画像の枚数や好みに合わせて数値を調整してみてください。

<div class="image-list">
  <img class="image-list__item" src="mountain.jpg" alt="青空の下に広がる山">
  <img class="image-list__item" src="sea.jpg" alt="砂浜と青い海">
  <img class="image-list__item" src="forest.jpg" alt="緑に囲まれた森">
</div>
.image-list {
  display: flex;
  gap: 16px;
}

.image-list__item {
  width: calc((100% - 32px) / 3);
  aspect-ratio: 3 / 2;
  object-fit: cover;
  border-radius: 12px;
  display: block;
}

@media (max-width: 767px) {
  .image-list {
    flex-direction: column;
  }

  .image-list__item {
    width: 100%;
  }
}

まとめ

  • 画像を囲む親要素へ display: flex; を指定する
  • 画像同士の余白には gap を使う
  • 専用のクラス名を付け、ほかの画像への影響を防ぐ
  • スマートフォンではメディアクエリで縦並びへ切り替える
  • 高さをそろえる場合は aspect-ratioobject-fit を使う

最初からすべてのCSSを書く必要はありません。まず display: flex; だけで横並びを確認し、そのあとに余白やスマートフォン対応を加えると、どの指定で表示が変わったのか理解しやすくなります。