実践Webアクセシビリティ

実践!SVGのアクセシビリティ対応:代替テキストとARIAの使い方

Tags: SVG, アクセシビリティ, ARIA, マークアップ, 画像

ウェブサイトでSVG(Scalable Vector Graphics)を使用する機会は増えています。軽量で拡大縮小しても劣化しないSVGは、特にアイコンやイラストで非常に有用です。しかし、視覚的な情報であるSVGをそのまま使用した場合、スクリーンリーダーを利用している方や、様々な理由で画像が正しく表示されない方などにとっては、その内容を理解することが困難になります。

本記事では、SVGをアクセシブルにするための具体的な実装方法を、コード例を交えて解説します。装飾的なSVGと意味を持つSVGで取るべき対応は異なりますので、それぞれのケースに分けてご紹介します。

なぜSVGのアクセシビリティ対応が必要なのか

SVGは画像フォーマットの一種ですが、HTMLやXMLのようなマークアップ言語で記述されているため、単なるビットマップ画像(JPEG, PNGなど)よりも多くの情報を埋め込むことが可能です。しかし、その構造が複雑なため、適切なマークアップや属性が付与されていないと、支援技術がSVGの内容を正しく解釈できません。

アクセシブルなSVGは、以下のようなユーザーにとって重要です。

これらのユーザーがウェブサイト上の情報を漏れなく取得できるよう、SVGのアクセシビリティ対応は不可欠です。

SVGの基本的なアクセシビリティ要素 <title><desc>

SVG仕様には、アクセシビリティ情報を提供するための基本的な要素として <title><desc> が用意されています。これらはSVG要素の直下に配置します。

<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
  <title>太陽のアイコン</title>
  <desc>中央に円があり、周囲に放射状の光線が描かれたアイコンです。</desc>
  <circle cx="50" cy="50" r="40" fill="yellow"/>
  <!-- 光線のパスデータなど -->
</svg>

<title> は特に重要で、多くの場合はこれを提供することで基本的なアクセシビリティを確保できます。<desc> は複雑な図やグラフなど、より詳細な説明が必要な場合に使用します。

装飾的なSVGの場合の対応

SVGがデザインの一部としてのみ使用されており、コンテンツに意味的な情報を加えていない場合(例: 背景パターン、区切り線など)、スクリーンリーダーに読み上げさせる必要はありません。むしろ読み上げてしまうと、ユーザーにとってノイズとなる可能性があります。

このような装飾的なSVGには aria-hidden="true" 属性を付与します。これにより、支援技術はその要素を無視します。また、<title><desc> は不要です。

<svg width="50" height="50" viewBox="0 0 50 50" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
  <!-- 単なる装飾用の図形 -->
  <rect width="50" height="50" fill="lightgray"/>
</svg>

aria-hidden="true" は、SVG要素自体に直接付与するのが一般的です。

意味を持つSVG(アイコンなど)の場合の対応

アイコンなど、何らかの意味や機能を示すSVGは、その内容をユーザーに伝える必要があります。前述の <title><desc> も有効ですが、文脈によっては他の方法がより適している場合があります。

aria-labelledby を使用する方法

SVGがHTML要素に関連付けられている場合や、SVG自体にIDがある場合に、aria-labelledby 属性を使用して別の要素のテキストをSVGの代替テキストとして参照させることができます。これは、特にインタラクティブな要素(ボタンなど)の中にSVGアイコンがある場合に有効です。

例えば、テキストラベルを持つボタン内のアイコンの場合、アイコンSVG自体には aria-hidden="true" を付けて非表示にし、ボタン要素のテキストラベルがアイコンの意味も兼ねていることを明示します。

<button type="button">
  <svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg">
    <!-- 歯車アイコンのパス -->
    <path d="..."/>
  </svg>
  <span>設定</span>
</button>

この場合、スクリーンリーダーはボタン全体を「設定 ボタン」として読み上げます。focusable="false" はInternet Explorer/EdgeにおけるSVGのフォーカス問題を回避するためによく使用されます。

もしアイコンのみのボタンで、テキストラベルが視覚的には隠されているがアクセシブルに提供されている場合は、その隠しテキストを aria-labelledby で参照させることができます。

<button type="button" aria-labelledby="settings-label">
  <svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg">
    <!-- 歯車アイコンのパス -->
    <path d="..."/>
  </svg>
  <span id="settings-label" class="visually-hidden">設定</span>
</button>

<style>
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  border: 0;
}
</style>

この visually-hidden クラスは、要素を視覚的には隠しますが、アクセシビリティツリーからは削除されないようにするためのテクニックです。

role="img"aria-label または aria-labelledby の組み合わせ

インラインSVGに role="img" を指定し、代替テキストを aria-label または aria-labelledby で提供することも可能です。

<svg width="30" height="30" viewBox="0 0 30 30" role="img" aria-label="メールアイコン" xmlns="http://www.w3.org/2000/svg">
  <!-- メールアイコンのパス -->
  <path d="..."/>
</svg>

この方法は、<title><desc> よりもHTML側のARIA属性として代替テキストを提供したい場合に有用です。aria-label は短い説明、aria-labelledby は別の要素を参照する場合に使用します。

<img> タグでSVGを使用する場合

<img> タグの src 属性でSVGファイルを指定する場合、アクセシビリティ対応は他の画像フォーマット(JPEG, PNG)と同様に alt 属性で行います。

<img src="/images/logo.svg" alt="会社ロゴ">

この場合、SVGファイル内部の <title><desc> は通常スクリーンリーダーには読み上げられません。<img> タグの alt 属性が優先されます。もし装飾的なSVGであれば、alt="" と空にします。

インタラクティブなSVGの対応

SVG自体がボタンやリンクとして機能する場合(例: インタラクティブな地図の領域など)、適切なセマンティクスとキーボード操作のサポートが必要です。

実装時の注意点とよくある落とし穴

テスト方法

実装したSVGのアクセシビリティを確認するには、以下の方法を組み合わせて行うことが推奨されます。

  1. スクリーンリーダーでの確認: 実際に主要なスクリーンリーダー(例: NVDA, VoiceOver, JAWS)を使用して、SVGがどのように読み上げられるかを確認します。特に aria-hidden を付与した要素が無視されるか、意味を持つSVGが正しく読み上げられるかを確認します。
  2. キーボード操作での確認: インタラクティブなSVGの場合、Tabキーでフォーカスを移動させ、Enter/Spaceキーで操作できるか確認します。意図しない要素にフォーカスが当たらないか(例: aria-hidden が付与されていない装飾SVG)も確認します。
  3. 開発者ツールのアクセシビリティツリー: ブラウザの開発者ツールにはアクセシビリティツリーを表示する機能があります。これにより、各要素が支援技術にどのように認識されているか、適切なロールや名前(ラベル)が付与されているかを確認できます。
  4. 自動評価ツール: axe-coreなどのアクセシビリティ評価ツールは、一部のSVGに関する問題(例: aria-hidden の不適切な使用)を検出できる場合がありますが、すべての問題を見つけるわけではありません。手動での確認が最も重要です。

まとめ

SVGはウェブサイトに豊かさをもたらしますが、アクセシビリティへの配慮なしに使用すると、一部のユーザーを排除してしまう可能性があります。装飾的なSVGには aria-hidden="true" を付与し、意味を持つSVGには <title>, <desc>, aria-label, aria-labelledby などの適切な代替テキストやロール情報を提供することが基本的な対応です。インタラクティブなSVGの場合は、キーボード操作のサポートも必須となります。

今回ご紹介した具体的な実装方法を参考に、全てのユーザーにとって情報が理解しやすい、アクセシブルなSVG活用を目指していただければ幸いです。