トピックを検索
狭い画面で横スクロールが出るページ
列の幅が320ピクセルより狭くならないカードのグリッドは、ページの余白を加えると幅320ピクセルの画面に収まらず、すべてのカードが右端からはみ出します。
問題
拡大して読む人は、どの行も横にスクロールしないと読めず、端の先にあるものを見落とすこともあります。
陶芸教室が、講座をカードで並べています。ろくろ入門、釉薬、手びねり。各カードには講座名、日時、料金、「予約する」ボタンがあります。ノートパソコンでは1行に3枚並び、確認に使うスマートフォンでは1列に積み重なります。弱視の人が、幅1280ピクセルのウィンドウでページを400%にズームします。ページが使える幅は320 CSSピクセルになります。するとカードが収まらなくなり、すべてのカードが右端から20ピクセルはみ出して、長い行の終わりが切れ、ページが横にスクロールします。カードを読むたびに右へスクロールし、左へ戻り、次のカードでも同じことを繰り返します。
グリッドには repeat(auto-fill, minmax(320px, 1fr)) が指定されています。画面が狭くなると列が減るので、レスポンシブに見えます。しかし、列が320ピクセルより狭くなることはありません。この幅は、確認に使ういちばん狭い幅360ピクセルのスマートフォンで、カード1枚がちょうど収まるように決めたものです。ページの左右には20ピクセルずつ余白があるため、幅320ピクセルの画面ではグリッドに280ピクセルしか残らず、残った1列がグリッドから40ピクセル、画面の端から20ピクセルはみ出します。今使われているスマートフォンで幅360ピクセルより狭いものは少ないため、スマートフォンでの確認では問題が現れません。ページを320ピクセルまで狭めるのは、ズームです。達成基準1.4.10は、幅320 CSSピクセルで、2方向のスクロールなしにコンテンツを読めることを求めています。データテーブル、地図、図など、縦横の配置が必要なものは例外ですが、カードの一覧はそれに当たりません。
ページを幅320 CSSピクセルで見る人すべてが影響を受けます。今では主に、デスクトップのブラウザーを400%にズームする人や、画面拡大ソフトを使う人です。それだけ狭いスマートフォンは少ないため、スマートフォンでは、ズームしたり表示サイズを大きくしたりしたときに起こります。ズームするとCSSピクセルでの幅が狭くなるため、ウィンドウが広くても解決しません。
10グループ中3グループに影響
- 全盲 (影響なし)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 視覚が限られる ページを400%にズームする人や画面拡大ソフトを使う人は、各行の一部しか見えず、1行読むたびに横へスクロールして戻る必要があります。価格や「予約する」ボタンなど、端の先にあるものはまるごと見落としがちです。
- 手の操作が限られる キーボード、スイッチ、マウススティックを使う人にとって、縦横2方向のスクロールは大きな負担で、横スクロールバーは小さく狙いにくい操作対象です。
- 言語・認知・学習の能力が限られる 画面からはみ出す行は読む流れを途切れさせ、どこまで読んだか見失った人は、毎回次の行の始まりを探し直すことになります。
多くの自動チェックは、デスクトップの幅で一度ページを読み込むだけで、そこでは3列が余裕をもって収まります。axe にはリフローのルールがありません。検出するには、ビューポートを320ピクセルにして、ページのスクロール幅と表示幅を比べ、どの要素が広すぎるかを探す必要があります。AIによる修正は、よく次の3つの形で失敗します。
- body に
overflow-x: hiddenを指定する:スクロールバーは消えますが、カードの右端と、長い行の終わりが切れたまま、見る方法がなくなります。 - 360や390ピクセルなど、人気のスマートフォンの幅にブレークポイントを置く:ズームで生じ、達成基準が示す320ピクセルが抜け落ちます。
- 収まるまで文字や余白を小さくする:端が少し動くだけで、次に長い講座名が入るとまた崩れます。
試してみる
ページを400%にズームして、講座を読んでください。
「ズーム」のスライダーを動かしてください。ウィンドウの幅は1280ピクセルのままなので、400%ではページの幅は320 CSSピクセルです。カードは収まりますか?
修正方法
列の最小幅を min(100%, …) で囲み、列が親より広くならないようにします。
- 1列やコンテナーの最小幅を、320ピクセルから周りの余白を引いた幅より広くしない。
- 2画像、埋め込み、長い単語は、縮むか折り返して収まるようにする。
- 3横にスクロールしてよいのは表、地図、図、コード、メディアだけで、それも専用の枠の中に限る。
<main class="page"> <h1>今月の講座</h1> <ul class="classes"> <li class="class-card"> <h2>ろくろ入門</h2> <p>11月14日(土)10:00〜13:00</p> <p class="price">$65</p> <a href="/classes/wheel-basics" class="book">予約する</a> </li> <!-- 釉薬、手びねり --> </ul></main>320ピクセルではグリッドに280ピクセルしかありませんが、列は320ピクセルを譲らないため、どのカードも画面の右端から20ピクセルはみ出し、ページが横にスクロールします。
min(100%, 320px) は、グリッドが320ピクセルより広いときは320ピクセル、狭いときはグリッド自身の幅になります。広い画面では何も変わらず、列は320ピクセル以上を保って行を埋めます。320ピクセルでは1列が280ピクセルまで縮んで収まります。ウィンドウではなくグリッド自身の幅を基準にするため、サイドバーの横でも、ダイアログの中でも、狭い列の中でも保たれます。
どちらの方法でも、講座の一覧は320ピクセルに収まり、このページでは1.4.10を満たします。おすすめは min() で最小幅に上限を付ける方法です。1行を変えるだけで、広い画面のレイアウトはデザインのまま保たれ、グリッドが実際に使える幅を測るため、レイアウトのほかの部分を変えても崩れません。ブレークポイントの方法はよく知られた形で、モバイルファーストのスタイルシートがすでにあるなら使えます。ただしブレークポイントの値しだいで、グリッドを別のレイアウトに置くたびに確認し直す必要があります。
ほかの固定の幅も探す。 幅が固定されているのは、グリッドだけとは限りません。コンテナー、サイドバー、フォーム、ボタン、カードで、ピクセル指定の width と min-width を探します。100vw は縦のスクロールバーを含むため、ページより数ピクセル広くなります。width: 100% と max-width、または min(100%, …) を使います。
フレックスとグリッドの子要素。 フレックスの子要素の最小幅は、標準では中身の幅になります。そのため、長い単語や広い表が1つあるだけで、レイアウト全体が広がります。子要素に min-width: 0 を指定し、中身を折り返せるようにします。
長い単語。 メールアドレス、URL、注文番号、長い英単語は、標準では折り返しません。文字を入れる要素に overflow-wrap: anywhere を指定すると、ほかに収まる方法がないときだけ途中で折り返し、通常の文章は変わりません。
メディア。 画像、動画、iframe は、指定がなければ width 属性の幅を保ちます。max-width: 100% と height: auto を指定します。縦横の配置が必要な地図やグラフは、専用の枠の中でスクロールしてかまいません。
スクロールしてよいコンテンツ。 1.4.10の例外は、データテーブル、地図、図、動画、ゲーム、1行に並ぶ必要があるツールバー、改行で意味が変わるコードなどです。広い表は overflow-x: auto の要素で囲み、枠を見えるようにして、tabindex="0" と、役割と名前(キャプションを aria-labelledby で指す role="region")を付け、キーボードでもスクロールできるようにします。ページのほかの部分は、やはりリフローする必要があります。
はみ出しを隠さない。 body やラッパーに overflow-x: hidden や clip を指定すると、スクロールバーは消えますが、問題は消えません。切れた部分に届かなくなり、それも1.4.10を満たしません(コンテンツが消える失敗例F102)。
viewport の指定。 <meta name="viewport" content="width=device-width, initial-scale=1"> がないと、スマートフォンはページを約980ピクセルの幅で配置して縮小します。この meta 要素に固定の width=1024 を指定しても同じで、どのスマートフォンでもリフローしなくなります。
縦書きと低い画面。 横長のタイムラインなど、もともと横にスクロールするコンテンツには、高さ256ピクセルで同じことが求められます。400%では、固定表示のヘッダーやフッターが低い画面の大半を覆うこともあります。フォーカスが隠れる問題のガイドも参照してください。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
マウスを使わない5つの確認
確認方法: ズーム、キーボード
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のレイアウトやグリッドのスタイルを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。320ピクセルで適合しても、そのレイアウトが320ピクセルで使いやすいとは限りません。列が積み重なったあとも読む順序が自然か、重要なものがページのずっと下に押しやられていないかも確認してください。コード内のパスとクラス名は仮のものです。カードのグリッドがあるページだけでなく、すべてのページテンプレートで確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。