本文へ移動
easeweb
ご相談
トピックを検索

idの重複でラベルが別の欄を指してしまうフォーム

ページの中ほどとフッターに同じニュースレターのフォームをidごと置いているため、フッターのラベルが最初のフォームの入力欄を指し、クリックするとそちらへ移ってしまう

WCAG 2.2
SC 1.3.1ASC 4.1.2A
必須とする規格
Section 508 · EN 301 549(EU) · JIS X 8341-3
問題あり <input id="email" name="email" type="email">
アクセシビリティの問題を示した図: 全盲:何を入力する欄?
01

問題

スクリーンリーダーではフッターのメール欄のラベルが読み上げられず、そのラベルをクリックすると、カーソルがページの上のほうにある別のフォームへ戻ってしまう

02

試してみる

フッターまでスクロールして「メールアドレス」という文字をクリックし、Tabで2つのメール欄に順に入ってみましょう

クリックすると、カーソルはどこに入りますか? 下の欄に、それぞれのメール欄でスクリーンリーダーが読み上げる内容が出ます。

問題あり 修正できますか?

問題同じidのまま、同じフォームを2か所に置く

少量ずつブレンドした茶葉

今月の紅茶

  • モーニング・アッサム $14
  • スモーク・ラプサン $16
  • ミント&ネトル $12

どの紅茶も密閉できる缶でお届けし、40ドル以上のご注文は送料無料です。

  • 配送
  • 返品
  • お問い合わせ

スクリーンリーダーの読み上げ:

(Tabでメール欄へ移動)

再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。

03

修正方法

コピーごとに別のidを付けるか、入力欄をラベルで囲む

修正前
問題同じidのまま、同じフォームを2か所に置く
<section class="signup">  <h2>ニュースレターに登録</h2>  <form class="signup-form" action="/subscribe" method="post">    <label for="email">メールアドレス</label>    <input id="email" name="email" type="email" autocomplete="email">    <button>登録する</button>  </form></section>…<footer>  …  <form class="signup-form" action="/subscribe" method="post">    <label for="email">メールアドレス</label>    <input id="email" name="email" type="email" autocomplete="email">    <button>登録する</button>  </form></footer>
問題点3点
  • 2つの入力欄が id="email" を持つため、2つのラベルはどちらも最初の欄、つまり帯の欄を指します。
  • フッターの欄にはラベルがありません。スクリーンリーダーはこの欄を「編集テキスト」、帯の欄を「メールアドレス メールアドレス」と読み上げます。
  • フッターの「メールアドレス」をクリックすると、帯の欄にカーソルが入り、ページがそこまでスクロールします。
修正後

コピーごとにidを付ける

<section class="signup">  <h2>ニュースレターに登録</h2>  <form class="signup-form" action="/subscribe" method="post">    <label for="email-signup">メールアドレス</label>    <input id="email-signup" name="email" type="email" autocomplete="email">    <button>登録する</button>  </form></section>…<footer>  …  <form class="signup-form" action="/subscribe" method="post">    <label for="email-footer">メールアドレス</label>    <input id="email-footer" name="email" type="email" autocomplete="email">    <button>登録する</button>  </form></footer>
修正の手順3ステップ
  1. 部品を読み込む場所ごとに signup、footer のような値を渡し、部品が書き出すすべてのidに付けます。これで、入力欄はそれぞれ自分のidを持ちます。
  2. 各ラベルの for を、同じコピーのidに向けます。スクリーンリーダーはどちらの欄も「メールアドレス」と読み上げ、どちらのラベルをクリックしても、その下の欄にカーソルが入ります。
  3. name="email" はそのままにします。nameはサーバーが受け取る名前で、重複してもかまいません。一意でなければならないのはidだけです。

これで修正前の例は直り、1.3.1と4.1.2を満たします。コンポーネントのフレームワークでは、値を渡す代わりにフレームワークにidを作らせます。ReactとVueでは useId()、Svelteでは $props.id()、Shopifyのテーマでは、JSONテンプレートから追加したセクションの section.id です(同じ静的セクションを2回描くと、ファイル名がidとして重複します)。一覧の中では、商品のidや一覧での順番など、項目ごとに異なる値からidを作ります。

04

修正の確認

4項目

確認方法: スクリーンリーダー、マウス

4件中0件を確認済み

OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通の部品を新しい場所で使ったときは、再度確認します。

制限

このガイドが扱うのは、2回以上表示する部品が繰り返すidと、それがラベルに与える影響です。別々の要素に手作業でたまたま同じidを付けた場合(片方の名前を変えれば直る)や、存在しないidを指す場合は扱いません。繰り返すフォームの見えるラベルを、場所ごとに「ニュースレター用のメールアドレス」のように変えるべきかどうかは、何を入力するのか分からない、あいまいなフォームのラベルで扱います。対象とする支援技術で、操作全体を確認してください。

よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。

EaseWebのサービス

修正した問題を、次のリリースで再発させない

このガイドのような修正方法を、コーディングエージェントが従うルールと、CIのチェックに組み込みます。あわせて定期的に、キーボードとスクリーンリーダーで手動の再テストを行います。

サービス内容を見る