本文へ移動
easeweb
ご相談
トピックを検索

Tabで近づくとフッターが遠ざかる無限スクロール

ショップのマグの一覧は、終わりが見えてくるたびに、フッターの手前へ12個ずつ追加されます。読み込み中の表示もただのdivのため、Tabキーでフッターに近づくと、そのつど新しいマグに行き当たり、スクリーンリーダーには追加されたことが伝わりません。

WCAG 2.2
SC 2.1.1ASC 2.4.3ASC 4.1.3AA· 2.1 で追加
必須とする規格
Section 508 · EN 301 549(EU) · JIS X 8341-3
問題あり observer.observe(sentinel);
アクセシビリティの問題を示した図: 手の操作:「お問い合わせ」にはどう行くの?
01

問題

スクロールで読み込み続ける一覧では、キーボードの利用者がその下のリンクに届かないか、読み込みのたびに今の位置を見失う。スクリーンリーダーの利用者には、項目が追加されたことが伝わらない

02

試してみる

キーボードだけで、マグの一覧の下にある「お問い合わせ」まで移動してみましょう

  • 問題1: Tabキーでマグを順に移動します。フォーカスが終わりに近づくたびに、フッターの手前に12個のマグが追加され、下の欄のとおり、スクリーンリーダーには何も聞こえません。

  • 問題2: 同じ一覧を、読み込むたびに作り直します。フォーカスはそれまでのマグから外れ、次にTabキーを押すと最初のマグから始まります。

  • 修正を適用します。 ボタンの場合は、Tabキーでボタンの先の「お問い合わせ」へ進むか、ボタンを押してさらに読み込みます。フィードの場合は、どのマグからでもCtrl + Endを押します。

問題あり 修正できますか?

再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。

03

修正方法

利用者が求めたときに読み込み、一覧を作り直さずに新しい項目を追加し、表示中の件数をステータスの行で伝える

  1. 1一覧の後ろにあるものへキーボードで届くようにする。一覧の後ろのボタンで読み込むか、フィードに一覧を飛ばすキーを用意する。
  2. 2新しい項目は表示中の項目の後ろに追加し、フォーカスのある一覧を作り直さない。
  3. 3読み込み中のメッセージと新しい件数は、最初からページにあるステータスの行に入れる。
修正前

スクロールで読み込むマグの一覧

<main>  <h1>マグ</h1>  <ul class="products" data-total="48">    <li>      <a href="/mugs/enamel-white">        <img src="/images/enamel-white.jpg" alt="">        ホーローのマグ(白)      </a>    </li>    …  </ul>  <div class="loading" hidden>マグを読み込んでいます…</div>  <div class="sentinel"></div></main><footer>  <a href="/contact">お問い合わせ</a>  <a href="/returns">返品</a></footer>
修正後

「さらに表示」ボタンとステータスの行

<main>  <h1>マグ</h1>  <ul class="products" data-total="48">    <li>      <a href="/mugs/enamel-white">        <img src="/images/enamel-white.jpg" alt="">        ホーローのマグ(白)      </a>    </li>    …  </ul>  <p class="count" role="status">48個中12個を表示</p>  <button type="button" class="load-more">さらに12個表示</button></main><footer>  <a href="/contact">お問い合わせ</a>  <a href="/returns">返品</a></footer>

04

デザインの案

リストの終わりの見せ方は一つではない

ガイドのマグの一覧を、フッターに届くまま終える方法をさらに3通りと、届かなくなる流行りの形を2通り示します。Tabキーで順に移動し、ボタンを押してみてください。

デザインファイルで

  • 最後の行の後、フッターの前に来るものを、ボタンかページのリンクとして描く。勝手に増える行にはしない。
  • 表示中の数を「48個中24個を表示」のように言葉でボタンのそばに書き、変わったときに読み上げる行だと書き添える。
  • 読み込み中のボタンも、ラベルとフォーカスの枠を付けたまま、同じ場所に描く。
  • 読み込んだ後にフォーカスが移る先として、最初の新しい項目に印を付ける。

合格

  • 薄く見える次の行と、その上のボタン 次の行が白いもやの向こうに透け、その上に輪郭線のピル型ボタンが載るため、続きがあることが目で分かります。ボタンを押すまで何も増えないので、フッターはボタンの次のTabキーで届きます。薄いマグは絵で、リンクではありません。
  • 48個中24個

    進み具合の線と、輪郭線のピル型ボタン 言葉の「48個中24個」の下に細いバーがあり、その下に輪郭線のピル型ボタンがあります。言葉がステータスの行で、変わると読み上げられます。バーは同じことを繰り返すだけなので、デザインに合わせて控えめにできます。
  • コンパクトなページ切り替え 1本の角丸のバーに、「4ページ中2ページ目」を挟んで「前へ」と「次へ」を置きます。どのページも独立したページなので、利用者の足元で何かが増えることはなく、フッターは動かず、ブックマークもできます。矢印には言葉の名前が必要です。

不合格

  • 勝手に読み込まれるプレースホルダーのカードWCAG 2.1.1 最後のマグへTabキーで移動すると、その下に灰色のプレースホルダーのカードが勝手に現れ、マグに変わります。滑らかに見えますが、Tabキーで終わりに近づくたびに、フッターの手前に新しい行が届きます。プレースホルダーは残し、ボタンを押した後に出します。
  • スピナーに変わるピル型ボタンWCAG 2.4.3 押してみてください。読み込みの間、ピル型ボタンがスピナーに置き換わるため、フォーカスのあったボタンが消え、フォーカスも一緒に失われます。ボタンが戻っても、フォーカスはどのコントロールにもありません。ボタンはその場に残し、スピナーはボタンの中に出します。
05

修正の確認

5項目、マウス不要

確認方法: キーボード、スクリーンリーダー

5件中0件を確認済み

OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。一覧、その部品、ライブラリーを変更した際は、再度確認します。

スクリーンリーダーでの role="status"、role="feed"、aria-posinset, aria-setsize、aria-busy="true"の読まれ方

制限

このサンプルは、どの一覧でも同じ結果になることを保証するものではありません。スクリプトは最小限の例で、エラー、絞り込み、並べ替え、ブラウザーの「戻る」ボタンを扱っていません。画面外にスクロールした行を取り除く仮想化ライブラリーで描く一覧には、別の確認が必要です。リンクと「かごに入れる」ボタンのように、1枚の商品カードに複数のコントロールがあると、一覧を通り過ぎるための操作が倍以上になり、「さらに表示」ボタンはいっそう重要になります。ページの中のスクロール領域がスクロールで読み込み続ける場合の届き方は、キーボードでスクロールできないスクロール領域で扱っています。訪問者が使う支援技術で、一連の操作全体をテストしてください。

よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。

コードを更新しても、使いやすさを保つために

ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。

再テストの進め方