トピックを検索
ボタンで代われないピンチ・ドラッグ・傾きのジェスチャー
商品の360度ビューが、ドラッグでしか回らず、ピンチでしか拡大できず、スマートフォンを傾けるたびに回ります。どれにもボタンがなく、傾きで回るのを止める方法もありません。
frame.addEventListener('touchmove', pinchToZoom) 問題
指1本、マウス、ヘッドポインター、スイッチ、音声操作、スクリーンリーダーで操作する人は商品を回すことも拡大することもできず、手やスマートフォンが動く人は、商品が回るのを止められません。
生活雑貨のショップが、ホーローのマグを360度ビューで見せています。周りから30度ごとに撮った12枚の写真です。写真の下には「ドラッグで回転、ピンチで拡大」とあります。横にドラッグするとマグが回ります。スマートフォンで2本の指を広げると拡大し、拡大した後はドラッグで写真を動かして、背面の小さな表示を読めます。スマートフォンでは、ページを開いたときから、傾けるとマグが回ります。ボタンはありません。マウスでは拡大がまったくできず、マグの背面を見るにはドラッグするしかありません。スマートフォンをスタンドに置いたり、ふるえる手で持ったりすると、マグは回り続けます。
どの操作もジェスチャーにしかなく、専用の操作要素がありません。ピンチは複数のポインターを使うジェスチャーで、WCAG 2.5.1は、それを使う機能が、1つのポインターで、軌跡なしでも使えることを求めています。たとえば「拡大」ボタンのタップです。失敗例F105は、この代わりの方法がない状態を挙げています。マグを回すことと、拡大した写真を動かすことは、ポインターを押したまま動かす必要があるドラッグ操作です。2.5.7は、同じことを1回ずつのクリックやタップでもできるようにすることを求めています(F108)。傾きは端末の動きで、2.5.4は2つのことを求めています。同じことができる操作要素と、動きへの反応をオフにする方法です(F106)。スマートフォン自体の動きの入力に関する設定を、ブラウザーはページに伝えないため、そのスイッチはページ上に必要です。
スマートフォンでは、ビューが画面の幅いっぱいになることがよくあります。touch-action: none があると、写真の上に置いた指ではページもスクロールできません。マグを通り過ぎて価格を見たいだけの人も、ジェスチャーに捕まってしまいます。
10グループ中4グループに影響
- 全盲 (影響あり)
- 弱視 (影響なし)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響あり)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 手の操作が限られる 指1本、スタイラス、マウススティック、ヘッドポインター、マウスで操作する人はポインターが1つしかないため、ピンチができません。スイッチや音声操作の利用者は、押したままドラッグすることもできません。ページには、ジェスチャーなしで商品を回したり拡大したりする方法がありません。
- 届く範囲・力が限られる 手がふるえると、スマートフォンが動くたびにマグが回り、車いすのホルダーに固定したスマートフォンでは、揺れるたびに回ります。2本の指を安定させてピンチしたり、ちょうどの角度までドラッグしたりするのは、力の弱い手や疲れた手には大変です。
- 視覚を使わない VoiceOverやTalkBackがオンのときは、写真の上のドラッグやピンチはページではなくスクリーンリーダーに渡るため、商品を回すことも拡大することもできません。それができることも、ページのどこにも示されていません。
- 言語・認知・学習の能力が限られる 説明にはドラッグとピンチしか書かれておらず、傾きのことはありません。スマートフォンが動くと商品が勝手に回るので驚き、止める方法もありません。
マークアップは、代替テキストとキャプションのある figure の中の画像で、どの自動チェックも合格にします。ピンチやドラッグのハンドラー、deviceorientation のリスナーは、DOMに何も残しません。この診断はブラウザーにページのリスナーを問い合わせ、端末の動きや向きを監視しているページと、touch-action: none ですべてのタッチを自分で受け取り、中にも横にもボタンがない大きな画像やcanvasを報告します。どちらも人が確認するための手がかりです。ジェスチャーごとに別の方法があるかは、ビューを実際に試して初めて分かります。修正をAIに頼むと、ビューをフォーカスできるようにして矢印キーで回すことがよくあります。キーボード利用者には役立ちますが、マウスや指1本の人はやはりドラッグとピンチが必要です。ほかにも、できないジェスチャーをスクリーンリーダー利用者に伝えるだけの aria-label="Drag to rotate" を付けたり、prefers-reduced-motion のときだけ傾きを止めたりします。この設定は画面のアニメーションのためのもので、設定を見つけた人にしか効かず、ボタンもないままです。
試してみる
マグを回して、背面の小さな表示を読んでください。1回ずつのクリックかタップだけを使います。
スライダーは、スマートフォンを傾ける代わりです。それぞれの側で動かしてください。頼むまで、マグは止まったままですか?ドラッグとピンチも使えますが、使わずに試してください。
問題あり 修正できますか?
修正方法
どのジェスチャーにも同じことをするボタンを付け、傾きで回る機能は、利用者がオンにするものにします。
- 1ジェスチャーでできる回転、拡大、移動は、どれも、見える操作要素を1回ずつクリックかタップしてもできる。
- 2スマートフォンを傾けたり振ったりしても、ページ上の操作要素でオンにするまで何も起きず、同じ操作要素でオフにできる。
- 3ジェスチャーは近道として残し、ビューの上に置いた指でもページをスクロールできる。
<figure class="spin-view"> <div class="spin-frame"> <img src="mug-00.jpg" alt="Enamel mug"> </div> <figcaption>Drag to turn. Pinch to zoom.</figcaption></figure><figure class="spin-view"> <div class="spin-frame" tabindex="0" role="region" aria-label="Zoomed photo"> <img src="mug-00.jpg" alt="Enamel mug"> </div> <figcaption>Drag to turn. Pinch to zoom.</figcaption> <div class="spin-controls"> <button type="button" data-turn="-1">Turn left</button> <button type="button" data-turn="1">Turn right</button> <button type="button" data-zoom="-1">Zoom out</button> <button type="button" data-zoom="1">Zoom in</button> <button type="button" class="tilt-switch" aria-pressed="false" hidden>Turn by tilting the phone</button> </div></figure>この方法を選ぶ理由:ジェスチャーは近道にし、唯一の方法にしない
回すことも写真を動かすこともドラッグが必要で、拡大には2本の指が必要で、傾きはオフにできません。ページには操作要素が1つもないため、1回のクリック、タップ、キー、音声のコマンドが働きかける先がありません。
「左へ回す」「右へ回す」を1回押すごとに隣の写真に変わり、12回で一周します。「拡大」「縮小」は1倍から3倍まで段階的に変わります。どれもボタンなので、クリック、タップ、Enter、Space、「右へ回すをクリック」という音声のコマンドで動きます。拡大した写真を動かすのはブラウザーに任せます。枠がスクロールするので、マウスではスクロールバーやホイールで、キーボードでは枠にフォーカスしてから矢印キーで、指ではほかのスクロールする枠と同じようにはじいて動かせます。傾きは、スイッチを押すまで何もしません。スイッチは aria-pressed でオンかオフかを伝え、もう一度押すとリスナーが外れます。iOSでは、この同じタップが、Safariがモーションセンサーの許可を求めるのに必要なタップになります。touch-action: pan-y によって写真の上の指でもページをスクロールでき、サイトは独自のピンチのために2本指のタッチを受け取れます。
ジェスチャーは残してください。ドラッグやピンチは、できる人にとっては速い方法で、達成基準が求めるのは別の方法であり、置き換えではありません。ボタンはビューの下か横の、ページの中に置きます。写真をタップした後にだけ現れるツールバーには置きません。ジェスチャーで出さなければならない操作要素は、そのジェスチャーの代わりになりません。
動きは、最初はオフにしておく方が安全です。傾きをオンのままにして、止めるスイッチを見える場所に置いても2.5.4は満たせます。ただし、スイッチを見つけるまでは誰の画面でもマグが回り、スマートフォンを静止させられない人も含まれます。iOSでは、どのみちタップから許可を求める必要があります。スニペットのように、モーションセンサーがありそうな環境でだけスイッチを表示し、パソコンで何もしない操作要素が出ないようにします。
ページでジェスチャーや動きが何かを動かすほかの場面にも、同じ考え方が当てはまります。
- 振って元に戻す、振ってシャッフル、振ってクーポン:同じ操作にボタンを付け、振る操作はオンにするまで止めておく。
- 写真のダブルタップやクリックで拡大:1つのポインターの操作なので、それだけで2.5.1と2.5.7は満たす。ただし画面には示されず、キーボードや音声では届かない。ボタンに加える近道として残す。
- 地図のピンチ拡大と移動:同じ「+」「−」のボタンと、移動用の矢印ボタンかスクロールする地図。W3Cが2.5.1の例として挙げている方法。
- ビューアーのライブラリー:360度ビューや拡大ビューアーの多くは、ボタンを描かなくても、次の写真や拡大のメソッドを持っている。本物の
<button>をそこにつなぎ、ライブラリーが描くボタンがある場合は、divではなくボタンかどうか確認する。
回転のボタンが進む量は、ドラッグで届く範囲に合わせます。写真が12枚なら、1回で1枚で十分です。72枚あると、1回1枚では一周が長くなります。ドラッグで見られる面がすべて見られる限り、3枚か6枚ずつ進めてください。アイコンのボタンには「左へ回す」のように人が口にする名前が必要です。詳しくは名前がないアイコンだけのボタンを参照してください。ビューアーを直すときに、ブラウザー自体の拡大を止めないでください。user-scalable=no のあるviewportタグは1.4.4を満たしません。拡大した文字が切れる、高さ固定のボックスでも触れています。スクリーンリーダー利用者には、それぞれの写真に何が写っているかも必要ですが、それは代替テキストと説明の問題で、ここでの達成基準の範囲ではありません。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
5つの確認
確認方法: マウス、タッチ、端末の動き、キーボード、音声入力、スクリーンリーダー
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。ビューアーやそのライブラリーを変更した際は、再度確認します。
制限
このサンプルは、どのビューアーでも同じ結果になることを保証するものではありません。2.5.1と2.5.4は、指で書く署名、歩数計、傾けて遊ぶゲームのように、ジェスチャーや動きが不可欠な場合を例外にしています。その例外に頼る前に、本当に不可欠か正直に確かめてください。ほかのジェスチャーには、それぞれのガイドがあります。スライドを切り替えるスワイプはキーボードやスクリーンリーダーで使えないカルーセル、つまみのドラッグはドラッグでしか動かない範囲スライダー、カードのドラッグはマウスでしか動かせないドラッグ&ドロップのボード、行のスワイプや長押しは右クリックや長押し、スワイプでしか出ない操作メニューを参照してください。お客様が使うスマートフォンと支援技術で、操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
参考資料
- WCAG Understanding: pointer-gestures(新しいタブで開きます)
- WCAG Understanding: dragging-movements(新しいタブで開きます)
- WCAG Understanding: motion-actuation(新しいタブで開きます)
- WCAG Technique F105(新しいタブで開きます)
- WCAG Technique F106(新しいタブで開きます)
- WCAG Technique F108(新しいタブで開きます)
- developer.mozilla.org: touch-action(新しいタブで開きます)
- developer.mozilla.org: requestPermission_static(新しいタブで開きます)
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。