Cntlog

Webアクセシビリティの基本

フロントエンド

投稿日

Webアクセシビリティとは、高齢者や障害者を含むすべての人が、Webサイトで提供される情報やサービスにアクセスし、利用できるようにすることです。
近年、Webアクセシビリティへの関心は高まっており、フロントエンド開発者にとって、アクセシブルなWebサイトを構築するための知識は必須となっています。

この記事では、フロントエンド開発者が知っておくべきWebアクセシビリティの基本について解説します。
具体的なコード例を交えながら、アクセシビリティの重要性、実装方法、よくある間違い、支援技術への影響などを説明します。

なぜWebアクセシビリティが重要なのか?

Webアクセシビリティは、単に一部の人々にとっての使いやすさの問題ではありません。
倫理的な観点、法的観点、ビジネス的な観点からも、Webアクセシビリティは重要です。

  • 倫理的な観点: すべての人が平等に情報やサービスにアクセスできるべきであり、Webサイトはそれを実現するための重要なツールです。
  • 法的観点: 多くの国で、Webアクセシビリティに関する法律が制定されています。
  • ビジネス的な観点: アクセシブルなWebサイトは、より多くのユーザーにリーチし、顧客基盤を拡大することができます。

Webアクセシビリティは、様々な障害を持つ人々にとって重要です。

視覚障害者はスクリーンリーダーを使用してWebサイトを閲覧し、聴覚障害者はキャプションや字幕を利用して動画を視聴します。

運動障害のある人は、マウスの代わりにキーボードや音声認識を使用してWebサイトを操作します。また、認知障害のある人は、シンプルなレイアウトや明確な指示によってWebサイトを理解しやすくなります。

アクセシビリティの基本

Webサイトのアクセシビリティを向上させるには、様々な要素を考慮する必要があります。
ここでは、フロントエンドエンジニアが特に注意すべき基本的な項目と、それらをどのように実装するか、そしてよくある間違いについて解説します。

1. セマンティックHTML

セマンティックHTMLとは、HTML要素の意味を明確に示すようにマークアップすることです。
例えば、見出しには<h1><h6>、段落には<p>、リストには<ul><ol>など、適切な要素を使用します。

なぜ重要なのか?

セマンティックHTMLは、スクリーンリーダーなどの支援技術がWebページの構造を理解し、ユーザーに情報を正しく伝えるために不可欠です。

例えば、スクリーンリーダーは<h1>要素を認識することで、それがページの主要な見出しであることをユーザーに伝えます。また、セマンティックHTMLはSEOにも影響があります。

検索エンジンは、セマンティックHTMLを使用してWebページの内容を理解し、検索結果に反映させると言われています。

実装方法

  • 見出しには<h1><h6>要素を使用する
  • 段落には<p>要素を使用する
  • リストには<ul><ol><li>要素を使用する
  • テーブルには<table><tr><td>要素を使用する
  • フォームには<form><label><input><button>要素を使用する

よくある間違い

  • 見出しのレベルを順番通りに使用しない(例: <h1>の次に<h3>を使用する)
  • div要素やspan要素で構造を表現する
  • テーブルをレイアウトのみに使用し、セマンティックな構造を無視する

支援技術への影響

スクリーンリーダーは、セマンティックHTMLに基づいてWebページの内容を解釈します。

セマンティックHTMLが正しく使用されていない場合、スクリーンリーダーは情報を正しく伝えられず、ユーザーはWebページの内容を理解することが困難になります。

2. フォーム

フォームは、ユーザーがWebサイトとやり取りするための重要な要素です。

アクセシブルなフォームを設計することで、すべての人が容易に情報を入力し、送信することができます。

なぜ重要なのか?

フォームは、ユーザー登録、商品購入、お問い合わせなど、様々な目的で使用されます。

アクセシブルなフォームは、すべての人がこれらの操作をスムーズに行えるようにするために重要です。特に、障害のあるユーザーは、フォームのエラーを理解したり、気づいたりするのが難しい場合があるため、アクセシブルなエラー処理が重要です。

実装方法

  • 各フォーム要素に<label>要素を関連付ける
  • ラベルテキストは明確で簡潔にする
  • フォーム要素を論理的な順序で配置する
  • エラーメッセージは分かりやすく表示する
  • 入力フィールドに適切なtype属性を設定する(例: emailtel
  • フォームのバリデーションエラーは、スクリーンリーダーで読み上げられるようにし、エラーが発生したフィールドにフォーカスを移動する。

コード例

HTML

<label for="name">名前:</label>
<input type="text" id="name" name="name">

<label for="email">メールアドレス:</label>
<input type="email" id="email" name="email">

よくある間違い

  • ラベルを省略する
  • ラベルとフォーム要素の関連付けが不適切
  • エラーメッセージが分かりにくい
  • 入力フィールドのtype属性が不適切

支援技術への影響

スクリーンリーダーは、ラベルを読み上げることで、フォーム要素の目的をユーザーに伝えます。

ラベルが省略されたり、関連付けが不適切な場合、スクリーンリーダーはフォーム要素を正しく認識できず、ユーザーは情報を入力することが困難になります。

3. キーボードナビゲーション

キーボードナビゲーションとは、キーボードのみでWebサイトを操作できるようにすることです。

マウスが使えないユーザーや、キーボード操作を好むユーザーにとって、キーボードナビゲーションは不可欠です。

なぜ重要なのか?

マウスが使えないユーザーは、キーボードのみでWebサイトを操作する必要があります。

キーボードナビゲーションが適切に実装されていない場合、これらのユーザーはWebサイトを利用することができません。

実装方法

  • すべてのインタラクティブ要素(リンク、ボタン、フォーム要素など)にキーボードフォーカスを当てることができるようにする
  • フォーカスの順序を論理的にする
  • フォーカスされている要素を視覚的に明確にする

よくある間違い

  • JavaScriptでキーボード操作を無効にする
  • フォーカスの順序が illogical
  • フォーカススタイルを削除する

支援技術への影響

キーボードナビゲーションが不適切な場合、スクリーンリーダーやキーボード操作支援ソフトウェアを使用するユーザーは、Webサイトを操作することが困難になります。

キーボードナビゲーションのテスト

キーボードナビゲーションが正しく機能していることを確認するために、様々なブラウザでテストすることが重要です。各ブラウザは、キーボードフォーカスを異なる方法で処理する場合があります。

4. モーダル

モーダルは、Webページ上にオーバーレイ表示されるウィンドウです。

モーダルは、ユーザーの注意を引き付けたり、追加情報を提供したりするために使用されます。

なぜ重要なのか?

モーダルは、ユーザーの操作を中断させる可能性があるため、他のUIに比べアクセシビリティに配慮した設計が重要です。

モーダルダイアログ内でフォーカスをトラップすることは、ユーザーが誤ってモーダル外のコンテンツを操作してしまうのを防ぐために不可欠です。

これは、スクリーンリーダーユーザーにとって特に重要です。なぜなら、モーダル外のコンテンツを操作してしまうと、混乱を招き、方向感覚を失ってしまう可能性があるからです。

実装方法

  • モーダルが開かれたときに、フォーカスをモーダル内の最初の要素に移動する
  • モーダルが開かれている間は、フォーカスをモーダル内に閉じ込める
  • モーダルを閉じるための明確な方法を提供する(例: Escキー、閉じるボタン)
  • モーダルの背景を半透明にすることで、ユーザーがモーダルが開かれていることを認識できるようにする
  • Accessible Rich Internet Applications (ARIA) 属性やDialogタグを使用して、モーダルの役割と状態を明示する
  • aria-hidden="true"を使用して、モーダルが開いている間、背景のコンテンツをスクリーンリーダーから隠す。

コード例

HTML

<dialog aria-modal="true" aria-labelledby="modal-title">
  <h2 id="modal-title">モーダルのタイトル</h2>
  <p>モーダルの内容</p>
  <button>閉じる</button>
</dialog>

よくある間違い

  • モーダルが開かれたときに、フォーカスが移動しない
  • モーダルが開かれている間、フォーカスがモーダル外に移動できる
  • モーダルを閉じる方法が分かりにくい

支援技術への影響

スクリーンリーダーは、ARIA属性を使用してモーダルの役割と状態を認識します。

ARIA属性が正しく使用されていない場合、スクリーンリーダーはモーダルを正しく認識できず、ユーザーはモーダルを操作することが困難になります。

5. 画像の代替テキスト

画像の代替テキストとは、画像の内容をテキストで説明したものです。

視覚障害のあるユーザーは、スクリーンリーダーを使用して画像の代替テキストを読み上げてもらうことで、画像の内容を理解することができます。

なぜ重要なのか?

画像の代替テキストは、視覚障害のあるユーザーがWebページの内容を理解するために不可欠です。

実装方法

  • img要素のalt属性に、画像の内容を簡潔に説明したテキストを記述する
  • 装飾的な画像には、空のalt属性 (alt="") を指定する
  • 図表やグラフなど、複雑な画像の場合は、alt属性で詳細な説明を提供するか、longdesc属性を使用して別のページに詳細な説明を記述する。

コード例

HTML

<img src="cat.jpg" alt="かわいい猫">

よくある間違い

  • alt属性を省略する
  • alt属性に画像のファイル名や「画像」などの無意味なテキストを記述する

支援技術への影響

スクリーンリーダーは、alt属性の内容を読み上げることで、画像の内容をユーザーに伝えます。alt属性が省略されたり、無意味なテキストが記述されている場合、スクリーンリーダーは画像の内容を正しく伝えられず、ユーザーはWebページの内容を理解することが困難になります。

6. スタイル設定

CSSを使用したスタイル設定は、Webサイトのアクセシビリティに大きな影響を与えます。

なぜ重要なのか?

適切なスタイル設定は、Webサイトの視認性、操作性を向上させ、すべての人が快適に利用できるようにするために重要です。

実装方法

  • フォーカス インジケーター: キーボードフォーカスが当たっている要素を視覚的に明確にする。(例:アウトラインで強調表示する)
  • インタラクティブな要素: リンクはリンクのように見え、ボタンはボタンのように見え、簡単に操作できることを確認します。
  • インタラクティブ性フィードバック: ホバー、アクティブ、無効の状態を明確に提供します。
  • 色のコントラスト: 要素を区別するために十分なコントラストを使用します。テキストと背景の色のコントラスト比を十分に確保することで、弱視のユーザーがテキストを読みやすくする。
  • 色: 色覚異常のあるユーザーのために、テキストやアイコンと色を組み合わせます。
  • レスポンシブデザイン: 様々なデバイスでWebサイトを快適に閲覧できるように、画面サイズに合わせてレイアウトを調整する。カスタム フォント サイズとズームをサポートします。
  • モーションの削減: アニメーションや視覚効果は、一部のユーザーに不快感を与える可能性があるため、モーションの削減オプションを提供する。モーションに敏感なユーザーのために、モーションを減らすか無効にします。
  • フォントと間隔: 特に失読症のユーザーのために、十分な間隔をとった明確なフォントを使用します。
  • CSSのアクセシビリティ: display: nonevisibility: hiddenなどのCSSプロパティは、スクリーンリーダーにコンテンツを非表示にする効果があります。これらのプロパティを使用する場合は、スクリーンリーダーユーザーにも情報が伝わるように、代替手段を提供する必要があります。

よくある間違い

  • フォーカスインジケーターを削除する
  • レスポンシブデザインに対応していない
  • モーションの削減オプションを提供しない

支援技術への影響

フォーカスインジケーターが明確でない場合、キーボードナビゲーションを使用するユーザーは、現在フォーカスが当たっている要素を把握することが困難になります。

レスポンシブデザインに対応していないWebサイトは、モバイルデバイスやスクリーンリーダーを使用するユーザーにとって利用しにくくなります。

モーションの削減オプションがない場合、アニメーションや視覚効果によって、一部のユーザーはWebサイトの内容を理解することが困難になります。

7. ARIA属性

ARIA (Accessible Rich Internet Applications) 属性は、HTML要素にアクセシビリティに関する情報を追加するための属性です。

HTMLだけでは表現できないアクセシビリティ情報を提供することで、支援技術との連携を強化します。

ARIAは、アクセシビリティツリー内で要素の状態とプロパティを変更することで、支援技術がコンテンツをユーザーにどのように提示するかを変更します。

なぜ重要なのか?

ARIA属性は、HTMLだけでは表現できないアクセシビリティ情報を提供することで、支援技術との連携を強化します。

しかし、ARIA属性を過度に使用したり、不必要に使用したりすると、アクセシビリティの問題が発生する可能性があります。

ARIA属性は、セマンティックHTMLでアクセシビリティを確保できない場合にのみ使用するようにし、可能な限りセマンティックHTMLを優先する必要があります。

ARIAの3つの要素

  • 役割(role): 要素の役割を定義します。例えば、role="button"は要素がボタンであることを示します。
    • ランドマークの役割: フォームやアプリケーションなど、Webページのさまざまな部分を識別することで、支援技術ユーザーのナビゲーションを支援します。
    • ドキュメントの役割: リスト、画像、見出しなど、ページのコンテンツ構造を記述するために使用されます。ページ全体のコンテンツを記述するのにはあまり役立ちません。
    • ウィジェットの役割: 主に、ボタン、アラート、チェックボックスなどのJavaScriptベースのユーザーインターフェースを記述するために使用されます。
    • 抽象的な役割: 基盤の抽象的な役割など、他のWAI-ARIA役割の基盤となる役割を形成します。
  • プロパティ: 要素に関する追加情報を提供したり、要素の動作を変更したりします。例えば、aria-labelは要素のラベルを指定します。
  • 状態: 要素の現在の状態を示します。例えば、aria-expanded="true"は要素が展開されていることを示します。

実装方法

  • role属性を使用して、要素の役割を明示する(例: role="button"role="alert"
  • aria-*属性を使用して、要素の状態やプロパティを記述する(例: aria-expanded="true"aria-labelledby="label-id"
  • ARIA属性は、小文字とハイフンを使用して記述する(例: aria-label)。
  • ARIA属性の値は、二重引用符で囲む(例: aria-label="閉じる")。
  • 状態を表すARIA属性には、ブール値(trueまたはfalse)を使用する(例: aria-expanded="true")。
  • プロパティを表すARIA属性には、数値またはID参照を使用する(例: aria-level="2"aria-labelledby="label-id")。

コード例

<button aria-expanded="false" aria-controls="menu">メニューを開く</button>
<ul id="menu" aria-hidden="true">
  <li>メニュー項目1</li>
  <li>メニュー項目2</li>
</ul>

よくある間違い

  • ARIA属性を誤って使用したり、不必要に使用したりする
  • ARIA属性だけでアクセシビリティを確保しようとする(セマンティックHTMLと併用することが重要)
  • 既にネイティブのセマンティクスを持つ要素にARIA属性を使用する(例: <button>要素にrole="button"を使用する)。

支援技術への影響

ARIA属性は、スクリーンリーダーなどの支援技術がWebページの要素を正しく認識し、ユーザーに情報を伝えるために役立ちます。

ARIA属性が正しく使用されていない場合、支援技術はWebページの内容を正しく解釈できず、ユーザーはWebページを操作することが困難になります。

モバイルアクセシビリティ

モバイルデバイスは、小さな画面とタッチ入力という特性から、アクセシビリティに関して独自の課題があります。

モバイルアクセシビリティを確保するためには、以下の点に注意する必要があります。

  • タッチターゲットのサイズ: タッチターゲットは、ユーザーが指で正確にタップできる大きさにする必要があります。
  • レスポンシブデザイン: モバイルデバイスの画面サイズに合わせて、Webサイトのレイアウトを調整する必要があります。
  • ズーム機能: ユーザーがWebサイトを拡大して見ることができるように、ズーム機能を有効にする必要があります。

認知アクセシビリティ

認知アクセシビリティとは、大なり小なり認知障害を持っている人がWebサイトを理解しやすくするためのものです。

認知アクセシビリティを向上させるためには、以下の点に注意する必要があります。

  • 明確な言語: 専門用語や複雑な言い回しを避け、分かりやすい言葉を使用する。
  • 一貫したレイアウト: Webサイトのレイアウトを一貫させることで、ユーザーが情報を見つけやすくする。
  • 最小限の distraction: アニメーションや視覚効果など、ユーザーの注意をそらす要素を最小限にする。

アクセシビリティチェックツール

Webサイトのアクセシビリティを評価するために、様々なチェックツールが提供されています。

  • ブラウザ拡張機能: ブラウザに組み込まれており、簡単にアクセシビリティチェックを実行できるツール (例: axe, WAVE)
  • オンラインバリデーター: WebサイトのURLを入力することで、アクセシビリティチェックを実行できるツール
  • 自動テストフレームワーク: Webサイトのアクセシビリティを自動的にテストするためのフレームワーク (例: Pa11y, axe-core)

これらのツールを使用して、Webサイトのアクセシビリティ問題を検出し、修正することができます。

具体的には、以下のようなツールがあります。

  • Lighthouse: Google Chromeに組み込まれている開発者ツール
  • axe: Deque Systemsが提供するアクセシビリティテストツール
  • WAVE: WebAIMが提供するアクセシビリティ評価ツール

参考になるウェブサイトやリソース

結論

Webアクセシビリティは、すべての人がWebサイトを利用できるようにするための重要な取り組みです。
フロントエンドエンジニアは、この記事で紹介した基本的な知識を習得し、アクセシブルなWebサイトを構築するよう努める必要があります。

アクセシビリティは、後付けで対応するのではなく、開発プロセス全体を通して考慮なしでは対応できません。
「アクセシビリティファースト」の考え方を持ち、設計段階からアクセシビリティを意識することで、より効果的にアクセシブルなWebサイトを構築することができます。

アクセシブルなWebサイトを構築することは、ユーザーだけでなく、開発者自身にもメリットをもたらします。
アクセシビリティの高いWebサイトは、より多くの人々に利用され、SEOにも効果的です。また、アクセシビリティを考慮することで、コードの品質が向上し、メンテナンス性も高まります。

アクセシビリティチェックツールなどを活用し、継続的にWebサイトのアクセシビリティを向上させていきましょう。
まだまだこのサイトも万全とは言えないですが、気がついたところから対応していこうと思います。