トピックを検索
マウスでしか動かせないドラッグ&ドロップのボード
カードは列の間をドラッグでしか移動できず、フォーカスできる操作要素もなく、移動しても何も伝わりません。
<li draggable="true"> 問題
ドラッグできない人や、どこに落とすか見えない人は、カードをまったく移動できません。
タスクボードに「未着手」「作業中」「完了」の3列があります。マウスでカードを押し、別の列まで動かして離すと、カードはその列に移ります。Tabキーを押すと、フォーカスはボードを素通りします。カードはTabの順序になく、押せるものもありません。スマートフォンでは、同じ操作でドラッグではなくスクロールが始まります。カードが移動しても、画面が黙って変わるだけです。
カードを動かす方法はドラッグだけで、押したままポインターを動かす必要があります。WCAG 2.5.7では、ドラッグが本質的でない限り、クリックやタップだけで同じことができる方法を求めています。カードを列へ移すのに、ドラッグは本質的ではありません。カードはフォーカスできる操作要素のないリスト項目なので、キーボードでも操作できません(2.1.1)。移動してもステータスメッセージがなく、スクリーンリーダーの利用者には何が起きたか伝わりません(4.1.3)。
ドラッグはできても、遅かったり不安定だったりする人もいます。長いボード、スクロールする列、小さな落とし先があると、短い移動も長い作業になります。作業の状態を変える場所がボードしかないことも多く、ドラッグだけのボードは、1ページではなく業務全体から人を締め出します。
10グループ中5グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響あり)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 手の操作が限られる キーボード、スイッチ、音声操作の利用者は、押したまま動かすことができません。カードはTabの順序にもないため、一枚も移動できません。
- 視覚を使わない スクリーンリーダーの利用者には落とす先の列が見えず、カードが移動しても、どこへ行ったか伝わりません。
- 届く範囲・力が限られる 手のふるえや握力の弱さがある人は、途中で指が離れたり、違う列の上で離したりして、やり直しになります。
- 視覚が限られる 拡大鏡を使っていると、カードを持っている間、移動先の列が画面の外にあることが多く、落とす位置は推測になります。
- 言語・認知・学習の能力が限られる カードには動かせることを示すものが何もないため、ドラッグできると気付かない人は操作を見つけられません。移動後のメッセージもないため、どこへ移ったか確かめられません。
自動チェックが読むマークアップには、誤りがありません。リスト項目に名前は不要で、draggable="true" も正しいHTMLです。ドラッグせずにカードを動かせるかは、実際に試して初めて分かります。ポインターイベントを使うドラッグのライブラリーは、属性を何も付けません。AIにボードのアクセシビリティ改善を頼むと、カードに tabindex="0" と role="button" を付けることがよくあります。カードはTabの順序に入りますが、キーボードでできることは何も増えません。
試してみる
「リリースノートを書く」を「完了」へドラッグしてください。次に、マウスを使わずにTabで試してください。
下の欄に、スクリーンリーダーの読み上げが出ます。ドラッグせずにカードを動かせますか?移動先は聞こえますか?
問題あり 修正できますか?
未着手
- リリースノートを書く
- 料金ページを更新する
作業中
完了
スクリーンリーダーの読み上げ:
(Tabでカードへ移動するか、ドラッグしてください)
修正方法
ドラッグは残し、クリックやキーで各カードを動かせる操作要素を加え、移動先を伝えます。
- 1ドラッグせず、クリックやタップだけで、どのカードもすべての列へ移動できる。
- 2同じ操作要素がキーボードでも動き、移動後もフォーカスがカードから離れない。
- 3最初からページにあるステータス領域で、どのカードがどこへ移動したかを伝える。
<section class="column" data-column="todo"> <h2>未着手</h2> <ul> <li draggable="true" data-card="notes">リリースノートを書く</li> <li draggable="true" data-card="pricing">料金ページを更新する</li> </ul></section><!-- 作業中と完了も同じ:見出しとカードのリスト -->各カードに移動ボタン
<li data-card="notes" draggable="true"> <span id="card-notes">リリースノートを書く</span> <button type="button" data-to="doing" aria-describedby="card-notes">作業中へ移動</button> <button type="button" data-to="done" aria-describedby="card-notes">完了へ移動</button></li>…<p role="status" class="board-status"></p>カードを動かす方法はドラッグだけです。リスト項目はフォーカスも押すこともできず、ドロップの処理でカードが移っても、何も読み上げられません。
ドラッグは使いたい人のために残し、各カードに、移動できる列ごとのボタンを加えます。ボードには最初からステータス領域があり、ドラッグでもボタンでも、移動のたびにスクリプトが書き込みます。
どのボタンも、1回のクリック、タップ、キー操作でカードを移動します。音声操作では「作業中へ移動をクリック」と言えます。カードの題名はボタンの説明として読まれるので、表示名を変えずに、どのカードを動かすボタンか伝わります。移動後、フォーカスは移動先のカードに移り、ステータス行が移動先を伝えます。列が少ないボードに向いています。3〜4列を超えると、ボタンでカードが窮屈になります。
移動ボタンと「移動先」のリストは、どちらもそれだけで、キーボード、ポインター、スクリーンリーダーの利用者に対応できます。移動ボタンは1回押すだけで見つけやすい反面、すべてのカードに列の数だけボタンが増えるため、3〜4列のボードに向いています。「移動先」のリストは2段階になりますが、列が増えても大きさは変わらず、位置も選ばせられるため、大きなボードに向いています。キーボードドラッグは、キーボード利用者がもっと速い方法を求めるときに、ほかの方法と並べて加える価値があります。
ドラッグは残してください。できる人にとっては速い方法で、2.5.7が求めるのは代わりの方法であり、置き換えではありません。ドラッグはカードに、操作要素はその中に置き、ボタンを押してもドラッグが始まらないようにします。
操作要素はカードに常に表示しても、1つの「移動」ボタンから開くメニューに入れてもかまいません。メニューは見た目がすっきりしますが、作って確認するパターンがもう一つ増えます。ホバーではなく、クリックとキーボードで開くようにしてください。
カードを移動するとマークアップも移るため、フォーカスには注意が必要です。
- 描き直されるカード:フレームワークは、カードを消して移動先の列に作り直すことが多く、フォーカスがbodyに落ちる。移動後に、新しいカードの最初の操作要素へ自分でフォーカスを移す。
- 最後の列:カードが「完了」に移ると、フォーカスしていたボタンがなくなることがある。今いる列へのボタンではなく、カードに残った最初の操作要素へフォーカスを移す。
- 取り消し:移動を取り消せる場合は、「元に戻す」をカードかステータス行に置き、フォーカスのある場所の近くにする。
ステータスメッセージは移動1回につき1つにし、列と同じ言葉で短く書きます。たとえば「リリースノートを書くを完了へ移動しました。」です。マウスでドラッグしている途中は知らせず、結果を知らせます。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
5つの確認
確認方法: キーボード、マウス、タッチ、スクリーンリーダー
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。ボードのコンポーネントやドラッグのライブラリーを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。列の中での並べ替え、入れ子のボード、確認が必要な移動には、それぞれ別の配慮が必要で、ここでは扱いません。ドラッグのライブラリーによって、フォーカスと読み上げの扱いは異なります。対象とする支援技術で、操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。