拡大した文字が切れる、高さ固定のボックス
高さを固定し、はみ出しを隠したヘッダーは、文字が大きくなっても広がらず、メニューの一部が切れてしまいます。
問題
文字を拡大して読む人が、切れた部分を読めず、そこでの現在位置も分かりません。
文房具店のヘッダーには、ロゴ、6つのリンク(ペン、紙、ギフト、ワークショップ、読みもの、お問い合わせ)、カートが並んでいます。標準の文字サイズでは1行に収まります。大きな文字で読む人が、ブラウザーのフォントサイズを200%にします。リンクは1行に収まらなくなり、数行に折り返します。ヘッダーは80ピクセルのまま中身を上下中央に置くため、見えるのは中央の行だけで、その上下の行は切れてしまいます。Tabキーを押すとフォーカスはそれらのリンクに移動しますが、フォーカス中のリンクは見えず、どこに移動したかを画面で確認できません。
ヘッダーには、デザインに合わせた height: 80px と、背景の模様を切り取るための overflow: hidden が指定されています。文字が大きくなると高さが足りなくなりますが、ボックスは広がらないため、80ピクセルを超えた部分は切り取られ、スクロールして見ることもできません。達成基準1.4.4は、文字を200%まで拡大しても、コンテンツや機能が失われないことを求めています。この例では、リンクが読めず、キーボードで届くリンクも見えないため、その両方が失われています。
ページ全体ではなく文字だけを拡大して、読みやすい幅を保つロービジョンの人が影響を受けます。標準のフォントサイズを一度大きく設定して、そのまま使う高齢の利用者も同じです。その文字サイズでキーボードを使う人は、ヘッダーの見えない部分にあるリンクにTabで移動してしまいます。スマートフォンでは、画面が狭いためにリンクが折り返し、標準の文字サイズでも同じヘッダーが切れることがあります。
多くの自動チェックは、標準の文字サイズで一度ページを読み込むだけで、そこではすべてが収まっています。axe にはこの問題を検出するルールがありません。検出するには、文字を拡大してから、各ボックスの高さと中の文字を比べる必要があります。AIによる修正は、よく次の3つの形で失敗します。overflow: hidden だけを消すと、固定の高さが残り、増えた行が下のコンテンツにはみ出して重なります。overflow: auto にすると、ヘッダーが小さなスクロール領域になります。text-overflow: ellipsis を加えると、さらに多くの文字が隠れます。
試してみる
文字を200%まで拡大して、メニューを読んでください。
「文字サイズ」のスライダーを動かしてください。ヘッダーのリンクをすべて読めますか?
修正方法
固定の高さを最小の高さに変えます。ヘッダーを1行に保つ必要があれば、リンクをメニューにまとめます。
- 1文字を入れる要素には min-height を使うか高さを指定せず、固定の高さにしない。
- 2文字のはみ出しを隠さない。装飾は専用の要素で切り取る。
- 3リンクを1行に保つ必要があれば、見えない場所ではなくメニューボタンの中にまとめる。
html
<header class="site-header"> <a href="/" class="logo">Inkwell & Co</a> <nav aria-label="メイン"> <ul class="site-nav"> <li><a href="/collections/pens">ペン</a></li> <li><a href="/collections/paper">紙</a></li> <li><a href="/collections/gift-sets">ギフト</a></li> <li><a href="/pages/workshops">ワークショップ</a></li> <li><a href="/blogs/journal">読みもの</a></li> <li><a href="/pages/contact">お問い合わせ</a></li> </ul> </nav> <a href="/cart" class="cart">カート (2)</a></header>css
.site-header { display: flex; align-items: center; gap: 24px; height: 80px; padding: 0 24px; overflow: hidden;}.site-nav { display: flex; flex-wrap: wrap; gap: 0 24px; margin: 0; padding: 0; list-style: none;}.cart { margin-left: auto; }200%ではリンクに2〜3行が必要ですが、ヘッダーは80ピクセルのままで、残りを隠します。リンクはページ内にあり、Tabの順序にも含まれているため、誰にも見えない文字にフォーカスが移動します。
標準の文字サイズでは80ピクセルのままで、文字に必要なときだけ高くなります。200%ではリンクが複数の行に折り返し、ヘッダーもそれに合わせて広がるため、すべてのリンクが見え、フォーカス中のリンクも確認できます。HTMLは変わりません。背景の模様を切り取る必要がある場合は、専用の要素で切り取ります(実装の判断を参照)。
どちらの方法でも、200%ですべてのリンクを読めて操作でき、1.4.4を満たします。ヘッダーを広げる方法はCSS2行で済み、保守も必要ないため、まずこちらから始めてください。ただし固定表示のヘッダーでは、大きな文字で2〜3行になると、ノートパソコンの画面の3分の1ほどを占めたまま、スクロールしても残ります。リンクをまとめる方法は、どの文字サイズでもヘッダーを低く保てるため、固定表示のヘッダーや、1行を保つ必要があるデザインに向いています。その代わり、スクリプトと、動作を保ち続けるべきメニューが増えます。テーマに小さな画面用のメニューボタンがすでにある場合は、画面幅ではなく「収まるかどうか」で切り替えるだけで済むことがほとんどです。
ほかの固定の高さも探す。 高さが固定されているのは、ヘッダーだけとは限りません。お知らせバー、ボタン、バッジ、カードの見出し、タブの並びなど、文字を含む要素で、ピクセル指定の height、max-height、line-height を探します。リンクを縦方向の中央に置くための line-height: 80px は、折り返した行をすべて80ピクセルの高さにします。代わりに align-items と余白で中央に置きます。
単位を変えるだけでは直らない。 rem や em で指定した高さ(テクニックC28)は文字と一緒に大きくなりますが、比例して大きくなるだけです。ズームでページの幅が狭くなったり、翻訳が長くなったりして、想定より多くの行に折り返すと、増えた行はやはり切れます。相対単位が役立つのは、行数が変わらない場合だけです。
切り取るのは装飾だけにする。 何かを切り取る必要がある場合は、疑似要素や背景用のラッパーなど、文字を含まない要素で切り取ります。overflow-x: clip は横方向だけを切り取り、高さは広がります。overflow-x: hidden では、もう一方の方向がスクロール領域になるため、同じ効果は得られません。
以前の高さを前提にした値。 position: fixed のヘッダーには、body { padding-top: 80px } や、scroll-padding-top: 80px、top: 80px のサブメニューが組み合わされていることがよくあります。ヘッダーが広がるようになると、これらの値ではコンテンツがヘッダーの下に隠れます。通常の配置の中に場所を保つ position: sticky を使うか、ヘッダーの実際の高さを測って値を決めます。
まとめるときのフォーカス。 リンクのどれかにフォーカスがある状態でまとめると、フォーカスが失われます。メニューを閉じてメニューボタンにフォーカスを移してください。Escapeキーでもメニューを閉じ、フォーカスをボタンに戻します。テーマの小さな画面用のドロワーは、たいていこの動作をすでに備えています。
行数の制限。 全文にすぐ移動できる抜粋を数行で切るのはデザインの判断ですが、価格、ラベル、メニュー項目を切ると、コンテンツが失われます。
拡大を禁止しない。 viewport の meta 要素に user-scalable=no や2未満の maximum-scale を指定すると、スマートフォンでピンチ操作による拡大ができなくなり、それだけで1.4.4を満たせません。<meta name="viewport" content="width=device-width, initial-scale=1"> だけを指定します。
修正の確認
マウスを使わない5つの確認
確認方法: ズーム、キーボード
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のヘッダーやテーマの設定を変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。厳密には、ページ全体のズームだけで1.4.4を満たせる場合もあります。ただし文字だけを拡大する人は多く、そこで切れるボックスは、ページの幅が狭いときのズームでも切れます。コード内のパスとクラス名は仮のものです。ヘッダーだけでなく、すべてのページテンプレートで確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。