レスポンシブ画像

1 枚の写真は 1,000 語にも匹敵する内容を伝えます。また、画像はすべてのページにおいて非常に重要な役割を果たします。一方で、ダウンロードされるデータ量のほとんどを画像が占めることも少なくありません。レスポンシブ ウェブデザインでは、レイアウトだけでなく画像もデバイス特性に応じて変えることができます。

レスポンシブ ウェブデザインでは、レイアウトだけでなくコンテンツもデバイスの特性に応じて変えることができます。たとえば、高解像度(2x)のディスプレイでは、高解像度のグラフィックを使用することで鮮明に表示されます。幅が 50% の画像は、ブラウザの幅が 800 ピクセルであれば問題なく動作するかもしれませんが、狭いスマートフォンではスペースが大きすぎるため、小さな画面に合わせて縮小する場合も同じ帯域幅のオーバーヘッドが必要になります。

アート ディレクション

アート ディレクションの例

比率の変更、トリミング、画像全体の置き換えなど、画像の大幅な変更が必要となる場合もあります。この場合、画像の変更は通常、アート ディレクションと呼ばれます。その他の例については、responsiveimages.org/demos/ をご覧ください。

レスポンシブ画像

Udacity コースのスクリーンショット

ウェブページの読み込みに必要なバイト数の平均の 60% 以上を画像が占めていることをご存じですか?

このコースでは、最新のウェブで画像を操作して、どのデバイスでも画像を適切に表示し、すばやく読み込めるようにする方法を学びます。

また、レスポンシブ画像を開発ワークフローにスムーズに取り入れることができるよう、幅広いスキルとテクニックをご紹介します。コースの終わりまでに、さまざまなビューポート サイズと使用シナリオに適応して応答する画像を開発できるようになります。

これは Udacity が提供する無料のコースです。

コースを受講する

マークアップ内の画像

img 要素はコンテンツのダウンロード、デコード、レンダリングをする際に非常に便利です。また、最新のブラウザでは幅広い画像形式がサポートされています。複数の端末に対応した画像を使用するとデスクトップの表示との差がなくなり、わずかな調整だけで快適なエクスペリエンスを実現できます。

概要

  • 相対サイズを使用すると、意図せず画像がコンテナからはみ出るのを防止できます。
  • デバイス特性に応じて異なる画像を指定(アート ディレクション)する場合は、picture 要素を使用します。
  • img 要素で srcsetx 記述子を使用して、さまざまな密度の中から使用するのに最適な画像に関するヒントをブラウザに提供します。
  • ページに画像が 1 つか 2 つしかなく、それらがサイトの他の場所で使用されていない場合は、インライン画像を使用してファイル リクエストを減らすことを検討してください。

画像に相対サイズを使用する

意図せず画像がビューポートからはみ出ることを防ぐために、画像の幅の指定では必ず相対的な単位を使用してください。たとえば、width: 50%; と指定すると、画像の幅が、その画像を含む要素(ビューポートや実際のピクセルのサイズではない)の幅の 50% になります。

CSS ではコンテンツをコンテナからオーバーフローさせることができるため、画像や他のコンテンツがはみ出さないよう、max-width: 100% の使用が必要となります。例:

img, embed, object, video {
    max-width: 100%;
}

img 要素の alt 属性を使用して、画像についてのわかりやすい説明を必ず追加してください。これらの説明でスクリーン リーダーなどの支援技術にコンテキストを提供することにより、サイトへのアクセシビリティが向上します。

高 DPI デバイス向けに srcsetimg を拡張する

srcset 属性を使用すると、img 要素の動作を拡張し、さまざまなデバイス特性に合わせた複数の画像ファイルを簡単に提供できます。CSS ネイティブの image-set CSS 関数と同様に、srcset を使用すると、ブラウザ側でデバイス特性に応じて最適な画像を選択できます。たとえば、2x のディスプレイでは 2x の画像を使用することができます。さらに将来的には、2x のデバイスでもネットワークの帯域幅が限られている場合は 1x の画像を使用するなどの対応が可能になります。

<img src="photo.png" srcset="photo@2x.png 2x" ...>

srcset をサポートしていないブラウザでは、src 属性に指定されたデフォルトの画像ファイルが使用されます。このため、機能に関係なくあらゆるデバイスで表示できる 1x の画像を必ず含めることが重要です。srcset がサポートされている場合は、カンマ区切りで指定された複数の画像と 条件のリストの解析後にリクエストが送信され、最適な画像のみがダウンロードされて表示されます。

この条件にはピクセル密度から幅や高さまであらゆる項目を含めることができますが、現時点で適切にサポートされているのはピクセル密度のみです。現在の動作と将来的な機能のバランスを考慮し、この属性は 2x の画像の提供にのみ利用してください。

picture を使用したレスポンシブ画像でのアート ディレクション

アート ディレクションの例

デバイスの特性(アート ディレクション)に基づいて画像を変更するには、picture 要素を使用します。picture 要素は、デバイスサイズ、デバイスの解像度、向きなどのさまざまな特性に基づいて、複数のバージョンの画像を提供する宣言型ソリューションを定義します。

picture 要素は、1 つの画像のソースに対して密度の異なる画像が複数存在する場合、またはレスポンシブ デザインで一部のタイプの画面に別の画像を表示するよう指定する場合に使用します。video 要素と同様に、複数の source 要素を含めることができ、メディアクエリや画像形式に応じて異なる画像ファイルを指定できます。

<picture>
  <source media="(min-width: 800px)" srcset="head.jpg, head-2x.jpg 2x">
  <source media="(min-width: 450px)" srcset="head-small.jpg, head-small-2x.jpg 2x">
  <img src="head-fb.jpg" srcset="head-fb-2x.jpg 2x" alt="a head carved out of wood">
</picture>

試してみる

上記の例では、ブラウザの幅が 800 px 以上の場合、デバイスの解像度に応じて head.jpg または head-2x.jpg が使用されます。ブラウザのサイズが 450 ~ 800 ピクセルの場合、ここでもデバイスの解像度に応じて head-small.jpg または head-small- 2x.jpg が使用されます。画面幅が 450 ピクセル未満の場合や、picture 要素がサポートされていない下位互換性の場合、ブラウザは代わりに img 要素をレンダリングします。この要素は常に含める必要があります。

相対的なサイズの画像

画像の最終的なサイズが不明な場合、画像ソースの密度記述子を指定することは困難です。これは特に、ブラウザのサイズに応じて、ブラウザの幅に比例したサイズになるフルードな画像の場合に当てはまります。

画像のサイズと密度を固定値で指定する代わりに、提供する各画像サイズを幅の記述子と画像要素のサイズで指定すると、ブラウザ側で自動的に実際のピクセル密度を計算して最適な画像を選択してダウンロードできます。

<img src="lighthouse-200.jpg" sizes="50vw"
     srcset="lighthouse-100.jpg 100w, lighthouse-200.jpg 200w,
             lighthouse-400.jpg 400w, lighthouse-800.jpg 800w,
             lighthouse-1000.jpg 1000w, lighthouse-1400.jpg 1400w,
             lighthouse-1800.jpg 1800w" alt="a lighthouse">

試してみる

上の例では、横幅がビューポート幅の半分(sizes="50vw")になるように画像をレンダリングし、ブラウザ ウィンドウのサイズに関係なく、ブラウザの幅とデバイス ピクセル比に応じて、ブラウザで適切な画像を選択しています。たとえば、以下の表にブラウザが選択する画像を示します。

ブラウザの幅 デバイスのピクセル比 使用される画像 有効な解決策
400px 1 200.jpg 1x
400px 2 400.jpg 2 倍
320px 2 400.jpg 2.5 倍
600px 2 800.jpg 2.67 倍
640px 3 1000.jpg 3.125 倍
1100px 1 800.png 1.45 倍

レスポンシブ画像におけるブレークポイントの効果

多くの場合、画像サイズはサイトのレイアウトのブレークポイントによって変わる可能性があります。たとえば、狭い画面では画像をビューポートの幅全体に広げたほうがよいのに対し、広い画面では画像の占める部分を抑える必要があります。

<img src="400.png"
     sizes="(min-width: 600px) 25vw, (min-width: 500px) 50vw, 100vw"
     srcset="100.png 100w, 200.png 200w, 400.png 400w,
             800.png 800w, 1600.png 1600w, 2000.png 2000w" alt="an example image">

試してみる

上の例の sizes 属性では、複数のメディア クエリを使用して画像のサイズを指定しています。ブラウザ幅が 600px より広い場合は画像をビューポート幅の 25% に、ブラウザ幅が 500px ~ 600px の場合はビューポート幅の 50% に、ブラウザ幅が 500px 未満の場合はビューポート幅と同じになるように、それぞれ指定しています。

商品の画像を拡大できるようにする

J.商品画像を拡大できる J. Crews のウェブサイト
J. 展開可能な商品画像が表示された Crew のウェブサイト。

ユーザーは購入しようとしている商品を見たいと考えます。ショッピング サイトでは商品画像を高解像度で拡大して詳細を確認できることを期待します。これができないと、調査の参加者は不満を感じるとの研究結果が出ています。

画像をタップして拡大できる適切な例として、J. クルーのサイト。一定時間後に非表示になるオーバーレイで画像をタップできることを説明し、画像をズームインして適切な詳細を見ることができるようにしています。

その他の画像テクニック

圧縮画像

圧縮画像手法により、デバイスの実際の機能に関係なく、高圧縮の 2 倍の画像がすべてのデバイスに配信されます。画像の種類や圧縮レベルによっては、画像の品質に変化がないように見える場合もありますが、ファイルサイズは大幅に削減されます。

試してみる

JavaScript で画像を置き換える

JavaScript による画像置換では、デバイスの機能を確認し、「適切な処理」を行います。window.devicePixelRatio でデバイスのピクセル比を決定し、画面の幅と高さを取得できます。また、navigator.connection でネットワーク接続を盗み見たり、偽のリクエストを発行したりすることもできます。これらの情報をすべて収集すると、読み込む画像を決定できます。

このアプローチの大きな欠点の一つは、JavaScript を使用すると、少なくとも先読みパーサーが完了するまで画像の読み込みが遅れることです。つまり、画像のダウンロードは、pageload イベントが発生するまで開始されません。また、ブラウザは 1x と 2x の両方の画像をダウンロードする可能性が高いため、ページの容量が増加します。

インライン画像: ラスターとベクター

画像の作成および保存方法は基本的に 2 種類あり、画像をレスポンシブに配信する方法に影響します。

ラスター画像(写真やその他の画像など)は、個々のカラードットのグリッドとして表現されます。ラスター画像はカメラやスキャナーから生成されるか、HTML Canvas 要素を使用して作成されます。ラスター画像の保存には、PNG、JPEG、WebP などの形式が使用されます。

ロゴやラインアートなどのベクター画像は、曲線、直線、形状、塗りつぶし色、グラデーションで定義されます。ベクター画像は、Adobe Illustrator や Inkscape などのプログラムを使用して作成することも、SVG などのベクター形式を使用してコードで手書きすることもできます。

SVG

SVG を使用すると、ウェブページにレスポンシブなベクター グラフィックを含めることができます。ラスター ファイル形式に対してベクター ファイル形式を使用する利点は、ブラウザでは任意のサイズでベクター画像をレンダリングできることです。ベクター形式では画像のジオメトリ、つまり直線、曲線、色などの構成を記述します。一方ラスター形式では、独立した色のドットに関する情報のみを使用するため、ブラウザはスケーリング時に空白を埋める方法を推測する必要があります。

以下に、同じ画像の 2 つのバージョンを示します。左側の PNG 画像と右側の SVG です。SVG はどのサイズでも適切に表示されますが、左の PNG は大画面では不鮮明になります。

HTML5 ロゴ、PNG 形式
HTML5 ロゴ、SVG 形式

ページから送信されるファイル リクエストの数を減らすには、SVG 形式または Data URI 形式を使用して、画像をインラインでコーディングします。このページのソースを表示すると、以下のロゴが Data URI と SVG を使用してインラインで宣言されていることがわかります。

SVG はモバイルとデスクトップで幅広くサポートされており、最適化ツールによって SVG のサイズを大幅に削減できます。次のインライン SVG ロゴは一見同じようですが、一方は約 3 KB、他方はわずか 2 KB です。

Data URI

データ URI を利用すると、画像などのファイルをインラインとして埋め込むことができます。次の形式を使用して、img 要素の src を Base64 エンコード形式の文字列で設定します。

<img src="data:image/svg+xml;base64,[data]">

上記の HTML5 ロゴのコードの開始部分は次のようになります。

<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiB
BZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW ...">

(完全版の長さは 5,000 文字を超えます)。

jpillora.com/base64-encoder などのドラッグ アンド ドロップ ツールを使用して、画像などのバイナリ ファイルを Data URI に変換することができます。SVG と同様に、Data URI はモバイルおよびパソコンのブラウザで適切にサポートされています。

CSS でのインライン化

Data URI と SVG は CSS でインライン化することもできます。これはモバイルとデスクトップの両方でサポートされています。以下に示すのは、CSS で背景画像として実装された 2 つの画像です。どちらも同じように見えますが、片方は Data URI でもう片方は SVG です。

インライン化の長所と短所

画像のインライン コード、特に Data URI は冗長になる可能性があります。では、なぜこの技術を使う必要があるのでしょうか。それは、HTTP リクエストを減らすためです。SVG とデータ URI を使用すると、画像、CSS、JavaScript を含むウェブページ全体を 1 回のリクエストで取得できます。

短所:

  • モバイルでは、外部の src の画像よりも Data URI を表示するほうがはるかに遅くなる可能性があります。
  • データ URI を使用すると、HTML リクエストのサイズが大幅に増大する可能性があります。
  • マークアップやワークフローが複雑になります。
  • Data URI 形式はバイナリよりかなり大きい(最大 30%)ため、合計ダウンロード サイズは縮小されません。
  • データ URI はキャッシュできないため、データ URI を使用するすべてのページでダウンロードする必要があります。
  • IE 6 および 7 はサポート対象外で、IE8 でも完全にはサポートされていません。
  • HTTP/2 では、アセット リクエストを削減すると優先順位が下がります。

他のあらゆるレスポンシブ対応と同様に、テストによって最適な方法を見つける必要があります。デベロッパー ツールを使用して、ダウンロード ファイルのサイズ、リクエストの数、合計レイテンシを測定します。Data URI はラスター画像に役立つ場合があります。たとえば、他の場所で使用されていない写真が 1 ~ 2 枚だけあるホームページなどで使用します。ベクター画像をインライン化する必要がある場合は、SVG の使用をお勧めします。

CSS での画像処理

CSS の background プロパティは、要素に複雑な画像を追加するための強力なツールで、複数の画像を簡単に追加して繰り返し表示することができます。background プロパティをメディアクエリと組み合わせると、画面の解像度やビューポートのサイズなどの条件に基づいて選択的に画像を読み込むなどの高度な処理が可能です。

概要

  • 画面サイズ、端末の解像度、ページ レイアウトを考慮して、ディスプレイ特性に合った最適な画像を使用します。
  • メディアクエリで min-resolution-webkit-min-device-pixel-ratio を指定して、高 DPI ディスプレイの CSS の background-image プロパティを変更します。
  • マークアップ内の 1x の画像に加えて、srcset を使用して高解像度の画像を提供します。
  • JavaScript の画像置換を利用する場合や、低解像度の端末に高圧縮かつ高解像度の画像を表示する場合は、パフォーマンスへの影響を考慮します。

メディアクエリを使用して画像の選択的な読み込みやアート ディレクションを行う

メディアクエリはページ レイアウトの変更だけでなく、ビューポート幅に応じた画像の条件付き読み込みやアート ディレクションにも利用できます。

たとえば、以下の例では、小さい画面の場合は small.png のみがダウンロードされてコンテンツの div に適用されるのに対し、大きい画面の場合は background-image: url(body.png) が body に、background-image: url(large.png) がコンテンツの div にそれぞれ適用されます。

.example {
  height: 400px;
  background-image: url(small.png);
  background-repeat: no-repeat;
  background-size: contain;
  background-position-x: center;
}

@media (min-width: 500px) {
  body {
    background-image: url(body.png);
  }
  .example {
    background-image: url(large.png);
  }
}

試してみる

image-set を使用して高解像度の画像を表示する

CSS の image-set() 関数を使用して background プロパティの動作を拡張することで、特性の異なる各デバイス向けに複数の画像ファイルを簡単に配信できます。これを利用して、ブラウザでデバイスの特性に応じて最適な画像を選択できます。たとえば、ディスプレイが 2x の場合は 2x の画像を使用する、デバイスが 2x でもネットワークが低速の場合は 1x の画像を使用する、といったことが可能です。

background-image: image-set(
    url(icon1x.jpg) 1x,
    url(icon2x.jpg) 2x
);

適切な画像を読み込むほかに、ブラウザではスケーリングも適宜実施します。つまり、ブラウザは 2 倍の画像が 1 倍の画像の 2 倍の大きさであると想定し、2 倍の画像を 2 倍に縮小して、ページ上で同じサイズに見えるようにします。

image-set() のサポートは始まったばかりで、現在は Chrome と Safari のみで -webkit ベンダー プレフィックス付きでサポートされています。image-set() がサポートされていない場合のフォールバック画像を含めるように注意してください。次に例を示します。

.sample {
  width: 128px;
  height: 128px;
  background-image: url(icon1x.png);
  background-image: -webkit-image-set(
    url(icon1x.png) 1x,
    url(icon2x.png) 2x
  );
  background-image: image-set(
    url(icon1x.png) 1x,
    url(icon2x.png) 2x
  );
}

試してみる

上の例では、image-set に対応しているブラウザでは適切なアセットを読み込み、非対応の場合は 1x のアセットを代用します。ただし、image-set() をサポートするブラウザは少ないため、ほとんどのブラウザでは 1x のアセットが読み込まれる点に注意してください。

メディアクエリを使用して高解像度の画像の表示やアート ディレクションを行う

メディアクエリでは、デバイスのピクセル比に基づいてルールを作成し、2 倍のディスプレイと 1 倍のディスプレイに異なる画像を指定できます。

@media (min-resolution: 2dppx),
(-webkit-min-device-pixel-ratio: 2)
{
    /* High dpi styles & resources here */
}

Chrome、Firefox、Opera は標準の (min-resolution: 2dppx) をサポートしていますが、Safari と Android のブラウザでは、dppx 単位を付けない古いベンダー プレフィックスの構文を使用する必要があります。これらのスタイルはデバイスがメディアクエリに一致する場合にのみ読み込まれること、および、基本となるスタイルを指定する必要があることに注意してください。また、ブラウザが解像度固有のメディアクエリに非対応であっても、なんらかの画像が確実にレンダリングされるというメリットもあります。

.sample {
  width: 128px;
  height: 128px;
  background-image: url(icon1x.png);
}

@media (min-resolution: 2dppx), /* Standard syntax */
(-webkit-min-device-pixel-ratio: 2)  /* Safari & Android Browser */
{
  .sample {
    background-size: contain;
    background-image: url(icon2x.png);
  }
}

試してみる

min-width 構文を使用して、ビューポートのサイズに応じて代替画像を表示することもできます。この方法には、メディア クエリに一致しなければ画像がダウンロードされないというメリットがあります。たとえば、bg.png はブラウザの幅が 500px 以上ある場合にのみダウンロードされて body に適用されます。

@media (min-width: 500px) {
    body {
    background-image: url(bg.png);
    }
}

アイコンに SVG を使用する

ページにアイコンを追加する際は、可能な限り SVG のアイコンを使用するか、場合によっては Unicode 文字を使用します。

概要

  • アイコンにはラスター画像ではなく、SVG か Unicode を使用します。

シンプルなアイコンを Unicode に置き換える

多くのフォントではさまざまな Unicode グリフをサポートしており、画像の代わりにこれらのグリフを利用できます。画像とは異なり、Unicode フォントは劣化なしでスケーリングできるため、画面上でのフォントサイズにかかわらず鮮明に表示されます。

Unicode には通常の文字セット以外にも、矢印(←)、数学記号(√)、幾何学模様(★)、制御機能用記号(▶)、音楽記号(♬)、ギリシャ文字(Ω)、チェスの駒(♞)などの記号が含まれています。

Unicode 文字は、HTML エンティティと同じように「&#XXXX」の形式で入力できます。「XXXX」には Unicode 文字の番号を指定します。例:

You're a super &#9733;

あなたはスーパー ★

複雑なアイコンを SVG に置き換える

複雑なアイコンを使う必要がある場合は、SVG アイコンを使用します。SVG アイコンは一般に軽量で使いやすいほか、CSS でスタイルを設定できます。SVG には、ラスター画像と比較して次のような数多くのメリットがあります。

  • ベクター グラフィックであるため、無限にスケーリングできます。
  • 色、影、透明度、アニメーションなどの CSS 効果を直接適用できます。
  • SVG 画像は、ドキュメント内で直接インライン化できます。
  • セマンティックです。
  • 適切な属性を使用することでアクセシビリティが向上します。
With SVG icons, you can either add icons using inline SVG, like
this checkmark:
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg"
       xmlns:xlink="http://www.w3.org/1999/xlink"
       width="32" height="32" viewBox="0 0 32 32">
    <path d="M27 4l-15 15-7-7-5 5 12 12 20-20z" fill="#000000"></path>
  </svg>
or by using an image tag, like this credit card icon:
<img src="credit.svg">.

試してみる

アイコン フォント使用時の注意点

フォント アイコンに Font Awesome を使用するページの例。
フォント アイコンに Font Awesome を使用するページの例

アイコン フォントは使いやすく、広く利用されていますが、SVG アイコンと比較するといくつかの欠点があります。

  • ベクター グラフィックであるため無限にスケーリングできますが、アンチエイリアス処理のためアイコンの輪郭が不鮮明になる場合があります。
  • CSS によるスタイル設定には制限があります。
  • line-height や letter-spacing などの設定によっては、ピクセル単位での完全な位置指定が難しい場合があります。
  • セマンティックではないため、スクリーン リーダーなどのユーザー補助機能で利用しづらい場合があります。
  • 使用範囲を適切に指定しないと、一部のアイコンを使用するためだけにファイルサイズが大きくなる場合があります。
With Font Awesome, you can either add icons by using a unicode
entity, like this HTML5 logo (<span class="awesome">&#xf13b;</span>)
or by adding special classes to an &lt;i&gt; element like the CSS3
logo (<i class="fa fa-css3"></i>).

試してみる

Font AwesomePictosGlyphicons など、有料および無料のアイコン フォントが数多く提供されています。

HTTP リクエストやファイルサイズの増加分とアイコンの必要性のバランスを必ず考慮してください。たとえば、必要なアイコンの数が限られている場合は、画像または画像スプライトを使用したほうが良いかもしれません。

画像を最適化してパフォーマンスを向上

ダウンロード容量の大半を画像が占めることはよくあり、ページ上の表示スペースのかなりの部分を画像が占有することも少なくありません。そのため、画像を最適化することでウェブサイトの容量の大幅な削減とパフォーマンスの改善につながることがよくあります。ブラウザでダウンロードする必要がある容量が少ないほど、クライアントの帯域幅における競合は減り、ブラウザですべてのアセットをダウンロードして画面に表示するまでの時間も短縮されます。

概要

  • 画像形式は無作為に選択せず、利用可能な各形式を理解したうえで最適なものを使用します。
  • ワークフローに画像の最適化ツールと圧縮ツールを含めて、ファイルサイズを削減します。
  • 利用頻度の高い画像を image sprites にまとめて、HTTP リクエストの回数を減らします。
  • 最初に読み込むページ容量を減らし、読み込み時間を短縮するために、画面をスクロールして画像がビューに表示されてからデータを読み込むようにします。

適切な形式を選択する

画像には、ベクター画像ラスター画像の 2 種類があります。ラスター画像の場合は、適切な圧縮形式(GIFPNGJPG など)の選択も必要です。

ラスター画像とは、写真などの画像が個々のドットやピクセルのグリッドで表現されたものです。ラスター画像は通常、カメラやスキャナで作成されますが、ブラウザ内で canvas 要素を使用して作成することもできます。画像サイズが大きくなると、ファイルのサイズも大きくなります。ラスター画像は元のサイズよりも大きくスケーリングすると、ブラウザ側で欠落しているピクセルを推測して補間する必要があるため、画像が不鮮明になります。

ロゴやラインアートなどのベクター画像は、曲線、直線、形状、塗りつぶし色の集合として定義されます。ベクター画像は、Adobe Illustrator や Inkscape などのプログラムを使用して作成され、SVG などのベクター形式で保存されます。ベクター画像はシンプルなプリミティブで構成されているため、ファイルサイズを変えることなく、品質を低下させずにスケーリングできます。

適切な形式を選択するには、画像形式(ラスターまたはベクター)とコンテンツ(色、アニメーション、テキストなど)の両方を考慮することが重要です。すべての画像タイプに適合する形式はありません。それぞれに長所と短所があります。

適切な形式を選ぶ際は、まず次のガイドラインを参考にしてください。

  • 写真画像には JPG を使用します。
  • ベクターアートや単色のグラフィック(ロゴやラインアートなど)には、SVG を使用します。ベクターアートを利用できない場合は、WebP または PNG を使用します。
  • GIF ではなく PNG を使用すると、豊富な色が可能になり、圧縮率が向上します。
  • 長いアニメーションには、画質が良く、ユーザー側での再生操作が可能な <video> を使用することを検討します。

ファイルサイズを小さくする

画像ファイルのサイズは、保存後に「後処理」を行うことで大幅に削減できます。画像圧縮には、非可逆圧縮と可逆圧縮、オンライン、GUI、コマンドラインなど、さまざまなツールがあります。可能であれば、ワークフローに画像の最適化を組み込むように、画像の最適化を自動化することをおすすめします。

JPG ファイルと PNG ファイルを、画質を下げずに可逆圧縮できるツールがいくつかあります。JPG の場合は、jpegtran または jpegoptim を試します(Linux でのみ利用可能、--strip-all オプションを付けて実行)。PNG の場合は、OptiPNG または PNGOUT を試してください。

画像スプライトを使用する

例で使用されている画像スプライトシート

CSS スプライトとは、複数の画像を 1 つの「スプライト シート」という画像にまとめる手法です。個々の画像を使用するには、要素の背景画像(スプライト シート)とオフセットを指定して目的のパーツを表示します。

.sprite-sheet {
  background-image: url(sprite-sheet.png);
  width: 40px;
  height: 25px;
}

.google-logo {
  width: 125px;
  height: 45px;
  background-position: -190px -170px;
}

.gmail {
  background-position: -150px -210px;
}

.maps {
  height: 40px;
  background-position: -120px -165px;
}

試してみる

画像スプライトを使用すると、複数の画像を取得するために必要なダウンロードの回数を減らせるというメリットがあります。ただし、キャッシュは有効にしておく必要があります。

遅延読み込みの使用を検討する

遅延読み込みを使用すると、未表示の部分に多数の画像を含んだ長いページの読み込み時間を大幅に短縮できます。必要に応じて画像を読み込むか、メイン コンテンツの読み込みとレンダリングの完了後に画像を読み込むことで時間を短縮します。遅延読み込みを使用すると、パフォーマンスの向上だけでなく、無限にスクロールするページの作成も可能になります。

無限にスクロールするページを作成する場合、コンテンツは表示される時点で読み込まれるため、検索エンジンでコンテンツを認識できない場合があることに注意してください。また、ユーザーがフッターにある情報を見たい場合でも、新しいコンテンツが次々と読み込まれるため、フッターにたどり着きません。

画像は極力使用しない

画像そのものを使わずに、画像を表現した方が好ましい場合もあります。可能であれば、同じ機能や類似した機能を提供する、ブラウザのネイティブ機能を使用してください。ブラウザでは、従来は画像を必要としていたビジュアルを実現できます。これにより、ブラウザで個々の画像ファイルをダウンロードする必要がなく、画像のサイズが変更されて不自然になることもありません。アイコンのレンダリングには、Unicode または専用のアイコン フォントを使用できます。

テキストは画像に埋め込まずにマークアップに含める

テキストは、できるだけ画像に埋め込まず、テキスト形式のままにします。たとえば、見出しに画像を使用したり、電話番号や住所などの連絡先情報を画像に埋め込んでしまうと、ユーザーはその情報をコピー&ペーストできません。さらに、スクリーン リーダーも情報を取得できず、レスポンシブでなくなります。テキストはマークアップ内に配置し、必要な場合はウェブフォントを使用して所要のスタイルを適用してください。

CSS を使用して画像を置き換える

最新のブラウザでは、従来は画像を必要としていたスタイルを CSS の機能を使用して実現できます。たとえば、複雑なグラデーションは background プロパティ、シャドウは box-shadow、角の丸みは border-radius プロパティを使用して作成できます。

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sit amet augue eu magna scelerisque porta ut ut dolor. Nullam placerat egestas nisl sed sollicitudin. Fusce placerat, ipsum ac vestibulum porta, purus dolor mollis nunc, pharetra vehicula nulla nunc quis elit. Duis ornare fringilla dui non vehicula. In hac habitasse platea dictumst. Donec ipsum lectus, hendrerit malesuada sapien eget, venenatis tempus purus.

<style>
    div#noImage {
    color: white;
    border-radius: 5px;
    box-shadow: 5px 5px 4px 0 rgba(9,130,154,0.2);
    background: linear-gradient(rgba(9, 130, 154, 1), rgba(9, 130, 154, 0.5));
    }
</style>

なお、これらの手法を使用するにはレンダリング サイクルが必要で、モバイルではレンダリング サイクルが大きくなる可能性があります。使用しすぎると、CSS 化で得られるメリットが失われるほか、パフォーマンスが低下するおそれもあります。