WCAG 達成基準 · Level A

WCAG 2.4.1: ブロックの回避

WCAG 2.4.1 は、ナビゲーションメニューなどの繰り返されるコンテンツのブロックをスキップするための仕組みをウェブページが提供することを求めています。これにより、キーボードや支援技術のユーザーは、すべてのリンクをタブでたどらなくてもメインコンテンツに到達できるようになります。これはレベルAの要件であり、アクセシブルなキーボードナビゲーションの基準となるものです。

この規定の意味

WCAG 2.4.1「繰り返しブロックの回避」では、「複数のウェブページで繰り返されるコンテンツのブロックを迂回するためのメカニズムが利用可能である。」と定められています。実務的には、複数ページにわたって一貫して表示されるリンクの集合、ナビゲーションメニュー、バナー、その他のコンテンツブロックには、ユーザーがそれらを飛ばして、そのページ固有のコンテンツに直接移動できる手段を用意しなければならない、という意味です。

最も広く認知されている実装はスキップナビゲーションリンクです。これは、ページ上で最初のフォーカス可能な要素として配置されるアンカー要素であり、#main-content のようなフラグメント識別子を使ってメインコンテンツ領域へリンクします。ただし、WCAG は他の回避メカニズムも認めています。たとえば、適切に構造化されたランドマーク領域(HTML5 の <main><nav><header> 要素やそれらの ARIA 同等要素など)や、スクリーンリーダーユーザーがセクション間をジャンプできる見出し構造などです。

ページがこの達成基準に適合しているといえるのは、次のいずれかが成り立つ場合です。スキップリンクが存在し、機能していること。支援技術がクイックナビゲーションのために公開する意味のある HTML5 ランドマーク要素をページが使用していること。あるいは、同等のキーボードショートカットやページ内ナビゲーションメカニズムによって、ユーザーが繰り返しブロックを回避できること。スキップリンクはデフォルトでは視覚的に非表示でも構いませんが、キーボードフォーカスを受けたときには可視にならなければならず、かつアクティブ化されたときに実際にキーボードフォーカスをターゲットへ移動させなければなりません(ビューポートをスクロールさせるだけでは不十分です)。

ページがこの達成基準に不適合となるのは、スキップリンクもランドマーク構造もその他のメカニズムも存在しない場合、スキップリンクはあるが display:nonevisibility:hidden によって恒久的に隠され(フォーカス不可能になっている)場合、スキップリンクのターゲットアンカーが DOM に存在しない場合、あるいはリンク自体は存在するもののフォーカスを移動させず、キーボードユーザーがすべてのナビゲーション項目をタブでたどらざるを得ない場合です。WCAG は、繰り返しブロックが存在しないページ、たとえばナビゲーションヘッダーのない単一ページの文書などについては例外を認めていますが、この例外は範囲が狭く、実際のウェブサイトに当てはまることはほとんどありません。

なぜ重要か

この達成基準は、複数のユーザーグループに直接影響します。まずキーボードのみのユーザーです。反復性ストレス障害、麻痺、震えなどの運動障害のある人を含め、彼らはインタラクティブ要素間の移動をすべて Tab キーで行います。回避メカニズムがなければ、訪問するすべてのページで、最初の固有コンテンツに到達するだけで Tab キーを何十回も押さなければなりません。典型的なウェブサイトのナビゲーションバーに 10〜20 個のリンクがあり、それが何百ページ分にも積み重なると、身体的にも時間的にも大きな負担になります。

スクリーンリーダーユーザー(全盲またはロービジョンの人)は、ランドマーク領域や見出しを頼りに、自分の位置を把握し、ページ内のセクション間を移動します。最新のスクリーンリーダー(JAWS、NVDA、VoiceOver)はランドマークや見出しをナビゲートするための独自のショートカットキーを提供していますが、これらのショートカットが機能するのは、ページが適切に構造化されている場合に限られます。ランドマークもスキップリンクもないページでは、ページが読み込まれるたびに、繰り返しのナビゲーションを含め、先頭からすべての要素を線形に読み上げざるを得ません。

現実のシナリオを考えてみましょう。トルコの視覚障害のある市民が、納税申告のために電子政府ポータルを利用しているとします。このポータルには 18 個のリンクを含むトップナビゲーションバー、4 個のリンクを含むパンくずリスト、12 個のリンクを含むセカンダリサイドバーがあり、フォームフィールドに到達するまでに合計 34 回 Tab キーを押す必要があります。回避メカニズムがなければ、このユーザーはマルチステッププロセスの各ページで 34 個すべての要素をナビゲートしなければなりません。適切に実装されたスキップリンクがあれば、これが 1 回のキー操作にまで減ります。

認知アクセシビリティも重要な要素です。注意に関する特性を持つユーザーは、繰り返される気を散らすナビゲーション要素を処理することなく、関連するコンテンツに直接移動できることで恩恵を受けます。障害の有無を超えて、適切に構造化されたランドマーク領域はSEOの向上にもつながります。検索エンジンのクローラーは、コンテンツの階層や関連性を理解するために文書構造を利用するからです。アクセシブルなナビゲーションアーキテクチャと明確なランドマーク構造は、インデックスの質を高め、検索順位の向上につながる可能性があります。

関連する Axe-core のルール

  • bypass: このルールは、ページが繰り返しナビゲーションブロックを回避するための何らかのメカニズムを提供しているかどうかをチェックします。Axe は、既存のページ内アンカーをターゲットとするスキップリンクの有無、ARIA ランドマークロール(role='main'role='navigation' など)や HTML5 ランドマーク要素(<main><nav><header><footer><aside>)の有無、複数のランドマークを識別可能にする ARIA の aria-label または aria-labelledby 属性の有無を検査します。これらのメカニズムがいずれも存在しない場合、ルールは違反としてフラグを立てます。なお、このルールはケースによっては手動検証を必要とします。たとえば、axe はスキップリンクの存在を検出できますが、アクティブ化時にキーボードフォーカスが正しい位置に移動するかどうかを自動的に確認することはできません。
  • skip-link: このルールはスキップリンクに特化しており、スキップリンクの href 属性(例: #main-content)で参照されるターゲット要素が DOM に実際に存在し、キーボードフォーカスで到達可能かどうかをチェックします。スキップリンクが存在しない ID を指している場合や、ターゲット要素がフォーカス可能でない(非インタラクティブ要素であるにもかかわらず tabindex 属性がない)場合、このルールは違反としてフラグを立てます。これは、HTML にスキップリンクを追加したものの、メインコンテンツ要素に対応する id 属性を付け忘れるというよくあるミスを検出します。
  • tabindex: このルールは、自然な DOM 順序から外れたカスタムのタブ順序を作り出す tabindex 値が 0 より大きい要素にフラグを立てます。tabindex='0' は、スキップリンクのターゲットとなる <div> のような非インタラクティブ要素をフォーカス可能にするために正当かつ必要ですが、tabindex='1'tabindex='2' などを使用すると、ページ全体の Tab シーケンスが予期せず乱れ、回避メカニズムが予測不能または無効になる可能性があります。自動ツールは正の tabindex 値の存在を検出できますが、その結果としてのタブ順序が論理的かどうか、スキップリンクが依然としてシーケンスの最初のフォーカス可能要素であるかどうかは、人間のテスターが確認する必要があります。

テスト方法

  1. 自動スキャン: ページに対して axe DevTools(ブラウザー拡張機能)または Lighthouse(Chrome DevTools > Lighthouse > Accessibility)を実行します。特に bypassskip-linktabindex ルールの違反を確認します。axe DevTools では、これらのルール ID で結果をフィルタリングします。Lighthouse では、アクセシビリティ監査の「Navigation」セクションを確認します。「要レビュー(Needs Review)」と表示されている項目に注意してください。axe は一部の回避チェックを手動確認が必要なものとしてマークします。
  2. キーボードテスト(全ブラウザー共通): スクリーンリーダーを起動していない状態でブラウザーでページを開きます。Tab キーを 1 回押します。最初にフォーカスされる要素がスキップリンクであることを確認します(それまで画面外にあった場合、この時点で視覚的に表示されることがあります)。Enter キーを押してスキップリンクをアクティブ化します。キーボードフォーカスがメインコンテンツ領域に移動したことを確認します。次に Tab キーを押したとき、最初のナビゲーションリンクではなく、メインコンテンツ内の最初のインタラクティブ要素にフォーカスが移るはずです。フォーカスが移動しない場合、スキップリンクは壊れています。
  3. NVDA + Firefox: NVDA を起動し、Firefox でページを開きます。Insert+F7 ショートカットを押して要素リストを開き、ランドマークを確認します。あるいは D キーを押してランドマーク領域間をジャンプし、main ランドマークが存在し、明確にラベル付けされていることを確認します。H キーで見出しナビゲーションを行い、見出し構造によってページセクションが識別可能であることを検証します。スキップリンクまで Tab で移動し、Enter でアクティブ化してから、NVDA がメイン領域内のコンテンツを読み上げることを確認します。
  4. VoiceOver + Safari(macOS/iOS): VoiceOver を有効にします(Mac では Command+F5)。ローター(Control+Option+U)を使ってランドマークメニューを開き、名前付きランドマーク領域が表示されることを確認します。スキップリンクまで Tab で移動し、Enter を押します。アクティブ化直後に、VoiceOver がメインコンテンツ領域のコンテンツを読み上げることを確認します。iOS では、ロータージェスチャーでランドマークに切り替え、それらをスワイプで移動します。
  5. JAWS + Chrome: JAWS を起動した状態で、Q キーを押してメインコンテンツランドマークに直接ジャンプします。JAWS がメイン領域に入ったことをアナウンスするか確認します。Insert+F3 を使ってランドマーク一覧を表示し、適切なラベルが付いていることを確認します。ページ先頭から Tab で移動し、最初にアナウンスされるのが「Skip to main content(メインコンテンツへスキップ)」のようなアクセシブルネームを持つスキップリンクであることを確認します。
  6. フォーカスターゲットの検証: スキップリンクの href 値(例: #main-content)を確認します。ブラウザーの開発者ツールを使って、id='main-content' を持つ要素が DOM に存在することを確認します。その要素が <div> などの非インタラクティブなコンテナである場合、Tab 順序に挿入することなくプログラム的にフォーカス可能にするために tabindex='-1' が付与されていることを確認します。

修正方法

スキップリンクがない — 不適切な例

<!-- Navigation appears first with no bypass mechanism -->
<div class='nav-wrapper'>
  <a href='/home'>Home</a>
  <a href='/about'>About</a>
  <a href='/services'>Services</a>
  <a href='/contact'>Contact</a>
</div>
<div class='content'>
  <h1>Welcome</h1>
  <p>Page content here.</p>
</div>

スキップリンクがない — 適切な例

<!-- Skip link is the first focusable element; visually hidden until focused -->
<a href='#main-content' class='skip-link'>Skip to main content</a>

<nav aria-label='Primary navigation'>
  <a href='/home'>Home</a>
  <a href='/about'>About</a>
  <a href='/services'>Services</a>
  <a href='/contact'>Contact</a>
</nav>

<!-- tabindex='-1' allows the div to receive programmatic focus without
     entering the natural tab order -->
<main id='main-content' tabindex='-1'>
  <h1>Welcome</h1>
  <p>Page content here.</p>
</main>

スキップリンクのターゲットが存在しない — 不適切な例

<!-- The skip link exists but points to an ID that is not in the DOM -->
<a href='#content' class='skip-link'>Skip to main content</a>

<nav>...navigation links...</nav>

<!-- The id here is 'main', not 'content' — the skip link target is broken -->
<div id='main'>
  <h1>Page Title</h1>
</div>

スキップリンクのターゲットが存在しない — 適切な例

<!-- href value exactly matches the id of the target element -->
<a href='#main-content' class='skip-link'>Skip to main content</a>

<nav>...navigation links...</nav>

<!-- id matches the href fragment; tabindex='-1' ensures focus is received -->
<main id='main-content' tabindex='-1'>
  <h1>Page Title</h1>
</main>

スキップリンクが恒久的に非表示 — 不適切な例

<!-- display:none removes the element from the accessibility tree entirely -->
<a href='#main-content' style='display:none'>Skip to main content</a>

<!-- visibility:hidden also hides from screen readers and keyboard -->
<a href='#main-content' style='visibility:hidden'>Skip to main content</a>

スキップリンクが恒久的に非表示 — 適切な例

<!-- CSS moves the link off-screen visually but keeps it in the tab order.
     On :focus, it becomes visible so sighted keyboard users can see it. -->
<style>
  .skip-link {
    position: absolute;
    left: -9999px;
    top: auto;
    width: 1px;
    height: 1px;
    overflow: hidden;
  }
  .skip-link:focus {
    position: static;
    width: auto;
    height: auto;
    overflow: visible;
  }
</style>

<a href='#main-content' class='skip-link'>Skip to main content</a>

ランドマーク構造がない — 不適切な例

<!-- Generic divs with no semantic role — screen readers cannot identify regions -->
<div class='header'>...logo and nav...</div>
<div class='sidebar'>...secondary links...</div>
<div class='page-body'>...main content...</div>
<div class='footer'>...footer links...</div>

ランドマーク構造がない — 適切な例

<!-- HTML5 semantic elements expose landmark roles to assistive technologies.
     Multiple nav elements are distinguished with aria-label. -->
<header>
  <nav aria-label='Primary navigation'>...main nav links...</nav>
</header>
<aside aria-label='Related resources'>...secondary links...</aside>
<main id='main-content' tabindex='-1'>...main content...</main>
<footer>
  <nav aria-label='Footer navigation'>...footer links...</nav>
</footer>

よくある間違い

  • display:nonevisibility:hidden を使ってスキップリンクを隠し、オフスクリーンに移動させる CSS テクニックを使わないこと。これにより、スキップリンクは視覚表示とアクセシビリティツリーの両方から削除され、すべてのユーザーにとって完全に機能しなくなります。
  • href='#main-content' を持つスキップリンクを追加しながら、ターゲット要素に対応する id='main-content' 属性を付け忘れ、リンクをアクティブ化しても何も起こらない状態にしてしまうこと。
  • スキップリンクを、<div><section> のような非インタラクティブなコンテナ要素をターゲットにしながら、tabindex='-1' を追加しないこと。これにより、ブラウザーはビューポートをスクロールさせるだけで、キーボードフォーカスをターゲットに移動させません。
  • スキップリンクを DOM 内の最初のフォーカス可能要素以外の場所(たとえばロゴの後や最初のナビゲーションリンクの後)に配置してしまうこと。これでは、ユーザーがスキップリンクに到達するまでにコンテンツを Tab で通過しなければならず、本来の目的が損なわれます。
  • ページ上のどこかで正の tabindex 値(例: tabindex='1')を使用し、タブ順序を予測不能な形で再構成してしまうこと。これにより、スキップリンクが期待される先頭位置から外れてしまう可能性があります。
  • ページに複数のナビゲーション領域(プライマリナビゲーション、パンくずリスト、フッターナビゲーション)があるにもかかわらず、名前の付いていない <nav> ランドマークを 1 つだけ設けていること。これでは、スクリーンリーダーユーザーがランドマークナビゲーションショートカットを使ってそれらを区別することができません。
  • すべてのスクリーンリーダーユーザーがランドマークショートカットを知っていて使うと仮定し、スキップリンクを提供せずランドマーク構造だけに頼ること。スクリーンリーダーを使わない視覚的なキーボードユーザーはランドマークからは恩恵を受けられず、可視のスキップリンクに依存しています。
  • ナビゲーション、ヘッダー、フッターを含むページ全体のボディを 1 つの <main> 要素でラップしてしまい、<main> をページ固有のコンテンツに限定しないこと。
  • 複数のナビゲーションランドマークが存在するにもかかわらず、ナビゲーションを含む <div>role='navigation' を付与するだけで aria-label を提供しないこと。これにより、スクリーンリーダーは単に「navigation」とだけアナウンスし、領域を区別する手段がなくなります。
  • 静的な HTML プロトタイプではスキップリンクを正しく実装していたにもかかわらず、JavaScript フレームワーク(React、Angular、Vue など)によるレンダリングの過程で、スキップリンクコンポーネントがルートレイアウトに含まれていなかったり、クライアントサイドのハイドレーション中に条件付きで削除されたりして失われてしまうこと。

トルコのアクセシビリティ規制との関係

トルコの大統領通達 2025/10は、2025 年 6 月 21 日付官報第 32933 号で公布され、WCAG 2.1 レベル AA および WCAG 2.2 レベル A の適合基準に基づくウェブおよびモバイルアクセシビリティ要件を義務付けています。WCAG 2.4.1「繰り返しブロックの回避」はレベル A の達成基準であり、この通達における最も基本的な要件の一つです。つまり、対象組織のデジタルサービスは、この基準を下回ってはならない最低ラインを示しています。

この通達は、公的機関と民間企業の幅広い範囲を対象としています。公的機関(省庁、自治体、国家機関、政府関連団体など)は、通達の発効日から1 年以内に完全な適合を達成することが求められます。規制の対象となる民間企業には、2 年間の遵守期間が与えられています。対象となる民間セクターのカテゴリには、電子商取引プラットフォーム、銀行および金融機関、病院および医療提供者、20 万人以上の加入者を持つ通信事業者、旅行代理店、民間の交通事業者、国民教育省(MoNE)に認可された私立学校などが含まれます。

これらの組織にとって、WCAG 2.4.1 を実装していないということは、そのウェブサイトが標準の最も基本的なレベルで不適合であることを意味します。政府ポータル、オンラインバンキングプラットフォーム、病院の予約システム、電子商取引のチェックアウトフローなどに機能するスキップナビゲーションメカニズムが欠けている場合、そのサイトは通達の要件に直接違反していることになります。キーボードナビゲーションが運動障害のあるユーザーにとって基盤であり、スクリーンリーダーの使いやすさがランドマーク構造に大きく依存していることを踏まえると、この達成基準はアクセシビリティ監査や規制評価において非常に重要な重みを持ちます。

コンプライアンスに向けて内部アクセシビリティ監査を実施したり、第三者評価を委託したりする組織は、WCAG 2.4.1 を初期段階で確認すべき項目として扱うべきです。実装が容易でありながら、キーボードや支援技術に依存するユーザーにとって非常に大きな効果をもたらすためです。これに対処しない場合、規制レビューにおいてベースラインの不適合として具体的に指摘され、通達に基づく組織全体のコンプライアンス状況に影響を及ぼす可能性があります。