トピックを検索
スクリーンリーダーで数値が伝わらないグラフ
棒グラフを中身のない canvas に描いたり、「Orders chart」という名前だけを付けたりしているため、スクリーンリーダーはグラフを飛ばすか名前を読むだけで、数値は一つも伝わらない
<canvas id="orders"></canvas> 問題
スクリーンリーダー利用者には、グラフから読み取れる結果も、数値の一つも伝わらない
ネットショップの管理画面を開くと、最初に「日別の注文数」という見出しのカードがあります。見出しの下に「先週」とあり、その下に、月曜日から日曜日まで1日1本ずつ棒が並ぶ棒グラフがあります。見れば、一番多かったのは土曜日の31件、一番少なかったのは月曜日の12件だと、すぐに分かります。
スクリーンリーダーでカードを読むと、「日別の注文数、見出し」「先週」と読んだ後、カードの次の内容へ進みます。グラフには一言も触れません。よくあるもう一つの作り方では、グラフに名前が付いていて、スクリーンリーダーは「Orders chart、画像」と読みます。グラフがあることは分かっても、何を示しているのかは分かりません。一番多かった曜日も、7日分の件数も一つも伝わりません。
このグラフは、Chart.js が canvas 要素に描いたものです。ライブラリーの入門の例 <canvas id="myChart"></canvas> と同じ作りです。canvas はピクセルを描くための面で、棒も曜日のラベルも目盛りの数字も、その上に絵として描かれます。どれも、ブラウザーがスクリーンリーダーに渡せるテキストとしては存在しません。Chart.js のドキュメントにも、canvas の内容はスクリーンリーダーからは利用できないとあり、テキストの代替は、canvas にARIAを付けるか、canvas の中に代わりの内容を置くかして、ページの側で用意するよう求めています。この canvas にはそのどちらもないため、読むものが何もありません。
達成基準1.1.1「非テキストコンテンツ」は、情報を伝える非テキストコンテンツのすべてに、同じ目的を果たすテキストの代替を求めています。グラフはデータと、そこから読み取れることを示すためにあるので、テキストの代替もそれを伝える必要があります。二つ目の作り方では role="img" と aria-label="Orders chart" を付けています。これでグラフに名前は付きますが、あるのは名前だけです。この名前はグラフであることを言うだけで、何を伝えているかは言いません。Highcharts も、アクセシビリティモジュールを読み込まないと、グラフの SVG にタイトルだけを名前として付けます。こうした名前は、グラフと同じ目的を何も果たさないため、名前がない場合と同じように1.1.1を満たしません。
管理画面は、ショップの運営者がその週の売れ行きを確かめる場所です。その件数がページに出ているのは、グラフの中だけということもよくあります。
10グループ中2グループに影響
axe には中身のない canvas を調べるルールがないため、一つ目の作りは axe を通ります。axe の role-img-alt は、role="img" があるのに名前のない要素を報告します。react-chartjs-2 の canvas は、名前を渡さない限り role="img" だけを付けるため、これに当たります。ところが aria-label="Orders chart" を付ければ、このルールは何も言わなくなります。どれほど中身のない名前でも同じです。手で直しても、AIのアシスタントに直させても、この程度の修正で終わってしまうことがあります。この診断は、Chart.js、Highcharts、Recharts、ApexCharts、ECharts、Plotly が描いたグラフを見分けます。テキストの代替がまったくないか、名前が「chart」のような言葉だけで、そばに表もないグラフは、問題として報告します。それ以外に見つけたグラフは、付いている名前やキャプションを引用した確認候補として出し、棒と見比べるのは人に任せます。名前が棒の示す内容を伝えているかどうかは、グラフが見える人にしか判断できません。
試してみる
グラフを隠して、読み上げから注文の一番多い曜日を探してみましょう
問題1: カードを上から読んだときの読み上げが、下の欄に出ます。グラフについて読まれた言葉はありますか?
問題2: グラフに名前が付きました。その名前で、一番多かった曜日が分かりますか?
修正を適用します。 名前にデータを書く方法では、すべての件数がグラフと一緒に読まれます。表を添える方法では、「数値を表示」も開いて、行を読んでみてください。グラフを隠していてもいなくても読めます。
問題あり 修正できますか?
日別の注文数
カードを上から読むと、スクリーンリーダーの読み上げ:
- 日別の注文数、見出し
- 先週
修正方法
グラフが示す内容と数値を、テキストで伝える
読むものが何もない canvas に描いたグラフ
<section class="card"> <h2>Orders per day</h2> <p class="range">Last week</p> <canvas id="orders"></canvas></section>問題点2点
- 棒も曜日のラベルも目盛りもピクセルとして描かれるため、どれも読めない。
- canvas には名前も中身もないため、スクリーンリーダーは何も言わずに通り過ぎる。
グラフの名前にデータを書く
<section class="card"> <h2>Orders per day</h2> <p class="range">Last week</p> <canvas id="orders" role="img"></canvas></section>修正の手順3ステップ
- canvas に
role="img"を付け、名前のある一つの画像として読まれるようにする。canvas には、名前を持てる役割がもともとない。 - グラフを描くのと同じ二つの配列から名前を作る。何を示すグラフか、主な読み取り結果、各曜日とその件数の順に書く。スクリーンリーダーは「Orders per day, last week. Busiest on Saturday, with 31. Monday 12, Tuesday 15, …, Sunday 20、画像」と読む。
- 名前はグラフを描くコードの中で設定し、新しい週のデータには新しい名前が付くようにする。
これで二つの修正前の例はどちらも直り、この程度の小さなグラフなら1.1.1を満たします。7つの値なら、聞いて追える一文に収まります。ただ、数値が届くのはスクリーンリーダー利用者だけで、しかも一続きの文として読まれるため、木曜日で止めたり、金曜日から読み直したりはできません。データ点が数十あるグラフや、系列がいくつもあるグラフには、次の方法の表が必要です。
この例のグラフなら、どちらの方法でも1.1.1を満たします。名前にデータを書く方法は、属性一つと関数一つで済む最小の変更で、棒が数本のカードのように、場所の限られた小さなグラフに向いています。ただ、数値が届くのはスクリーンリーダー利用者だけで、一続きの文として読まれ、棒が増えるたびに長くなります。表を添える方法は、数行のコードと、グラフの下の閉じた折りたたみウィジェットが増える代わりに、どの大きさのグラフでも使えます。曜日を一つずつ移動して戻ることもでき、目が見えていても、棒の高さから見積もるより数字を読みたい人に正確な件数が届きます。名前だけの方法はグラフが大きくなるとすぐに使えなくなるため、まずは表を添える方法を選んでください。
名前に書く内容。 グラフで伝えたいことを書きます。何をどの期間について数えたのかと、読み手に一番伝えたい一点です。運営者がこのグラフを見るのは「土曜日が一番多く、31件」を知るためです。「青い棒の棒グラフ」のような描き方は書かず、「グラフ:」のような言葉で始めることもしません。「画像」とはスクリーンリーダーが読み上げます。
データが変わるグラフ。 管理画面のグラフは、期間を変えたとき、絞り込みをかけたとき、新しい注文が入ったときに描き直されます。名前と表の行は、chart.update() を呼ぶのと同じ関数の中で設定し直し、テキストが古い棒の内容のまま残らないようにします。HTMLに一度だけ書いた名前のまま、スクリプトでグラフだけを描き直すのは、W3Cの失敗例F20にあたります。
aria-describedby と aria-details。 aria-describedby で表を指すと、表は一続きの言葉として読まれ、行や見出しの構造が失われます。一文の説明には向いていても、表には向きません。aria-details なら構造を失わずに表を指せますが、詳細があることを伝えるかどうかも、そこへの移動のしかたも、スクリーンリーダーによって違います。この例ではどちらも要りません。表はグラフのすぐ後にあり、その場所は名前で伝えています。
常に表示する表。 レポートのページなど、正確な数値が大事な場所では、details で囲まずに表をそのまま表示するか、グラフと表を切り替えられるようにします。どちらでも、同じデータから作る同じ表です。
グラフのライブラリーの機能。 Highcharts のアクセシビリティモジュール(accessibility.js)は、グラフに説明とキーボード操作を加えます。export-data モジュールを使えば、グラフのデータを表として表示することもできます。Recharts の accessibilityLayer は、バージョン3.0から標準で有効になっていて、グラフにキーボード操作を加えます。役に立つところでは使い、スクリーンリーダーで実際に何が聞こえるかを確かめてください。ライブラリーの説明は設定から作られるため、タイトルと読み取り結果は、やはり自分で与える必要があります。
グラフが本文の繰り返しにすぎない場合。 グラフのすぐそばの表のように、数値がすでにテキストとしてページにあるなら、グラフはスクリーンリーダー利用者に新しいことを何も伝えません。それでも、何を示すグラフで、数値は表にあることを短い名前で伝えるか、aria-hidden="true" で隠します。role も名前もないグラフの SVG は、スクリーンリーダーによって扱いが異なり、読み飛ばされることも、グループとして読まれることもあります。軸のラベルなど、SVG の中に描かれた文字が、ばらばらに読み上げられることもあります。
青とオレンジの2本の線を凡例で見分けるように、系列を色だけで区別するのは、1.4.1「色の使用」の別の問題です。ステータスの印での同じ問題を色だけで区別されるステータス表示で扱っています。表計算ソフトから書き出したPNGのように、グラフを画像にした場合も、同じテキストの代替が必要です。1.4.5「文字画像」は、グラフのように文字以外の情報を多く含む図の中の文字を対象外としているため、グラフのラベルは文字画像にあたりません。ただし、数値の表を画像に描き込んだものは文字画像です。実際のテキストの代わりに使われた文字画像で扱っています。
デザインの案
グラフの数値は、言葉でも伝えられる
先週の注文数を、数値が文字として残るように描いた4通りの例と、線しか示さない管理画面のタイル1つです。「グラフ」と「表」の切り替えも押してみてください。
デザインファイルで
- グラフのタイトルには「土曜日が一番多かった」のようにグラフから分かることを書き、何を数えたかはその下に添える。
- グラフが示す数値はすべて、棒の上か、表の表示か、その両方に、文字として読める形で置く。
- スクリーンリーダーにグラフをどう読ませるかを一文で書く。何を示すか、主な読み取り結果、数値がどこにあるか。
- データから作る言葉と数値に印を付け、棒と同じ数値から作られるようにする。
合格
- 棒の先に件数を書く 棒は曜日の横に伸び、その先に件数を、白に対して14.76:1の#1f2933の文字で書きます。スクリーンリーダーは「月曜日 12」と順に読み、誰も目盛りの線まで棒をたどらずに済みます。
土曜日が一番多かった
日別の注文数(先週)
読み取り結果をタイトルにする 「土曜日が一番多かった」というタイトルなら、グラフで伝えたいことを、誰もが棒より先に言葉で読めます。その下に、白に対して4.83:1の#6b7280のグレーで「日別の注文数(先週)」と書きます。タイトルはデータから作り、週ごとに変わるようにします。- グラフと表の切り替え グラフの上の二つのボタンで、棒を同じ件数の表に切り替えます。表なら誰でも読め、拡大もコピーもできます。表の画面もグラフと同じだけ丁寧に描き、切り替えは選んでいる側を塗りつぶして描きます。
- 先週の注文 134件 前週より18%増数値を先に、線は後に 管理画面のタイルは「134件」と、白に対して6.52:1の#1f6b3aの緑の「前週より18%増」と矢印で始め、その下の小さな折れ線は同じことを形で繰り返すだけにします。言葉がすでに伝えているため、線はスクリーンリーダーから隠せます。
不合格
- 注文数値のない小さな折れ線WCAG 1.1.1 タイルには「注文」という言葉と線しかなく、線が示すことを伝える言葉も数値も、デザインに含まれていません。開発者が言葉を考え出さない限り、増えていることは線が見える人にしか伝わりません。数値と増減をタイルに書いてください。
修正の確認
5項目、マウス不要
確認方法: スクリーンリーダー、拡大表示
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。グラフのコンポーネントやデータの取得元を変更した際は、再度確認します。
制限
このサンプルは、どのグラフでも同じ結果になることを保証するものではありません。Chart は Chart.js のことで、どのライブラリーで描いたグラフにも、手で描いたグラフにも、同じテキストの代替が当てはまります。このガイドで扱うのは、グラフのテキストの代替です。ホバーしたときだけ値を表示したり、棒をクリックするとページが絞り込まれたりするなど、データ点や凡例、ツールチップがポインターでしか働かないグラフは別の問題です。凡例についてはキーボードでは系列を切り替えられないグラフの凡例で、ホバーしたときだけ出る値についてはキーボードでは表示できないグラフのツールチップで扱っています。グラフ以外の画像については代替テキストがない、情報を伝える画像を参照してください。管理画面全体を、対象とする支援技術で確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
EaseWebのサービス
修正した問題を、次のリリースで再発させない
このガイドのような修正方法を、コーディングエージェントが従うルールと、CIのチェックに組み込みます。あわせて定期的に、キーボードとスクリーンリーダーで手動の再テストを行います。