トピックを検索
フォーカス中のボタンを一部隠すチャットボタン
画面の隅に固定したチャットボタンが、スクロールに合わせて各行の端に重なります。ブラウザーはフォーカスしたボタンを表示中とみなすため、その下から動かしません。
問題
キーボード利用者が、浮いたチャットボタンに半分隠れたボタンにフォーカスし、どこにフォーカスがあり、何と書いてあるかが分かりません。
地域のコミュニティセンターが、「パン作りの基本」「水彩画入門」「自転車の修理」などの講座を一覧にしています。各行の右端には「予約」ボタンがあります。画面の右下には、丸い「チャットで質問」ボタンがページに重なって浮いています。Tabキーで一覧を進むと、下のほうの行では、チャットボタンが「予約」ボタンの右半分に重なります。フォーカスはそこにあり、枠も一部は見えますが、ボタンの文字と枠の大部分はチャットボタンの下です。少しスクロールしてShift + Tabで戻っても、同じことが起きます。
フォーカスが移ったとき、ブラウザーがスクロールするのは、要素がスクロール領域の外にある場合だけです。浮いたチャットボタンの下のボタンは領域の内側にあるため、ブラウザーは表示中とみなし、画面を動かしません。右下の隅が覆われていることは、ブラウザーに伝わっていません。レベルAAAの達成基準2.4.12は、キーボードフォーカスを受けた要素のどの部分も、制作者の置いたコンテンツで隠れないことを求めています。レベルAAの2.4.11は完全に隠れないことだけを求めるため、このボタンは2.4.11を満たし、2.4.12を満たしません。また、解説書によると半透明の重なりも隠していることになります。要素が透けて見えていても、フェードやぼかしの層がかかっていれば基準を満たしません。
チャットボタンが出ている間にTab移動する人は誰でも影響を受けます。スマートフォン幅のレイアウトでは、チャットボタンが各行に占める割合が大きくなり、より多くの操作要素がその下に入ります。
10グループ中2グループに影響
各ボタンには名前もフォーカス表示もあり、Tab順序にも入っています。ページを読み込むだけの自動チェックには、ボタンは見えています。隠れるのは、スクロールした後、特定の画面サイズのときだけです。チャットボタンは、読み込み後に外部のスクリプトが追加することも多くあります。多くの自動チェックはスクロールしたページでTab移動をせず、移動するものも、たいていは完全に隠れたフォーカスしか報告しません。生成されたレイアウトも、position: fixed のチャットボタンを置くだけで、その隅を確保しないことがよくあります。
試してみる
Tabで講座の一覧を下へ進み、Shift + Tabで戻ってください。
フォーカスした「予約」ボタンを目で追ってください。全部見えますか?チャットボタンが一部に重なっていませんか?
問題あり 修正できますか?
- パン作りの基本
- 水彩画入門
- 自転車の修理
- はじめての編み物
- プランター菜園
- 応急手当の基本
- 陶芸ろくろ体験
- スマートフォンで写真編集
- トートバッグを縫う
- 家庭の省エネ
再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。
修正方法
scroll-paddingでチャットボタンの隅を確保するか、チャットボタンをページに重ねずレイアウトの中に置きます。
- 1どちらのTab方向でも、フォーカス中の要素のどの部分も固定表示の要素の下にない。
- 2浮いた要素のために確保する余白は、その要素自身の大きさと位置から取り、両者を常にそろえる。
- 3半透明の重なりも隠していることになる。フォーカス中の要素にかかるフェードも基準を満たさない。
.chat-launcher { position: fixed; inset-inline-end: 1rem; bottom: 1rem; inline-size: 3.5rem; block-size: 3.5rem; border-radius: 50%;}チャットボタンは画面右側の下4.5remを覆い、ページはその下をスクロールします。ブラウザーが表示中とみなしたボタンは、半分隠れたまま止まります。ページ最後の行は、チャットボタンの上までスクロールできません。
scroll-padding-bottom は、画面下の帯が実際には見えていないことをブラウザーに伝えます。そこでフォーカスを受けた要素は、チャットボタンの手前まで上にスクロールされます。main の終わりの余白で、最後の行もそこまでスクロールできます。どちらもチャットボタンと同じトークンから取るため、ずれません。ただし、チャットボタンがその大きさを保っている間だけ有効です。幅の広い「チャットで質問」の形に変わったりパネルとして開いたりする場合は、確保する余白も広げる必要があります。下にCookieバナーが出る場合は、二つの高さを足します。余白は画面幅いっぱいの帯になるため、高さの低い画面では表示できる量が減ります。
どちらも基準を満たします。scroll-padding は、デザインで求められた浮いたチャットボタンを保てて、数行のCSSで済みます。ただし、確保する余白がどの状態でもチャットボタンと一致している必要があり、外部のウィジェットは知らないうちに大きさを変えることがあります。ヘッダーへ移す方法は、計測なしで重なりそのものをなくせますが、デザインが変わり、スクロールするとチャットボタンが見えなくなります。浮いた隅の配置が必須で、チャットボタンの大きさを管理できる場合は scroll-padding を、テンプレートを変更できる場合やウィジェットの大きさを管理できない場合はヘッダーへの移動を選んでください。
ページに重なる要素は、それぞれ余白を確保するかレイアウトの中に置く必要があるため、すべて数えてください。
- チャットボタン。幅の広い形に変わったり、パネルとして開いたりすることがよくあります。
- 「ページ上部へ」ボタン。たいていスクロールした後にだけ現れます。
- Cookieやキャンペーンのバナー。チャットボタンと同時に出ると、高さが足し合わされます。
- 固定ヘッダー。上に戻るときに画面の上部を覆います。
続きがあることを示すために画面下に置くフェードやグラデーションは、要素が透けて見えていても、2.4.12では隠していることになります。その高さも確保するか、取り除いてください。チャットボタンの影もボタンの一部なので、間隔に含めます。
この基準が対象とするのは、フォーカス中の要素であり、フォーカスの枠ではありません。それでも、枠のオフセットもチャットボタンに重ならないよう、十分な間隔を空けてください。そうしないと、見えないのが枠になることがあります。
外部のチャットウィジェットは、たいてい独自の固定表示の要素を追加します。提供元が位置の調整や非表示に対応しているかを確認し、実際に表示される大きさから余白を決め、ウィジェットの更新後に再確認してください。ウィジェットがページに重なる非モーダルのパネルを開く場合は、覆う範囲がずっと広くなります。開いている間はその高さを確保するか、フォーカスをパネルに移し、閉じたときに戻してください。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
マウスを使わない5つの確認
確認方法: キーボード、ズーム
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。チャットボタン、バナー、ページのレイアウトを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。レベルAAAの達成基準は、サイト全体に求められるものではなく、満たせないコンテンツもありますが、この基準は少ない手間で満たせることが多いです。現在のブラウザーはフォーカスによるスクロールにも scroll-padding を適用しますが、対象のブラウザーで確認してください。ページ内のスクロール領域には、それぞれ余白の指定が必要です。コード内のトークン名は、実際のデザイントークンに置き換えてください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。