具体例:ECサイトでの困りごと
Bさんはスクリーンリーダーを使用してオンラインショッピングをしています。 商品画像に代替テキストが設定されていないため、どのような商品なのか分かりません。 「image_12345.jpg」と読み上げられても、商品の色やデザインが分からず、購入を諦めることになりました。
結果的に、視覚に依存できないユーザーは、ページの内容を正しく理解できず、誤った操作をしてしまう可能性があります。
具体例:ECサイトでの困りごと
Bさんはスクリーンリーダーを使用してオンラインショッピングをしています。 商品画像に代替テキストが設定されていないため、どのような商品なのか分かりません。 「image_12345.jpg」と読み上げられても、商品の色やデザインが分からず、購入を諦めることになりました。
以下のデモでスクリーンリーダーでの読み上げの違いを確認してください。
悪い例: 代替テキストがない・不適切
良い例: 適切な代替テキストが設定されている
img要素には必ずalt属性を設定するalt=""(空のalt)を設定するrole="img"とaria-labelを設定し、ボタンのアクセシブルネームとして扱うaria-hidden="true"を設定する基本的な実装例
alt属性が設定されていない画像がないかチェックする<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>アイコンボタンの代替テキストには、アイコンの見た目ではなく機能を説明します。
<button> <svg role="img" aria-label="バツ印">...</svg></button><button> <svg role="img" aria-label="閉じる">...</svg></button>アイコンボタンの実装では、ボタン要素ではなくアイコン自体にアクセシブルな名前を付けることが推奨されます。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を付けることで、実装の一貫性が保たれます。
代替テキストを付与する方法は他にもあります。
role="img"とaria-labelを設定する方法 - 主要なブラウザとスクリーンリーダーで安定して動作します詳細な比較は「SVGアイコンボタンにアクセシブルな名前を付ける方法の比較」を参照してください。
| 画像の種類 | 代替テキストの設定方法 | 例 |
|---|---|---|
| 情報を伝える画像 | 内容を説明するalt属性 | alt="売上グラフ:1月100万、2月150万" |
| 装飾的な画像 | 空のalt属性 | alt="" |
| 機能を持つ画像(ボタンなど) | 機能を説明するaltまたはaria-label | aria-label="検索" |
| 複雑な画像 | 短いalt + 詳細な説明 | alt="組織図" aria-describedby="org-desc" |
<img src="image.jpg" alt="説明文" />Image("product") .accessibilityLabel("赤いニットセーター")Image( painter = painterResource(id = R.drawable.product), contentDescription = "赤いニットセーター")