トピックを検索
ドラッグでしか動かない範囲スライダー
価格スライダーのつまみがポインターイベントで動かすだけの要素のため、フォーカスできず、スクリーンリーダーが読める値もなく、ドラッグしないと設定できません。
<span class="thumb"> 問題
ドラッグできない人とスクリーンリーダーの利用者は、価格の範囲を設定することも、今の範囲を知ることもできません。
ネットショップの商品一覧に価格の絞り込みがあります。$0から$200までのトラックに丸いつまみが2つあり、上に「$20 – $160」と表示されています。マウスでつまみを押して動かし、離すと商品が絞り込まれます。Tabキーを押すと、フォーカスはカテゴリーの一覧から「適用」ボタンへ飛びます。どちらのつまみもフォーカスを受けません。スクリーンリーダーは、たどり着けば「価格、$20 – $160」を文字として読みますが、変更できるものは何もありません。スマートフォンではつまみが小さく、押した指がつまみの横に当たって、ページがスクロールすることがよくあります。
つまみはポインターイベントで動かす span 要素なので、この絞り込みは3つの達成基準を同時に満たしません。キーボードでは何もできないため2.1.1を満たしません。つまみには役割も名前も値もなく、スクリーンリーダーは何の部品か、どこに設定されているかを伝えられないため4.1.2を満たしません。価格を設定する方法がドラッグしかないため2.5.7も満たしません。価格を選ぶのに、ドラッグは本質的ではありません。
同じ問題は、もっと目立たない形でも現れます。role="slider" と tabindex="0" があってもキーの処理がなく、フォーカスは受けるのに矢印キーを無視するもの。矢印キーで動くのに、aria-valuenow が読み込み時の値のままのもの。単位なしで「20」と読まれるものや、2つのつまみがどちらも「価格」という名前のものもあります。キーボードに対応しても2.5.7は満たせません。この達成基準が求めるのはシングルポインターで使える方法で、タッチスクリーンの利用者には矢印キーがありません。
価格や日付の絞り込みは、長い一覧を絞る唯一の方法であることが多く、ほかの方法で動かせないスライダーは、利用者にすべての商品をスクロールさせることになります。スマートフォンでは、つまみがほかの操作部品の24ピクセルより小さいことが多く、誰にとってもつかみにくくなります。
10グループ中4グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響あり)
- 認知 (影響なし)
- 光過敏 (影響なし)
- 手の操作が限られる キーボード、スイッチ、音声操作の利用者は、押したまま動かすことができず、つまみもTabの順序にないため、価格の範囲は最初のまま変えられません。
- 視覚を使わない スクリーンリーダーの利用者には、操作できる部品も値も見つかりません。範囲は中身のない2つのspanと、たどり着くとも限らない1行の文字です。
- 届く範囲・力が限られる 手の震えや握力の弱い人は、途中でつまみを離してしまったり、狙った値から1〜2刻みずれた所で離してしまったりします。
- 視覚が限られる 画面拡大を使うと、つまみと価格の表示が画面の別の場所に分かれることがあり、値の設定が手探りになります。
自動チェックに見えるのは、中身のない2つのspanと1行の文字で、問題は見つかりません。spanに名前は不要で、操作部品であることを示すものもないからです。axeは、名前や aria-valuenow のない role="slider" は報告しますが、矢印キーが効かないものや、値が変わらないものは報告しません。それはキーを押して初めて分かります。コード生成AIにスライダーの修正を頼むと、role="slider" と tabindex="0" を付けて終わることがよくあります。これでは、何も読み上げず動きもしない部品がTabの順序に入るだけです。マークアップに手がかりがないため、ドラッグせずに値を設定する方法を加えることもまれです。
試してみる
つまみをドラッグして価格の範囲を変えてください。次に、マウスを使わずにTabと矢印キーで試してください。
下の欄に、スクリーンリーダーの読み上げが出ます。ドラッグせずに価格を設定できますか?その値は聞こえますか?
問題あり 修正できますか?
価格$20 – $160
スクリーンリーダーの読み上げ:
(Tabで価格の絞り込みへ移動)
修正方法
範囲の両端に名前と、読み上げられる値と、キーと1回のタップで設定する方法を持たせます。
- 1範囲の両端がフォーカスを受け、矢印キーで動く。
- 2両端に名前があり、値を単位付きで読み上げる。
- 3どの値も、ドラッグだけでなく、クリック、タップ、入力で設定できる。
<div class="price"> <span class="price-label">価格</span> <span class="price-values">$20 – $160</span> <div class="track"> <span class="thumb" data-thumb="min" style="left: 10%"></span> <span class="thumb" data-thumb="max" style="left: 80%"></span> </div></div>2つのHTML標準のrange入力
<fieldset class="price"> <legend>価格</legend> <label for="price-min">最低</label> <input type="range" id="price-min" min="0" max="200" step="10" value="20" aria-valuetext="$20"> <output for="price-min">$20</output> <label for="price-max">最高</label> <input type="range" id="price-max" min="0" max="200" step="10" value="160" aria-valuetext="$160"> <output for="price-max">$160</output></fieldset>この方法を選ぶ理由:まずHTMLの要素を使う
つまみはフォーカスを受けないため、キーボードでは届きません。役割も名前も値もないため、支援技術は操作部品だと分かりません。操作の入口がポインターイベントだけなので、どの価格もドラッグが必要です。
ブラウザーが各入力にフォーカス、矢印キー、Page Up、Page Down、Home、End、スクリーンリーダーが読む役割と値を与えます。トラックをクリックやタップすると、つまみがその位置へ移ります。これはブラウザー自身の動作なので、2.5.7ではブラウザーの責任になります。aria-valuetext により値は「20」ではなく「$20」と読まれ、legendとラベルで両端が「価格、最低」のように名付けられます。代わりに見た目が変わり、1本のトラックに2つのつまみではなく、2本のトラックが上下に並びます。2つの入力を pointer-events: none で1本のトラックに重ねないでください。トラックのクリックが効かなくなり、ポインターの操作がまたドラッグだけになります。
3つとも適合します。HTML標準のrange入力はコードが最も少なく、キー、値、トラックのクリックをブラウザーから得られます。2本のトラックがデザインとして許される場合に選びます。独自のスライダーは1本のトラックと2つのつまみを保てますが、キー、値、トラックのクリックを自分で作って確認します。1本のトラックが必要で、スクリーンリーダーで確認できるチームなら選びます。数値の入力欄は既存のスライダーに手を加えず、誰にでも正確な入力を加えます。変更できないライブラリーのスライダーの場合や、住宅ローンや日付の範囲のように正確な値が必要な場合に選びます。
スクリーンリーダーが読む値は、aria-valuetext があればそれ、なければ aria-valuenow です。数値だけでは値にならない場合は必ず使います。「$20」「3泊」「水曜日」などです。短くし、名前は含めません。名前がすでに「最低価格」と伝えています。
ページに組み込んだ後の動作は、次の点で決まります。
- 絞り込みの適用:値が変わるたびに商品を読み込み直すと、矢印キーを押すたびにページが更新され、スクリーンリーダーには一覧の変化が10回聞こえる。キーを離して少し待ってから適用するか、「適用」ボタンを使い、件数をステータス領域で伝える。
- 縦のスライダー:独自のスライダーには
aria-orientation="vertical"を付け、上キーで値を上げる。HTML標準のrange入力はwriting-mode: vertical-lrで縦に描ける。 - タッチの大きさ:つまみとトラックは、24×24ピクセル以上のタップを受けられるようにする。paddingや疑似要素で、描いたつまみより当たり判定を大きくする。
- 強制配色:つまみとトラックの塗られた部分は、枠線や
currentColorで描き、コントラストテーマで消えないようにする。
スライダーのライブラリーはさまざまです。役割、キー、値はあってもトラックのクリックがないもの、aria-valuenow はあっても aria-valuetext がないものもあります。ライブラリーの説明ではなく、フォーカスを受ける要素が何を公開しているかを確認してください。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
5つの確認
確認方法: キーボード、スクリーンリーダー、マウス、タッチ
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。スライダーのコンポーネントやライブラリーを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。range入力や独自のスライダーの読み上げ方はスクリーンリーダーによって異なり、名前より先に値を読むものや、iOSのようにキーではなく上下のスワイプで動かすものもあります。色を選ぶスライダー、動画の再生位置、パネルの大きさを変えるスライダーには別の配慮が必要で、ここでは扱いません。「スライダー」が矢印の付いたスライドの列のことなら、キーボードやスクリーンリーダーで使えないカルーセルを参照してください。対象とする支援技術で、絞り込みの操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。