トピックを検索
ドラッグでしかサイズを変えられない分割パネル
サイドバーと本文の間の区切り線はドラッグでしか動かず、フォーカスも当たらないため、キーやクリックでは幅を変えられず、今の幅も伝わらない
<div class="divider"></div> 問題
ドラッグできない人はサイドバーの幅を変えられず、スクリーンリーダーの利用者には、幅を変えられることも今の幅も伝わらない
メモアプリの画面は2つのパネルに分かれていて、左のサイドバーにメモの一覧、右に開いたメモがあります。長いメモの題名はサイドバーに収まらずに途中で切れるため、サイドバーは広げられるようになっています。パネルの間には細い線があり、ポインターを重ねるとカーソルが左右の矢印に変わります。ドラッグすれば、サイドバーをウィンドウの5分の1から半分までの好きな幅にできます。ところがTabキーを押すと、フォーカスはサイドバーのメモを順にたどった後、開いたメモの「共有」ボタンへ移ります。線には一度も止まらず、ほかに幅を変える方法もページにはありません。
線を role="separator" と aria-orientation="vertical" で区切りとしてマークアップしているレイアウトもあります。それでもキーボードでは何も変わりません。Tabキーは同じように線を飛ばし、矢印キーも何もしません。スクリーンリーダーでページを読み進めても、見つかるのはせいぜい区切り線で、幅も、変える方法も伝わりません。
区切りは、スクリプトがポインターイベントで動かす空の div です。リンクでもボタンでも入力欄でもなく、tabindex もないため、Tabで止まらず、キー操作も受け付けません。サイドバーの幅を変えることはアプリの機能の一つですが、キーボードでは一切できないため、2.1.1を満たしません。
幅を変える方法はドラッグだけなので、2.5.7も満たしません。パネルの大きさを変えるのに、ドラッグは必要ありません。ポインターがどんな道筋をたどったかで結果は変わらないからです。キーボードで操作できるようにするだけでも足りません。2.5.7の解説書は、ドラッグ操作をキーボードで同じようにできても、それで自動的にこの達成基準を満たすわけではないとしています。タッチスクリーンやヘッドポインターを使う人、マウスのボタンを押したままにできない人は、矢印キーを使えないこともあり、クリックやタップで操作できるものが必要です。
区切りはスクリプトで動くコントロールなのに、ロールも名前も値もないため、4.1.2も満たしません。role="separator" を付けるだけでは解決しません。ARIAの区切りには2種類あります。hr のように見た目の境界を示す静的なものと、フォーカスでき、aria-valuenow で位置を示すウィジェットです。フォーカスできない区切りは静的なほうになるため、このロールは支援技術に「ここには操作するものがない」と伝えてしまい、サイドバーの幅を示す値もありません。区切りは指定しない限り横向きなので、aria-orientation="vertical" 自体は正しいのですが、この属性は線の向きを示すだけで、コントロールにはなりません。
サイドバーの幅を変えたくなるのは、本文のパネルが狭くて読み書きしにくいときや、サイドバーでメモの題名が切れるときです。どちらも、拡大表示を使う人に一番よく起きます。拡大すると、どのパネルにも収まる内容が減るからです。毎日使うアプリで幅を変えられないと、その不便が一日中続きます。
10グループ中5グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 筋力・可動域 (影響あり)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 手の操作が限られる キーボードやスイッチの利用者は区切りに一度も止まれず、音声操作の利用者は声で指定する名前もないため、サイドバーは最初の幅のまま変えられません。
- 視覚が限られる 拡大するとどのパネルにも収まる内容が減るので、幅を変えたくなるのは拡大表示を使う人ほどです。それなのに、つかむ線は1〜2ピクセルの幅しかありません。
- 筋力や可動域が限られる 手のふるえがある人は、細い線をつかんだまま静止させるのが難しく、離す瞬間にも幅が変わってしまいます。
- 言語・認知・学習の能力が限られる 線をドラッグできると分かるのは、ポインターを重ねたときのカーソルの形だけです。タッチスクリーンにはホバーがないため、サイドバーの幅を変えられることに気付かない人が多くいます。
- 視覚を使わない スクリーンリーダーの利用者には、パネルの間に何もないか、操作できない区切り線があるだけなので、レイアウトを調整できること自体が伝わりません。
自動チェックに見えるのは、名前の要らない空の div か、フォーカスできない、つまり静的で何も要らない区切りです。どちらの修正前も、自動チェックのルールには反しません。axeの aria-required-attr は、フォーカスできるのに aria-valuenow のない区切りを報告するため、途中までの修正は見つかりますが、問題そのものは見つかりません。EaseWebの診断は、サイズ変更のカーソルが表示され、フォーカスを受け取らない細い帯があると、確認を促す項目を出します。ページのほかの場所で幅を変えられるかは、人が試さないと分からないからです。AIのコーディング支援に区切りのアクセシビリティ改善を頼むと、tabindex="0" と role="separator" を付けただけで終わることがあります。区切りはTabで止まるようになりますが、何もできず、値もなく、ドラッグせずに幅を変える方法もないままです。
試してみる
マウスでサイドバーを広げてから、マウスを使わずにTabでも試してみましょう
問題1: パネルの間の線をドラッグします。次にTabキーを押します。フォーカスは最後のメモから「共有」へ移り、区切りには止まりません。下の欄にも、区切りは一度も出てきません。
問題2: 同じ区切りに role="separator" を足しただけです。Tabキーは同じように区切りを飛ばし、矢印キーも何もしません。スクリーンリーダーでページを読み進めても、見つかるのはせいぜい区切り線で、幅も、変える方法も伝わりません。
修正を適用します。 Tabキーと矢印キー、HomeとEndで試し、次にクリックだけで試してください。ドラッグせずに幅を変えられますか?
問題あり 修正できますか?
持ち物リスト
- パスポートと航空券
- 充電器と変換プラグ
- レインコート
スクリーンリーダーの読み上げ:
(Tabでアプリの中を移動してください)
修正方法
ドラッグしなくても幅を変えられるようにする
ドラッグでしか動かない区切り
<div class="notes-app"> <nav class="sidebar" id="sidebar" aria-labelledby="notes-title" style="width: 30%"> <h2 id="notes-title">メモ</h2> <ul> <li> <a href="/notes/packing-list" aria-current="page">持ち物リスト</a> </li> … </ul> </nav> <div class="divider"></div> <main class="note"> <h1>持ち物リスト</h1> <button type="button">共有</button> … </main></div>問題点3点
- 区切りはフォーカスを受け取らないため、キーボードでは届きません。
- 動かす方法はドラッグだけです。
- ロールも値もないため、ここにコントロールがあることも、サイドバーの幅も、支援技術には伝わりません。
矢印キーで動く区切りと、「狭く」「広く」のボタン
<div class="notes-app"> <nav class="sidebar" id="sidebar" aria-labelledby="notes-title" style="width: 30%"> <h2 id="notes-title">メモ</h2> <ul> <li> <a href="/notes/packing-list" aria-current="page">持ち物リスト</a> </li> … </ul> <div class="sidebar-width" role="group" aria-label="サイドバーの幅"> <button type="button" data-step="-5">狭く</button> <button type="button" data-step="5">広く</button> </div> </nav> <div class="divider" role="separator" tabindex="0" aria-orientation="vertical" aria-labelledby="notes-title" aria-controls="sidebar" aria-valuenow="30" aria-valuemin="20" aria-valuemax="50" aria-valuetext="30%"></div> <main class="note"> <h1>持ち物リスト</h1> <button type="button">共有</button> … </main></div>修正の手順6ステップ
tabindex="0"で、区切りをTabの順序に入れます。フォーカスできる区切りはウィジェットの種類になり、aria-valuenowが必須です。- 大きさを変えるペインと同じ「メモ」を
aria-labelledbyで名前にし、aria-controlsでそのペインを指します。 aria-valuenow、aria-valuemin、aria-valuemaxでサイドバーの幅をアプリに対する割合で示し、aria-valuetextで、その数字がパーセントだと伝えます。- 左右の矢印キーで5%ずつ動かし、HomeとEndでサイドバーの最小と最大の幅にします。
preventDefault()で、矢印キーでページがスクロールしないようにします。 - 「狭く」と「広く」のボタンを加えます。1回のクリックやタップで幅を変えられ、区切りだけでは得られない、ドラッグしない方法になります。HTML標準のボタンなので、Tabの順序に入り、音声操作では「広くをクリック」と言えます。キーと同じ5%ずつ動くので、キーで届く幅にはすべて届きます。
- どの方法でも
setWidth()を通すため、スクリーンリーダーが読む値はいつも画面の幅と同じです。ドラッグは近道として残ります。
これで二つの修正前の例はどちらも直り、2.1.1、2.5.7、4.1.2を満たします。区切りは、ARIA Authoring Practices Guide(APG)のウィンドウスプリッターのパターンに沿うものになりました。ただし、Enterキーでペインを折りたたむ操作は含めていません(「実装の判断」を参照)。
この方法を選ぶ理由:ジェスチャーは近道にし、唯一の方法にしない
区切りとボタンの組み合わせを使ってください。取りこぼしのない修正はこれだけです。キーボード利用者は見えている線のところで、ARIAのパターンどおりに幅を変えられ、スクリーンリーダーの利用者には幅も伝わり、1回のクリックやタップでも幅を変えられます。コードは一番多くなります。区切りの上の矢印キーをスクリーンリーダーがどう扱うかは製品によって異なるため、ボタンはポインターの代わりであると同時に、その備えにもなります。ボタンだけでも3つの達成基準は満たし、区切りを隠す以外にARIAも要らない最も小さな変更です。ただし、幅は読まれず、ボタンは線から離れた場所にあります。ときどき幅を変える程度のサイドバーで、区切りをスプリッターに作り替えるまでの第一歩と考えてください。区切りだけでも足りないので、ボタンを加えてください。
値の単位は何でもかまいません。aria-valuenow、aria-valuemin、aria-valuemax が同じ単位を使い、ドラッグ、キー、ボタンのたびに aria-valuenow が変われば十分です。ここで使っているアプリに対する割合は、ウィンドウの大きさが変わっても意味が変わりません。ピクセルの幅でもかまいません。ARIAでは、aria-valuetext は数字だけでは値を表せないときに使うものとされています。「30」だけではパーセントかピクセルか分からないため、ここでの修正では単位を付けて「30%」とします。数字だけで伝わる場合は付けなくてかまいません。
実際のレイアウトでは、次の点で区切りの動きが決まります。
- 向き:区切りは、指定しない限り横向きです。左右に並ぶパネルには
aria-orientation="vertical"を付けて左右の矢印キーを使い、一覧の下にプレビューがあるような上下に並ぶパネルは、既定の向きのまま上下の矢印キーを使う。 - 右から左へ書くレイアウト:APGでは、左矢印キーで区切りが左へ動く。サイドバーが右にあると、これでサイドバーが広がるため、ページの向き(
getComputedStyle(divider).direction)を読み取り、キーの向きを合わせる。 - 折りたたみ:APGのパターンには、Enterキーでペインを折りたたみ、元に戻す操作もあるが、ここでの修正には含めていない。加える場合は、「狭く」「広く」のボタンと同じ理由で、目に見える折りたたみボタンも加え、閉じている間も最小の値が幅として読まれてしまうため、
aria-valuetextで閉じていることを伝える(「折りたたみ中」)。 - フォーカス:区切りは細いため、ドラッグを受け取る帯全体を囲むフォーカスの枠を描き、両側のパネルに対して3:1以上にする。詳しくは「コントラストが足りない入力欄・アイコン・フォーカス枠」を参照。
- ドラッグ:ドラッグを受け取る帯は、描いた線より広くし、
touch-action: noneを付けて、帯の上のドラッグでページがスクロールしないようにする。 - 狭いウィンドウ:400%の拡大表示やスマートフォンでは、「狭い画面で横スクロールが出るページ」で説明しているように、パネルを縦に並べるか、サイドバーを引き出し式にする。そのときは区切りとボタンを
display: noneで隠し、何の幅も変えないTabの停止位置を残さない。 - 幅の記憶:次に開いたときも幅を保つなら、最初に変えたときだけでなく、ページを読み込んだ時点で、保存した幅から
aria-valuenowとaria-valuetextを設定する。
パネルのライブラリーはさまざまです。つまみに role="separator" と tabindex="0" を付けても aria-valuenow を付けないもの(axeが報告します)、role="slider" を付けるもの(矢印キーで動き、値もありますが、2つのパネルの間の線ではなくスライダーとして読まれます)、何も付けないものがあります。ライブラリーの説明ではなく、フォーカスしたつまみが何を伝えるか、クリックだけで幅を変えられるかを確認してください。
デザインの案
区切りは細い線のままでも、ドラッグせずに幅を変えられる
メモの一覧と開いたメモの間の線を3通りに描きました。それぞれドラッグしてから、クリックだけで試し、マウスを使わずにTabでも試してください。2つは1回ずつ押すだけで幅が変わり、1つはポインターを押さえたままでないと動きません。
デザインファイルで
- 区切りは、何もしていない状態から、押せるものを横に添えて描く。ホバーで現れる線だけにしない。
- サイドバーの最小と最大の幅、1回押すごとに変わる幅(5%など)を書いておく。
- 区切りとボタンそれぞれにフォーカスの枠を付けて描く。どちらのパネルに対しても3:1以上にする。
- スマートフォンのレイアウトも描く。パネルは縦に並び、区切りは表示しない。
合格
- 持ち物リスト線の上の小さな矢印 線の中ほどに白い小さな楕円を置き、狭くする矢印と広くする矢印を並べます。どちらも24 × 24ピクセルで、操作は目が探す場所にあります。1回押すごとに線が5%動き、線そのものもTabキーと矢印キーで動き、ドラッグもできます。最小と最大の幅では、矢印を消さずに薄く描きます。
- 持ち物リストツールバーのサイドバーの幅の切り替え 「狭い」「中」「広い」の3つの幅を、パネルの上の小さな切り替えに並べ、今の幅を青で塗ります(白に対して6.83:1)。どの幅になっているか、誰にでも見えます。パネルの間の線はこれまでどおり、間のどの幅にもドラッグでき、そのときは3つのどれも塗られません。
不合格
- 持ち物リストホバーで現れる線WCAG 2.5.7 最もすっきりしたレイアウトです。ポインターが近づくまでパネルの間に線はなく、近づくと2ピクセルの青い線が現れ、それをドラッグします。幅を変える方法はドラッグだけなので、Tabでは何も見つからず、クリックしても何も起きません。ホバーのないタッチスクリーンでは、線が表示されることもありません。
修正の確認
5項目
確認方法: キーボード、スクリーンリーダー、マウス、タッチ、拡大表示
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。レイアウトやパネルのライブラリーを変更した際は、再度確認します。
スクリーンリーダーでの role="separator" tabindex="0"の読まれ方
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。スクリーンリーダーによって、区切りの読み方や、矢印キーを区切りに渡すかどうかが異なるため、利用者が使う製品で確認してください。価格や音量のような1つのスライダーは「ドラッグでしか動かない範囲スライダー」、カードや項目の移動は「マウスでしか動かせないドラッグ&ドロップのボード」、ジェスチャー全般は「ボタンで代われないピンチ・ドラッグ・傾きのジェスチャー」で扱っています。表の列幅の変更、ドッキングや切り離しのできるパネル、3つ以上並ぶペインには、それぞれ別の配慮が必要で、ここでは扱いません。対象とする支援技術で、レイアウト全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
EaseWebのサービス
修正した問題を、次のリリースで再発させない
このガイドのような修正方法を、コーディングエージェントが従うルールと、CIのチェックに組み込みます。あわせて定期的に、キーボードとスクリーンリーダーで手動の再テストを行います。