20
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

aria-live属性を使ってフォームのエラーをスクリーンリーダーに伝えよう

Last updated at Posted at 2016-05-03

はじめに

ユーザの入力に問題があったときに、フォームにエラーを表示する場合、工夫して実装すると、スクリーンリーダー(画面の内容を読み上げるソフト. 全盲の方などが使用する)のユーザにも、エラーが起きたときにエラーの内容を即時に伝えることができます。その実装方法を紹介します。

以下のようなフォームを考えます。

input要素とbutton要素からなるフォーム

<input type="text" class="input" placeholder="数値を入力してください" />
<button class="okbutton" type="button">OK</button>
<div class="error"></div>

input要素に数値でない値を入力してOKボタンを押すと
error要素に「数値を入力してください」というエラーが表示されるとします。

input要素に「あいうえお」と入力した場合。error要素に「数値を入力してください」と表示されている。

<input type="text" class="input" placeholder="数値を入力してください" />
<button class="okbutton" type="button">OK</button>
<div class="error">数値を入力してください</div>

問題点と解決策

この実装だと、OKボタンを押してエラーが表示されても、スクリーンリーダーはエラーの内容を読み上げません。
error要素にaria-live=assertiveをつけると、OKボタンをスクリーンリーダーにエラーの内容を即座に伝えることができます。

<input type="text" class="input" placeholder="数値を入力してください" />
<button class="okbutton" type="button">OK</button>
<div class="error" aria-live="assertive">数値を入力してください</div>

aria-live属性は、要素に変更があったときに、変更内容をスクリーンリーダーなどの支援技術に伝える属性です。
aria-live属性には、通知するタイミングによって3つの値を設定できます。エラーなど、即時に伝えるべき内容についてはassertiveを使います。

内容
off 内容が更新されてもユーザーに伝達しない(デフォルト)
polite 現在の読み上げの終了やユーザー入力時など適切なタイミングで、内容が更新されたときにユーザーに伝達する。
assertive 即座に伝達を行う。

スクリーンリーダーで試してみた

OKボタンを押したとき、以下のように読み上げられました。

NVDAの場合

aria-live=assertiveをつけないとき:
「OK、ボタン、押されました」
aria-live=assertiveをつけたとき:
「OK、ボタン、押されました、数値を入力してください

VoiceOverの場合

aria-live=assertiveをつけないとき:
「OK」
aria-live=assertiveをつけたとき:
「OK、数値を入力してください

サンプル(jsfiddle)

20
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?