コンテンツにスキップ

非テキストコンテンツには代替テキストを提供する

このガイドラインが達成されないとどうなるか

Section titled “このガイドラインが達成されないとどうなるか”

結果的に、視覚に依存できないユーザーは、ページの内容を正しく理解できず、誤った操作をしてしまう可能性があります。

具体例:ECサイトでの困りごと

Bさんはスクリーンリーダーを使用してオンラインショッピングをしています。 商品画像に代替テキストが設定されていないため、どのような商品なのか分かりません。 「image_12345.jpg」と読み上げられても、商品の色やデザインが分からず、購入を諦めることになりました。

以下のデモでスクリーンリーダーでの読み上げの違いを確認してください。

悪い例: 代替テキストがない・不適切

<p>代替テキストがない</p>
<img src="data:image/svg+xml," />

<p>ファイル名がそのまま入っている</p>
<img src="data:image/svg+xml," alt="IMG_user_profile_2024.jpg" />

<p>アイコンボタンに代替テキストがない</p>
<button>
  <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
    <path d="M3 6h18M3 12h18M3 18h18"/>
  </svg>
</button>

<p>見た目を説明している(機能を説明すべき)</p>
<button aria-label="バツ印">
  <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
    <path d="M18 6L6 18M6 6l12 12"/>
  </svg>
</button>

良い例: 適切な代替テキストが設定されている

<p>意味のある代替テキスト</p>
<img src="data:image/svg+xml," alt="YUMEMIのロゴマーク" />

<p>適切なユーザープロファイル説明</p>
<img src="data:image/svg+xml," alt="田中太郎のプロフィール写真" />

<p>アイコンボタンに代替テキストがある</p>
<button>
  <svg role="img" aria-label="メニューを開く" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
    <path d="M3 6h18M3 12h18M3 18h18"/>
  </svg>
</button>

<p>機能を説明している</p>
<button>
  <svg role="img" aria-label="閉じる" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
    <path d="M18 6L6 18M6 6l12 12"/>
  </svg>
</button>

最低限、すぐに取り組めること

Section titled “最低限、すぐに取り組めること”
  • 機能要件に「すべての非テキストコンテンツに適切な代替テキストを提供する」を明記する
  • 画像を使用する機能では、代替テキストの入力フィールドを必須とする
  • 画像やアイコンの目的を明確にし、代替テキストの指示をデザインドキュメントに記載する
  • 装飾的な要素と意味のある要素を区別してデザインする
  • img要素には必ずalt属性を設定する
  • 装飾的な画像にはalt=""(空のalt)を設定する
  • アイコンボタンでは、SVGにrole="img"aria-labelを設定し、ボタンのアクセシブルネームとして扱う
  • 装飾用のSVGはaria-hidden="true"を設定する

基本的な実装例

<p>意味のある画像</p>
<img src="data:image/svg+xml," alt="YUMEMIのロゴマーク" />

<p>装飾的な画像</p>
<img src="data:image/svg+xml," alt="" />

<p>テキストと併用するアイコン</p>
<button>
  <svg aria-hidden="true" width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
    <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
  </svg>
  追加する
</button>
  • スクリーンリーダーで画像やアイコンの読み上げを確認する
  • alt属性が設定されていない画像がないかチェックする
  • 代替テキストが画像の内容を適切に説明しているか確認する
  • ユーザーからのフィードバックを収集し、代替テキストの改善に活かす
  • 新しいコンテンツを追加する際は、代替テキストの設定を忘れないようにする

「画像」や「アイコン」で始まる代替テキスト

Section titled “「画像」や「アイコン」で始まる代替テキスト”
悪い例
<img src="product.jpg" alt="画像:赤いセーター" />
良い例
<img src="product.jpg" alt="赤いニットセーター Mサイズ" />

複雑な図表には、短いalt属性に加えて、詳細な説明を別途提供します。

詳細な説明を提供する方法
<figure>
<img src="sales-chart.png" alt="2024年月別売上グラフ" aria-describedby="chart-desc" />
<figcaption id="chart-desc">
1月から12月までの売上推移。1月は100万円からスタートし、
6月に最高値の500万円を記録。年間平均は300万円。
</figcaption>
</figure>

CSSの背景画像にはalt属性を設定できないため、代替手段を使用します。

背景画像に代替テキストを提供する方法
<div
role="img"
aria-label="夕焼けの海岸線"
style="background-image: url('sunset.jpg');">
</div>

リンク内の画像は、リンク先を説明する代替テキストを設定します。

リンク画像の適切な代替テキスト
<a href="/products/sweater">
<img src="sweater.jpg" alt="赤いニットセーター 商品詳細ページへ" />
</a>

アイコンの見た目ではなく機能を説明する

Section titled “アイコンの見た目ではなく機能を説明する”

アイコンボタンの代替テキストには、アイコンの見た目ではなく機能を説明します。

悪い例:見た目を説明している
<button>
<svg role="img" aria-label="バツ印">...</svg>
</button>
良い例:機能を説明している
<button>
<svg role="img" aria-label="閉じる">...</svg>
</button>

SVGアイコンへの代替テキストの付与方法

Section titled “SVGアイコンへの代替テキストの付与方法”

アイコンボタンの実装では、ボタン要素ではなくアイコン自体にアクセシブルな名前を付けることが推奨されます。SVGに付けたaria-labelはボタンのアクセシブルネームとして反映されます。

ボタンに付ける方法(非推奨)
<button aria-label="閉じる">
<svg aria-hidden="true">...</svg>
</button>
アイコンに付ける方法(推奨)
<button>
<svg role="img" aria-label="閉じる">...</svg>
</button>

アイコンは装飾ではなく意味を持つ画像です。img要素にalt属性を付けるのと同様に、SVGアイコンにもrole="img"aria-labelを付けることで、実装の一貫性が保たれます。

代替テキストを付与する方法は他にもあります。

  1. SVGにrole="img"aria-labelを設定する方法 - 主要なブラウザとスクリーンリーダーで安定して動作します
  2. Visually Hiddenテキストを使用する方法 - コンポーネント化すると扱いやすくなります

詳細な比較は「SVGアイコンボタンにアクセシブルな名前を付ける方法の比較」を参照してください。

代替テキストの種類と使い分け

Section titled “代替テキストの種類と使い分け”
画像の種類代替テキストの設定方法
情報を伝える画像内容を説明するalt属性alt="売上グラフ:1月100万、2月150万"
装飾的な画像空のalt属性alt=""
機能を持つ画像(ボタンなど)機能を説明するaltまたはaria-labelaria-label="検索"
複雑な画像短いalt + 詳細な説明alt="組織図" aria-describedby="org-desc"

プラットフォーム別の実装方法

Section titled “プラットフォーム別の実装方法”
<img src="image.jpg" alt="説明文" />
Image("product")
.accessibilityLabel("赤いニットセーター")
Image(
painter = painterResource(id = R.drawable.product),
contentDescription = "赤いニットセーター"
)