imgタグとNext.jsのImageは何が違う?画像最適化の仕組みと基本的な使い方をやさしく解説


Next.js・microCMS 初心者ノート

imgタグとNext.jsのImageは何が違う? 画像最適化の仕組みと基本的な使い方をやさしく解説

imgタグとNext.jsのImageは何が違う?画像最適化の仕組みと基本的な使い方を解説

HTMLでは、画像を表示するときに imgタグを使います。
ところがNext.jsでは、 Imageという専用のコンポーネントが用意されています。
どちらも画像を表示する点は同じですが、 読み込み速度、画像サイズ、レイアウトの安定性などに違いがあります。 今回は、初心者が最初に知っておきたい違いと使い方を整理します。

Next.js Image imgタグ 画像最適化 microCMS 初心者向け
01

imgタグがあるのに、なぜImageを使うの?

HTMLで画像を表示するときは、 次のようにimgタグを使います。

HTMLの画像表示
<img
  src="/images/photo.jpg"
  alt="記事の写真"
>

Next.jsでは、同じ画像を次のように書けます。

Next.js Imageコンポーネント
import Image from "next/image";

<Image
  src="/images/photo.jpg"
  alt="記事の写真"
  width={800}
  height={500}
/>
?

画像が表示できるなら、imgタグでもよいのでは?

画面上では同じ写真が表示されます。
それなのに、なぜNext.jsでは Imageコンポーネントを使うのでしょうか。

大きな理由は、 Webサイトで使う画像を効率よく配信し、 ページを快適に表示するためです。

imgタグは画像をそのまま表示するHTML要素、
Imageは画像表示に最適化機能を加えた Next.jsのコンポーネントです。

02

HTMLのimgタグとは?

imgタグは、 HTMLで画像を表示するための要素です。

<img>
HTML ELEMENT 指定した画像ファイルをページに表示する要素

Next.jsに限らず、 通常のHTMLやWordPressなどでも使えます。

基本的な書き方

imgタグの基本
<img
  src="/images/cat.jpg"
  alt="窓辺に座っている猫"
  width="800"
  height="500"
>
src
表示する画像の場所 /images/cat.jpg
alt
画像の内容を表す代替テキスト 窓辺に座っている猫
width
画像の横幅 800
height
画像の高さ 500

imgタグはシンプルで自由度が高く、 ブラウザーが標準で理解できる画像要素です。

imgタグのポイント

imgタグ自体が悪いわけではありません。 Next.jsの画像最適化が必要ない場面や、 特殊な画像表現ではimgタグを使う場合もあります。

03

Next.jsのImageとは?

Imageは、 Next.jsが提供するReactコンポーネントです。

HTMLのimgタグをもとにしながら、 画像のサイズ調整や遅延読み込みなど、 Webページの表示を助ける仕組みが追加されています。

Image
REACT COMPONENT Next.jsの画像最適化機能を利用するコンポーネント

画面サイズに合った画像配信や、 レイアウトの安定化を支援します。

最初にimportする

STEP 1 Imageを読み込む
import Image from "next/image";

JSX内にImageを書く

STEP 2 画像を表示する
export default function Page() {
  return (
    <Image
      src="/images/cat.jpg"
      alt="窓辺に座っている猫"
      width={800}
      height={500}
    />
  );
}

TSXでは、 数値を文字列ではなくJavaScriptの値として渡すため、 width={800}のように波括弧を使います。

HTML width="800"
TSX width={800}
04

imgタグとImageの主な違い

どちらも画像を表示しますが、 Next.jsのImageにはWebサイト向けの最適化機能があります。

比較項目
imgタグ
Image
種類
HTML要素
Reactコンポーネント
画像最適化
自分で対応する
Next.jsが支援する
端末別サイズ
srcsetなどを自分で設定
適切な候補を生成できる
遅延読み込み
属性などで設定
標準で利用できる
レイアウトずれ
サイズ指定が重要
サイズ情報から領域を確保
外部画像
URLをそのまま指定可能
許可するURL設定が必要
import
不要
next/imageから必要
HTMLのimgタグ 画像をそのまま表示

画像の準備やサイズ調整は、 制作者側で管理します。

VS
Next.jsのImage 画像表示を最適化

端末や表示条件に合わせた 画像配信を支援します。

05

画像最適化とは?

Webサイトの画像は、 ページのデータ量の中でも大きな割合を占めやすい要素です。

たとえば、横幅2000pxの大きな写真を スマートフォンの小さな画面へそのまま配信すると、 必要以上に大きなデータを読み込むことになります。

元画像 2000px
🖼
スマートフォン 小さい画像
タブレット 中サイズ画像
パソコン 大きい画像

Imageを使うと、 ブラウザーは用意された画像候補の中から、 表示環境に合ったサイズを選びやすくなります。

01 サイズを調整

端末に対して必要以上に大きな画像を避けます。

02 新しい形式を活用

対応環境では効率的な画像形式を利用できます。

03 遅延読み込み

画面外の画像を必要なタイミングで読み込みます。

04 表示を安定化

画像用の領域をあらかじめ確保します。

画像最適化の目的

画質を極端に落とすことではなく、 表示に必要な品質を保ちながら、 不要に大きなデータの読み込みを減らすことです。

06

画像読み込み時のレイアウトずれを防ぐ

ページを開いた直後、 画像の読み込みが終わってから文章やボタンが 下へ押し出されることがあります。

画像の領域がない場合
ボタン
画像があとから表示
内容が下へずれる
画像の領域がある場合
画像領域
ボタン
表示位置が安定する

Imageでは、 widthheightから画像の比率を判断し、 読み込み前から必要な領域を確保できます。

width 800
×
height 500
画像の縦横比 8:5

widthとheightは、画面上のサイズを固定するだけでなく、
画像が表示される前に縦横比を伝える役割もあります。

07

public内の画像を表示する

Next.jsでは、 publicフォルダーへ画像を置くと、 URLの先頭から画像を指定できます。

project
├─ app
├─ public
│   └─ images
│       └─ cat.jpg
LOCAL IMAGE public/images/cat.jpgを表示
import Image from "next/image";

export default function Page() {
  return (
    <Image
      src="/images/cat.jpg"
      alt="窓辺に座っている猫"
      width={800}
      height={500}
    />
  );
}
実際の保存場所 public/images/cat.jpg
srcに書く内容 /images/cat.jpg
publicは書かない

srcへ /public/images/cat.jpg と書くのではなく、 /images/cat.jpg と指定します。

08

画像をimportして表示する

プロジェクト内の画像は、 ファイルとしてimportして表示する方法もあります。

STATIC IMPORT 画像ファイルをimport
import Image from "next/image";
import catImage from "./cat.jpg";

export default function Page() {
  return (
    <Image
      src={catImage}
      alt="窓辺に座っている猫"
    />
  );
}

画像を静的にimportした場合は、 Next.jsが画像ファイルの横幅と高さを取得できるため、 widthheightを 省略できる場合があります。

publicから指定 URLで管理しやすい src="/images/cat.jpg"
静的import 画像情報を取得できる src={catImage}
09

microCMSなどの外部画像を表示する

microCMSから取得したアイキャッチ画像は、 Next.jsのプロジェクト内ではなく、 外部のサーバーに保存されています。

microCMS 画像URLを返す
Next.js ImageへURLを渡す
ブラウザー 画像を表示する

Imageへ画像URLを渡す

microCMS 記事のアイキャッチ画像
<Image
  src={article.eyecatch.url}
  alt={article.title}
  width={article.eyecatch.width}
  height={article.eyecatch.height}
/>

ただし、外部画像をImageで表示するには、 許可する画像URLを next.config.tsなどへ設定します。

remotePatternsを設定する

next.config.ts
import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  images: {
    remotePatterns: [
      {
        protocol: "https",
        hostname: "images.microcms-assets.io",
      },
    ],
  },
};

export default nextConfig;
protocol 通信方式 https
hostname 画像を取得するドメイン images.microcms-assets.io
セキュリティ設定

remotePatternsでは、 Next.jsのImageで読み込みを許可する外部画像の範囲を指定します。 必要なドメインだけを設定します。

10

fillを使って枠いっぱいに表示する

記事カードのサムネイルなどでは、 画像を決められた枠いっぱいに表示したいことがあります。

そのようなときは、 widthheightの代わりに fillを使えます。

FILL 親要素いっぱいに表示
<div className="thumbnail">
  <Image
    src={article.eyecatch.url}
    alt={article.title}
    fill
    sizes="(max-width: 767px) 100vw, 400px"
  />
</div>
CSS
.thumbnail {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  border-radius: 16px;
}

.thumbnail img {
  object-fit: cover;
}
親要素
Imageが枠全体に広がる
fillの注意点

fillを使う場合は、 親要素にposition: relative;を設定し、 幅と高さ、またはaspect-ratioで 表示領域を作ります。

11

sizesは何のために使う?

sizesは、 画像が画面上でどのくらいの横幅になるかを ブラウザーへ伝えるための指定です。

sizes="(max-width: 767px) 100vw, 400px"
画面幅が767px以下 100vw

画面幅いっぱい程度で表示

それより大きい画面 400px

約400pxで表示

Imageが画面上で400px程度しか使われないのに、 ブラウザーが非常に大きな画像を選ばないようにするための 手掛かりになります。

!

fillを使うときはsizesも確認

レスポンシブな画像でsizesを適切に設定すると、 表示幅に合った画像候補を選びやすくなります。

12

object-fitで画像の見せ方を調整する

画像の縦横比と表示枠の縦横比が違う場合は、 CSSのobject-fitで見せ方を調整できます。

object-fit: cover;
PHOTO
枠を埋める

一部が切れても、余白を作らずに表示します。

object-fit: contain;
PHOTO
全体を収める

画像全体を表示するため、余白ができる場合があります。

記事サムネイルの例
.thumbnail img {
  object-fit: cover;
}
写真のサムネイル cover

枠をきれいに埋めたい

ロゴや商品画像 contain

画像全体を見せたい

13

alt属性には何を書く?

Imageでもimgタグと同じように、 alt属性が必要です。

altには、 画像が表示されない場合や、 画像を視覚的に確認できない場合でも内容が伝わるように、 画像の意味を簡潔に書きます。

内容が分かりにくい alt="画像"
内容が分かる alt="窓辺で眠る白い猫"

記事タイトルを利用する例

microCMS 記事ごとにaltを変更
<Image
  src={article.eyecatch.url}
  alt={`${article.title}のアイキャッチ画像`}
  width={article.eyecatch.width}
  height={article.eyecatch.height}
/>
装飾だけの画像

情報を持たない装飾画像では、 状況に応じてalt=""とし、 読み上げの対象から外すことがあります。

14

ページ上部の重要な画像

通常のImageは、 画面に近づいたタイミングで読み込む遅延読み込みを利用します。

ただし、ページを開いた直後から見えるメインビジュアルなどは、 早く読み込みたい重要な画像です。

HEADER
最初から見える重要な画像
下に続くコンテンツ
ページ上部
HERO IMAGE 読み込みを優先したい画像
<Image
  src="/images/main-visual.jpg"
  alt="サービスのメインビジュアル"
  width={1600}
  height={900}
  preload
/>
すべてには付けない

読み込みを優先する指定は、 ページ上部の主要画像などに限定します。 多くの画像を同時に優先すると、 かえって読み込みを妨げる場合があります。

15

Next.jsでもimgタグを使う場面はある?

Next.jsだからといって、 すべてのimgタグが禁止されるわけではありません。

Next.jsの画像最適化を利用しないほうが適切な画像や、 特殊な実装ではimgタグを選ぶ場合があります。

Imageが向いている
  • 記事のアイキャッチ
  • 商品写真
  • メインビジュアル
  • プロフィール写真
  • 通常のコンテンツ画像
imgタグを検討する
  • 最適化しない特殊な画像
  • 外部ライブラリの制約がある画像
  • picture要素と細かく組み合わせる場合
  • Next.jsの最適化を意図的に使わない場合

通常のWebコンテンツ画像ではImageから考え、
Imageでは実現しにくい理由がある場合に imgタグを検討すると整理しやすくなります。

16

よくあるつまずき

CHECK 01 Imageをimportしていない
import Image from "next/image";
CHECK 02 publicをsrcへ書いている
src="/public/images/cat.jpg" src="/images/cat.jpg"
CHECK 03 widthとheightがない
<Image
  src="/images/cat.jpg"
  alt="窓辺に座っている猫"
  width={800}
  height={500}
/>
CHECK 04 外部画像のドメインを許可していない

microCMSなどの外部画像は、 next.config.tsのremotePatternsを確認します。

CHECK 05 fillの親要素に高さがない
.thumbnail {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
}
CHECK 06 fillを使っているのにsizesがない
<Image
  src={article.eyecatch.url}
  alt={article.title}
  fill
  sizes="(max-width: 767px) 100vw, 400px"
/>
CHECK 07 画像が不自然に引き伸ばされる

親要素の縦横比と画像の縦横比を確認し、 object-fit: cover;containを設定します。

CHECK 08 altが空欄またはすべて同じ

情報を伝える画像では、 画像ごとの内容が分かる代替テキストを設定します。

17

まとめ:通常の画像表示ではImageから考える

HTMLのimgタグとNext.jsのImageは、 どちらもWebページへ画像を表示するために使います。

Imageはimgタグの働きをもとに、 Next.jsの画像最適化機能を利用できるようにした Reactコンポーネントです。

今回覚えておきたいこと

  • imgタグはHTML標準の画像要素
  • ImageはNext.jsが提供するReactコンポーネント
  • Imageは端末に合った画像サイズの配信を支援する
  • 画像の遅延読み込みを利用できる
  • widthとheightは画像の縦横比を伝える役割もある
  • public内の画像ではsrcにpublicを書かない
  • 外部画像はremotePatternsで許可する
  • fillを使う場合は親要素に表示領域を作る
  • レスポンシブ画像ではsizesも確認する
  • altには画像の内容が分かる文章を書く
通常のコンテンツ画像 Image <Image ... />
特殊な用途や最適化不要 imgタグを検討 <img ... >

最初は、画像を一枚表示するために widthやheight、外部ドメインの設定まで必要になることを 少し複雑に感じました。

しかし、Imageは単に画像を表示するだけでなく、 画像によるページの重さや表示のずれを減らすために さまざまな情報を使っています。

Next.js・microCMS初心者の学習記録 通常の画像はImageから考え、
表示サイズと使用場所に合った設定を選びます。

AILPENGINE。自動進化型AI-LP。公開後も、成果に合わせて進化する! 行動計測、分析、構成改善、成果最大化。自前計測、CTA位置最適化、レポート可視化。LP改善を相談する(相談無料)。

日本ドラフトのAIチャットボットで問い合わせ対応を効率化・自動化!24時間365日対応、簡単設定、マルチプラットフォーム対応で人件費・工数を削減。今すぐ無料で相談する

※当社は、当サイトに掲載する情報について、正確性・完全性・有用性その他一切の事項を保証するものではありません。
また、当サイトの情報をご利用いただいたことにより生じた損害、ならびに当サイトからリンクまたはバナー等を通じて移動した外部サイトにおいて提供される情報・サービス等により生じた損害について、当社は一切の責任を負いかねます。