APG Patterns
English GitHub
English GitHub

Breadcrumb

サイト階層内でのユーザーの現在位置を示すナビゲーションパターン。

🤖 AI Implementation Guide

デモ

基本的な Breadcrumb

現在のページへのパスを示すシンプルなパンくずリスト。

長いパス

複数レベルの階層を持つ深いナビゲーションパス。

デモのみ表示 →

アクセシビリティ

WAI-ARIA ロール

ロール 対象要素 説明
navigation <nav> 要素 支援技術にナビゲーションランドマークを提供します(<nav>の暗黙のロール)

WAI-ARIA Breadcrumb Pattern (opens in new tab)

WAI-ARIA プロパティ

属性 対象 必須 説明
aria-label <nav> "Breadcrumb"(またはローカライズされた値) はい スクリーンリーダー向けにナビゲーションランドマークにラベルを付けます
aria-current 現在のページ要素 "page" はい(最後のアイテム) パンくずリスト内の現在のページを識別します

WAI-ARIA ステート

aria-current="page"

パンくずリストナビゲーション内の現在のページ位置を示します。

対象 パンくずリストの最後のアイテム(現在のページ)
"page"
必須 はい
参照 aria-current (opens in new tab)

キーボードサポート

キー アクション
Tab パンくずリストのリンク間でフォーカスを移動します
Enter フォーカスされたリンクをアクティブ化します

Breadcrumbはネイティブの<a>要素の動作をキーボードインタラクションに使用します。追加のキーボードハンドラーは不要です。

ソースコード

Breadcrumb.svelte
<script lang="ts">
  /**
   * Breadcrumb component following WAI-ARIA APG pattern
   * @see https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/
   */

  export interface BreadcrumbItem {
    label: string;
    href?: string;
  }

  interface Props {
    items: BreadcrumbItem[];
    ariaLabel?: string;
    class?: string;
  }

  let { items, ariaLabel = 'Breadcrumb', class: className }: Props = $props();

  function getItemKey(item: BreadcrumbItem): string {
    return `${item.href ?? 'current'}-${item.label}`;
  }
</script>

{#if items.length > 0}
  <nav aria-label={ariaLabel} class="apg-breadcrumb {className ?? ''}">
    <ol class="apg-breadcrumb-list">
      {#each items as item, index (getItemKey(item))}
        <li class="apg-breadcrumb-item">
          {#if item.href && index !== items.length - 1}
            <a href={item.href} class="apg-breadcrumb-link">
              {item.label}
            </a>
          {:else}
            <span
              aria-current={index === items.length - 1 ? 'page' : undefined}
              class="apg-breadcrumb-current"
            >
              {item.label}
            </span>
          {/if}
        </li>
      {/each}
    </ol>
  </nav>
{/if}

使い方

使用例
<script>
  import Breadcrumb from './Breadcrumb.svelte';

  const items = [
    { label: 'Home', href: '/' },
    { label: 'Products', href: '/products' },
    { label: 'Current Product' }
  ];
</script>

<Breadcrumb {items} />

API

プロパティ

プロパティ デフォルト 説明
items BreadcrumbItem[] 必須 パンくずリストアイテムの配列
ariaLabel string "Breadcrumb" ナビゲーションのアクセシブルなラベル

BreadcrumbItem

プロパティ 必須 説明
label string はい アイテムの表示テキスト
href string いいえ リンクのURL(現在のページでは省略)

テスト

テストはARIA属性、セマンティック構造、アクセシビリティ要件全体にわたってAPG準拠を検証します。Breadcrumbコンポーネントは2層のテスト戦略を採用しています。

テスト戦略

ユニットテスト(Testing Library)

フレームワーク固有のテストライブラリを使用してコンポーネントのレンダリング出力を検証します。これらのテストは正しいHTML構造とARIA属性を確認します。

  • HTML構造(nav、ol、li要素)
  • ARIA属性(aria-label、aria-current)
  • リンクのレンダリングとhref値
  • jest-axeによるアクセシビリティ検証

E2Eテスト(Playwright)

すべてのフレームワークで実際のブラウザ環境でコンポーネントの動作を検証します。これらのテストはインタラクションとフレームワーク間の一貫性をカバーします。

  • キーボードナビゲーション(Tab、Enter)
  • ライブブラウザでのARIA構造
  • axe-coreによるアクセシビリティスキャン
  • フレームワーク間の一貫性チェック

テストカテゴリ

高優先度: APG ARIA属性(Unit + E2E)

テスト 説明
nav element セマンティックな<nav>要素を使用します
aria-label ナビゲーションにアクセシブルなラベルがあります(デフォルト: "Breadcrumb")
aria-current="page" 最後のアイテムにaria-current="page"があります
ol/li structure 適切なセマンティック構造のために順序付きリストを使用します

高優先度: キーボードインタラクション(E2E)

テスト 説明
Tab navigation Tabキーでパンくずリストのリンク間をフォーカス移動します
Enter activation Enterキーでフォーカスされたリンクをアクティブ化します
Current page not focusable 最後のアイテム(span)はタブ順序に含まれません

中優先度: アクセシビリティ(Unit + E2E)

テスト 説明
axe violations WCAG 2.1 AAの違反がありません(jest-axe使用)
Custom aria-label ariaLabel propsでデフォルトラベルをオーバーライドできます
Separator hidden 視覚的な区切り文字は支援技術から隠されています

低優先度: コンポーネントの動作(Unit)

テスト 説明
Renders all items 提供されたすべてのアイテムが順番にレンダリングされます
Links have href 現在でないアイテムは正しいhrefを持つリンクとしてレンダリングされます
className merge カスタムクラスがコンポーネントクラスとマージされます

低優先度: フレームワーク間の一貫性(E2E)

テスト 説明
All frameworks have nav React、Vue、Svelte、Astroすべてがパンくずナビゲーションをレンダリング
Same item count すべてのフレームワークで同じ数のパンくずアイテムをレンダリング
Current page marked すべてのフレームワークで最後のアイテムにaria-current="page"をマーク

テストツール

完全なドキュメントについては testing-strategy.md (opens in new tab) を参照してください。

リソース