トピックを検索
キーボードで押せないアイコンが並ぶツールバー
写真を編集するツールを、クリック処理を付けたspanのアイコンで作っているため、Tabキーはツールバー全体を飛ばし、スクリーンリーダーにはツールがあることさえ伝わらない
<span class="tool" data-action="rotate-left"> 問題
キーボードやスイッチの利用者は写真編集のツールにたどり着けず押せもしない。スクリーンリーダー利用者には、ツールがあることも、それぞれが何をするかも伝わらない
あるフリマサイトでは、出品者が商品の写真を公開前に整えられます。写真の下には「左に回転」「右に回転」「反転」「拡大」「縮小」「元に戻す」の6つのアイコンが並んでいます。写真が横向きに写ってしまった出品者が「右に回転」をクリックすると、マグカップがまっすぐ立ちます。アイコンはどれもSVGを入れたspanで、spanにクリック処理を付けています。マウスを使わずにTabキーを押すと、フォーカスはページの上の部分から「写真を保存」へ移り、6つのツールはすべて飛ばされます。写真を回すキーはないため、キーボード利用者は横向きのまま保存するしかありません。スクリーンリーダーでツールバーを読むと、文字も役割も名前もないspanが6つあるだけです。ツールがあることも、押せることも、それぞれが何をするかも伝わりません。
達成基準2.1.1「キーボード」は、マウスでできることはすべてキーボードでもできることを求めています。どのツールも、フォーカスを受けないspanのクリックでしか動きません。ブラウザーがEnterキーとSpaceキーをクリックに変えるのはHTML標準のコントロールだけのため、spanに tabindex を付けても、どちらのキーにも反応しません。写真の回転、反転、拡大は、キーボードではまったくできません。
達成基準4.1.2「名前(name)・役割(role)及び値(value)」は、どのコントロールも名前と役割をソフトウェアが判別できることを求めています。ツールはどれも、クリックすると写真が変わるコントロールです。spanにはもともと役割がないため、押せるものだとは伝わりません。中のアイコンはスクリーンリーダーから隠したSVGのため、spanに名前を与えるものもありません。W3Cはこれを失敗例として挙げています。スクリプトでspanやdivをコントロールにしながら役割を与えないものが失敗例F59、より広く、アクセシビリティAPIを使わない独自のコントロールが失敗例F15です。
このようなツールバーは、何かをその場で編集する画面ならどこにでもあります。写真やアイコン画像の切り抜き、文書やPDFのビューアー、コメント欄、選んだファイルを操作するファイル一覧などです。アイコンのツールは小さく、間隔を詰めて描かれることが多いため、手の震えがある人にはクリックしにくく、だからこそキーボードを使う人もいます。
10グループ中2グループに影響
このツールバーには、axeが確認することがありません。クリック処理を付けたspanには役割がないため、名前を求めるルールは当てはまらず、押すためのものであることはマークアップのどこにも書かれていません。AIが提案することのある修正どおりに role="button"、tabindex="0"、aria-label を足すと、spanはaxeに合格し、Tabキーでも届きますが、EnterキーとSpaceキーでは何も起きません。Tabキーで到達できないdivのボタンで説明しているとおりです。
この診断ツールは、ページをTabキーで進みます。クラス、id、ロールからツールバーと分かる要素の中で、アイコンや文字を含み、それ自体にポインターのカーソルが付いた要素をツールとみなします。そうしたツールが2つ以上並び、その列にフォーカスを受けるものが何もないとき、Tabキーが一度も届かなかったツールを報告します。Tabの移動先がツール1つだけの role="toolbar" では、そのツールにフォーカスを置いて矢印キー、Home、Endを押し、フォーカスがまったく動かなければ、ほかのツールに届かないとして報告します。こちらは、修正が途中で終わったもう1つの形です。ツールバーのパターンのマークアップ(最初以外のツールの tabindex="-1")だけを写し、フォーカスを動かすスクリプトを書かなかった場合です。クリックできるアイコンが並んでいても、コンテナーのクラス名、id、ロールからツールバーと分からなければ、ツールバーとしては報告しません。名前がアイコンの働きを表しているかどうかも、どの確認でも判断できません。
試してみる
横向きに写った写真を、キーボードだけでまっすぐにしてみましょう
Tabキーを押します。フォーカスは6つのツールを飛ばして「写真を保存」へ移り、下の欄でもツールは一度も読まれません。
修正を適用すると、ボタンでは各ツールがTabの移動先になり、ツールバーではTabキーで1回止まったあと、矢印キー、Home、Endでツールの間を移動できます。
問題あり 修正できますか?
写真を編集
スクリーンリーダーの読み上げ:
(Tabで編集画面を移動)
修正方法
すべてのツールを、働きを表す名前のボタンにする
<div class="photo-editor"> <img class="photo" src="/uploads/mug.jpg" alt="ホーローのマグカップ、正面"> <div class="toolbar"> <span class="tool" data-action="rotate-left"> <svg aria-hidden="true">…</svg> </span> <span class="tool" data-action="rotate-right"> <svg aria-hidden="true">…</svg> </span> <span class="tool" data-action="flip"> <svg aria-hidden="true">…</svg> </span> <span class="tool" data-action="zoom-in"> <svg aria-hidden="true">…</svg> </span> <span class="tool" data-action="zoom-out"> <svg aria-hidden="true">…</svg> </span> <span class="tool" data-action="reset"> <svg aria-hidden="true">…</svg> </span> </div> <button type="button">写真を保存</button></div>問題点3点
- ツールはフォーカスを受けないspanの
clickにしか反応しないため、どのキーでもたどり着けず、押せません。 - spanには役割がないため、どのツールにも役割がありません。
- 中身はスクリーンリーダーから隠したアイコンだけのため、どのツールにも名前がありません。
ツールごとにボタンを使う
<div class="photo-editor"> <img class="photo" src="/uploads/mug.jpg" alt="ホーローのマグカップ、正面"> <div class="toolbar"> <button type="button" class="tool" aria-label="左に回転" data-action="rotate-left"> <svg aria-hidden="true">…</svg> </button> <button type="button" class="tool" aria-label="右に回転" data-action="rotate-right"> <svg aria-hidden="true">…</svg> </button> <button type="button" class="tool" aria-label="反転" data-action="flip"> <svg aria-hidden="true">…</svg> </button> <button type="button" class="tool" aria-label="拡大" data-action="zoom-in"> <svg aria-hidden="true">…</svg> </button> <button type="button" class="tool" aria-label="縮小" data-action="zoom-out"> <svg aria-hidden="true">…</svg> </button> <button type="button" class="tool" aria-label="元に戻す" data-action="reset"> <svg aria-hidden="true">…</svg> </button> </div> <button type="button">写真を保存</button></div>修正の手順3ステップ
- 各ツールをHTML標準のボタンにします。Tabキーで届き、EnterキーとSpaceキーで押せます。ブラウザーはどちらのキーも、スクリプトがもともと待っている
clickに変えるため、スクリプトを変える必要はありません。 aria-labelで各ボタンに働きを表す名前を付けます。スクリーンリーダーは「右に回転、ボタン」と読み上げ、音声操作の利用者は「右に回転をクリック」と言えます。- CSSでボタン本来の見た目を消してアイコンの見た目に戻し、フォーカスの枠を加えます。
これで修正前の例は直り、2.1.1と4.1.2を満たします。ツールが6つなら、写真と「写真を保存」の間にTabの移動先が6つ並びます。
この方法を選ぶ理由:まずHTMLの要素を使う
どちらも基準を満たします。ボタンをTabの順序に残す方法は、変更が小さく済みます。ARIAのロールもキー操作の処理も要らず、キーボード利用者は誰でも移動のしかたを知っています。Tabの移動先を1つにすることは、WCAGもARIAも求めていません。ボタンが6つ並べばTabキーを6回押すことになりますが、ときどき使う編集画面なら問題ありません。ツールバーは、その回数を省きます。Tabキー1回で列全体を越えられ、ツールがひとまとまりであることもスクリーンリーダー利用者に伝わります。十数個のツールが並ぶ文書エディターのように、ツールが多いときやよく使うときに選びます。ツールバーがいくつも並び、キーボード利用者が来るたびにTabキーで越えていくことになる場合も同じです。そのときは、ロール、名前、Tabの移動先1つ、矢印キーをすべてそろえます。ARIA Authoring Practicesは、toolbarロールでまとめるのはコントロールが3つ以上あるときだけにするよう勧めています。
各ツールには、ツールチップやヘルプページと同じ言葉で、働きを表す名前を付けます。名前の付け方は名前がないアイコンだけのボタンで詳しく扱っています。アイコンの意味が分からない人には、見える名前も必要です。ポインターを乗せたときとフォーカスしたときに同じ言葉を表示するツールチップは、どちらの人にも役立ちます。「切り抜き」や「太字」のようにオンのままになるツールはトグルで、aria-pressed が必要です。押された状態が伝わらないトグルボタンを参照してください。
元の大きさのときの「縮小」のように、今は使えないツールは無効にできます。ツールバーのパターンでは、無効なツールは矢印キーで飛ばすのが一般的ですが、利用者が見つける必要があるときはフォーカスを受けられるままにしてもよいとしています。それには aria-disabled="true" を使います。見つからず理由も分からない無効なボタンで説明しているとおりです。画面の端に縦に並ぶツールバーには aria-orientation="vertical" を付け、右と左の代わりに下と上の矢印キーでツールの間を移動します。
ツールバーに入れるのは、ボタンか、自分では右と左の矢印キーを使わないコントロールにします。テキスト欄やスライダーはそのキーを使うため、パターンは入れないよう勧めており、どうしても入れるなら1つだけ、ツールバーの最後に置くとしています。狭い画面では、入りきらないツールを「その他」ボタンにまとめることがよくあります。その場合はメニューになり、キー操作も別です。キーボードで入れず、開いても何も伝えない操作メニューで扱っています。ライブラリーのツールバー部品は、作りがさまざまです。使う前に、すべてのツールがボタンで、名前があり、キーを扱っているかを確かめます。
デザインの案
どんな見た目のツールバーでも、すべてのツールにキーで届く
写真のツールを5通りに描きました。それぞれをマウスで試してから、マウスを使わずにTabで移動してみてください。3つはキーボードで届いて使え、2つはマウスでしか使えません。
デザインファイルで
- アイコンだけのツールにも、横に名前を書く。スクリーンリーダーが読む名前にもツールチップにもなる。
- 1つのツールにフォーカスの枠を描き、列全体がTabで1回止まり矢印キーで移動するのか、ツールごとにTabで止まるのかを書き添える。
- ホバーで現れるツールバーは、キーボードでフォーカスしたときとタッチスクリーンでの見え方も描く。
- ダイヤルのようにドラッグで操作するものには、ドラッグせずに同じことができるボタンを横に描く。
合格
- アイコンの下に言葉を添えたツール 各ツールのアイコンの下に、小さな灰色の文字(#5f6368、白に対して6.05:1)で名前を表示します。記号の意味を推測させずに済み、同じ言葉がスクリーンリーダーの読む名前にも、音声操作で呼ぶ名前にもなります。高さが16pxほど増え、ツールの幅も広がります。名前は削らずに短くします。
- ツールをまとめて浮かせたピル型のバー ツールを白いピル型のバーにまとめ、写真の下部に常に浮かべます。回転、反転、拡大のまとまりの間には細い区切り線を入れます。ひとつのまとまりに見えるので、Tabで1回止まり矢印キーで移動する形に合います。フォーカスの枠はバー全体ではなく、フォーカスのあるツールに描きます。
- 100%倍率を表示するズームのステッパー 「縮小」と「拡大」を、倍率(100%)の両側に置いて1つの角丸の枠にまとめます。押すたびに結果が見えます。倍率は2つのボタンの間にあるただの文字で、3つ目のコントロールではありません。ボタンにはそれぞれ名前があります。
不合格
- 写真にポインターを重ねたときだけ現れるツールWCAG 2.1.1 すりガラス風のバーが、ホバーすると写真の上に現れ、ポインターが離れると消えます。ほかに表示する方法がないので、Tabではどのツールも飛ばされ、タッチスクリーンにはそもそもホバーがありません。「ツールをまとめて浮かせたピル型のバー」と同じように、キーボードでフォーカスしたときにも表示し、タッチスクリーンでは常に表示します。
- 0°ドラッグで回す傾き補正のダイヤルWCAG 2.1.1 写真の下の目盛りをドラッグすると、写真が1度ずつ傾きます。スマートフォンの写真アプリでよく見る形です。ポインターの動きにしか反応しないため、キーでは傾きを直せません。矢印キーで動かせるようにするか、横に1度ずつ傾けるボタンを置きます。
修正の確認
4項目、マウス不要
確認方法: キーボード、スクリーンリーダー、音声入力、強制配色、拡大表示
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。ツールバー、その部品、ライブラリーを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。ツールバーのスクリプトは最小限の例で、無効なツール、縦向き、ボタン以外のコントロールは扱っていません。エディターの入力欄とその名前は見えているラベルで読み上げられないリッチテキストエディターで、divで作った1つのコントロールはTabキーで到達できないdivのボタンで扱っています。Tabの移動先を1つにする同じパターンをサイドバーで示したのが、キーボードで開けず、階層も伝わらないツリービューです。対象とする支援技術で、一連の操作全体をテストしてください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
EaseWebのサービス
修正した問題を、次のリリースで再発させない
このガイドのような修正方法を、コーディングエージェントが従うルールと、CIのチェックに組み込みます。あわせて定期的に、キーボードとスクリーンリーダーで手動の再テストを行います。