アイコン

ほとんどの画像はコンテンツの一部ですが、アイコンはユーザー インターフェースの一部です。 UI のテキストのスケーリングと適応と同じ方法でスケーリングと適応を行う必要があります。

スケーラブルなベクター グラフィック

写真画像に関しては、JPG、WebP、AVIF などさまざまな画像形式を選択できます。写真以外の画像の場合は、Portable Network Graphics(PNG)形式か Scalable Vector Graphics(SVG)形式のどちらかを選択できます。

PNG と SVG はどちらもフラットカラーの領域の処理に適しており、どちらでも画像の背景を透明にできます。PNG を使用する場合は、サイズの異なる画像のバージョンを複数作成し、img 要素で srcset 属性を使用して画像をレスポンシブにする必要があります。SVG を使用する場合は、デフォルトでレスポンシブです。

PNG(および JPG、WebP、AVIF)はビットマップ画像です。ビットマップ画像はピクセルとして情報を保存します。SVG では、情報は描画指示として保存されます。ブラウザが SVG ファイルを読み取ると、指示はピクセルに変換されます。なお、これらの手順は相対的なものです。ラインとシェイプの表現に使用する寸法に関係なく、すべてが適切な鮮明さでレンダリングされます。サイズが異なる SVG を複数作成する代わりに、1 つの SVG を作成してあらゆるサイズに対応できます。srcset 属性を使用する必要はありません。

<img src="image.svg" alt="A description of the image." width="25" height="25">
<img src="image.svg" alt="A description of the image." width="250" height="250">

XML を使用して、手順を SVG ファイルに記述します。これは、HTML のようなマークアップ言語です。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="-21 -21 42 42" width="100" height="100">
  <title>Smiling face</title>
  <circle r="20" fill="yellow" stroke="black"/>
  <ellipse rx="2.5" ry="4" cx="-6" cy="-7" fill="black"/>
  <ellipse rx="2.5" ry="4" cx="6" cy="-7" fill="black"/>
  <path stroke="black" d="M -12,5 A 13.5,13.5,0 0,0 12,5 A 13,13,0 0,1 -12,5"/>
</svg>

笑顔。

HTML 内に SVG を含めることもできます。

<figure>
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="-21 -21 42 42" width="100" height="100">
    <title>Smiling face</title>
    <circle r="20" fill="yellow" stroke="black"/>
    <ellipse rx="2.5" ry="4" cx="-6" cy="-7" fill="black"/>
    <ellipse rx="2.5" ry="4" cx="6" cy="-7" fill="black"/>
    <path stroke="black" d="M -12,5 A 13.5,13.5,0 0,0 12,5 A 13,13,0 0,1 -12,5"/>
  </svg>
  <figcaption>
  A description of the image.
  </figcaption>
</figure>

このような SVG を埋め込むことで、ブラウザが行う必要のあるリクエストが 1 つ減ります。画像は HTML ... と一緒に配信されるため、ダウンロードが完了するまで待つ必要はありません。また、まもなく説明するように、このような SVG を埋め込むことで、スタイル設定もより細かく制御できます。

アイコンとテキスト

アイコンの画像は多くの場合、透明な背景の上にシンプルな形をしています。SVG はアイコンに適しています。

テキストと内部にアイコンを含むボタンやリンクがある場合、アイコンはプレゼンテーション用です。重要なのはテキストです。img 要素を使用する場合、空の alt 属性は、画像がプレゼンテーション用であることを示します。

<button>
<img src="hamburger.svg" alt="" width="16" height="16">
Menu
</button>

CSS は表示用であるため、アイコンを CSS に背景画像として配置することもできます。

<button class="menu">
Menu
</button>
.menu {
  background-image: url(hamburger.svg);
  background-position: 0.5em;
  background-repeat: no-repeat;
  background-size: 1em;
  padding-inline-start: 2em;
}

SVG を HTML 内に配置する場合は、aria-hidden 属性を使用して支援技術に表示されないようにします。

<button class="menu">
  <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 80" width="16" height="16">
    <rect width="100" height="20" />
    <rect y="30" width="100" height="20"/>
    <rect y="60" width="100" height="20"/>
  </svg>
  Menu
</button>

スタンドアロンのアイコン

目的を明確にしたい場合は、ボタンやリンクの内側にテキストを使用します。テキストのないアイコンを使用できますが、すべてのユーザーが特定のアイコンの意味を理解しているとは限りません。判断に迷う場合は、実際のユーザーでテストしてください。

テキストなしでアイコンを使用すると、アイコンは見栄えが良くなくなります。CSS の背景画像は、アイコンを表示する適切な方法ではありません。アイコンには、HTML でユーザー補助機能用の名前を付ける必要があります。

img 要素を使用する場合、アイコンには alt 属性からアクセス可能な名前が付けられます。

<button>
<img src="hamburger.svg" alt="Menu" width="16" height="16">
</button>

もう一つの方法は、リンクやボタン自体にユーザー補助機能用の名前を付け、画像がプレゼンテーション用であることを宣言することです。aria-label 属性を使用して、ユーザー補助機能用の名前を指定します。

<button aria-label="Menu">
<img src="hamburger.svg" alt="" width="16" height="16">
</button>

SVG を HTML 内に配置する場合は、リンクやボタンに aria-label 属性を使用してわかりやすい名前を付けて、アイコンには aria-hidden 属性を使用します。

<button aria-label="Menu">
  <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 80" width="16" height="16">
    <rect width="100" height="20" />
    <rect y="30" width="100" height="20"/>
    <rect y="60" width="100" height="20"/>
  </svg>
</button>

スタイル設定のアイコン

SVG アイコンを HTML に直接埋め込むと、ページ内の他の要素と同様に、アイコンの一部のスタイルを設定できます。img 要素を使用してアイコンを表示する場合、これはできません。

次の例では、SVG 内の rect 要素の fill 値が blue になっており、ボタンのテキストのスタイルと一致しています。

button {
 color: blue;
}
button rect {
  fill: blue;
}

hover スタイルと focus スタイルも適用できます。

button:hover,
button:focus {
  color: red;
}
button:hover rect,
button:focus rect {
  fill: red;
}

関連情報

アイコンは、サイトのブランディングの重要な要素です。次は、テーマ設定を活用して、ブランディングの他の要素をレスポンシブにする方法を説明します。

理解度チェック

アイコンに関する知識をテストする

SVG は、1 つのファイル、または <svg> コードブロックであらゆるピクセル密度を処理できます。

正しい
SVG には、任意のピクセル密度、縮尺、ズームで図形や線を描画する方法が用意されています。
誤り
.png.jpg とは異なり、SVG には srcset 要素や <picture> 要素は必要ありません。

SVG コードを HTML に直接含めることのメリットは何ですか。

CSS からスタイル設定可能
SVG のアイコンの形状をボタンやブランドカラーと一致させます。
ダウンロードは不要です。
手順はすべて記載されています。
デフォルトで遅延読み込み。
面倒なダウンロードはありません。
CPU 使用率が低くなります。
私が作り上げたものだ。
新しいアセットなしでライトまたはダークのテーマを設定します。
メディアクエリでインライン SVG スタイルを変更できるようになりました。