本文へスキップ

技術

紹介ページ2枚だけ、main もスキップリンクも無かった

アプリの紹介ページを2枚作ったあとで気づきました。その2枚だけ <main> もスキップリンクも無く、キーボードだけで見ている人は、装飾を全部たどらないと本文に入れませんでした。

器を持たないページが、抜け落ちる

サイトの下層ページには共通の器があり、そこが <main> とスキップリンクを供給していました。ところが紹介ページはサイトのヘッダーを持たない1枚もので、その器を通っていません。<section> から直接始まっていました。

目で見るぶんには何も問題がありません。壊れているのは、目で見ていない人にとってだけです。

気づいたきっかけは、キーボードだけでサイトを一周してみたことでした。それまで一度もやっていませんでした。

直し方 —— 器のほうに持たせる

ページ側で気をつける、にはしませんでした。紹介ページ全体を包む器を1つ作り、そこが <main> とスキップリンクを供給する形にしています。次にページを増やしても、その器で包むかぎり付いてきます。

ページの末尾に置くフッターは、children ではなく別のプロパティで受けています。<main>外に出すためです。

スキップリンクの飛び先には tabIndex が要る

ここが2つめの落とし穴でした。飛び先に tabIndex の指定が無いと、押してもスクロールが動くだけで、フォーカスは本文へ移りません。

<main id="main" tabIndex={-1}>

見た目には「効いている」ように見えます。画面はちゃんと本文へ動くからです。でもキーボードの位置は元のまま、つまりもう一度そこから装飾をたどることになります。 スキップリンクは飛ぶことではなく、フォーカスが移ることに意味があります。

ページ内アンカーを受けている部分でも、飛び先が tabindex を持つときだけ focus({ preventScroll: true }) を呼ぶようにしました。スクロールは別で行うので、フォーカス移動でもう一度動かさないためです。

ついでに、見出しの段が飛んでいた

同じときに見つけたのがこれです。共通の器が持つ見出しは既定が h3 で、法務ページでは上に h2 があるので成立していました。サポートページはその h2 を持たないので、h1 の次が h3 になっていました。段が1つ飛んでいます。

器に段を渡せるようにして、包まないページでは h2 を指定するようにしています。

  • よくある質問の質問文も、段落ではなく見出しにした
  • 見出しでないと、スクリーンリーダーで質問の間を移動できない

太字にすれば見出しに見えます。見えるだけでは、移動できません。

この種のものは、目視では見つからない

3つとも、画面を見ているかぎり永久に気づけない類でした。ビルドも通りますし、警告も出ません。

いまは新しい器を作ったときに、<main>・スキップリンクの飛び先・見出しの段の3つを確認するようにしています。器を増やすほど取りこぼす、というのが結論でした。

Notes 一覧へ戻る