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

カードのリンクの中にあり、押すとリンク先も開いてしまうボタン

商品カード全体を1つのリンクで囲み、お気に入りのハートボタンもその中に入れているため、リンクの名前にボタンの言葉が混ざり、ハートを押すと商品ページまで開いてしまう

WCAG 2.2
SC 4.1.2A
必須とする規格
Section 508 · EN 301 549(EU) · JIS X 8341-3
問題あり <a href="/mugs/speckled"> … <button aria-label="お気に入りに追加">
アクセシビリティの問題を示した図: 全盲:保存するの? それとも開くの?
01

問題

スクリーンリーダーではカードのリンクがお気に入りの操作まで名乗って読み上げられ、ハートを押すと誰でも商品ページへ移動してしまう

02

試してみる

まずマウスで、次にTabとEnterで、Speckled mugのハートを押して保存してみましょう

一覧はそのまま残りますか? それともマグのページが開きますか? ブラウザーの戻る矢印で一覧へ戻れます。

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

問題カード全体を1つのリンクで囲み、その中にハートがある

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

03

修正方法

ハートは、カードのリンクの中ではなく横に置く

修正前
問題カード全体を1つのリンクで囲み、その中にハートがある
<ul class="cards">  <li class="card">    <a href="/mugs/speckled" class="card-link">      <img src="speckled-mug.webp" alt="">      <h3>Speckled mug</h3>      <p class="price">$24</p>      <button type="button" class="wish" aria-label="お気に入りに追加" aria-pressed="false">        <svg aria-hidden="true">…</svg>      </button>    </a>  </li>  …</ul>
問題点3点
  • ハートの言葉がリンクの名前に入り、リンクは「Speckled mug $24 お気に入りに追加」と読み上げられます。
  • マウス、指、Enter、Spaceのどれでハートを押しても、マグが保存されたうえで商品ページが開きます。
  • スクリーンリーダーには、HTMLが認めていない「リンクの中のボタン」が渡されるため、どう読み上げるかはスクリーンリーダーごとに異なります。
修正後

ハートをリンクの横に置く

<ul class="cards">  <li class="card">    <a href="/mugs/speckled" class="card-link">      <img src="speckled-mug.webp" alt="">      <h3>Speckled mug</h3>      <p class="price">$24</p>    </a>    <button type="button" class="wish" aria-label="お気に入りに追加" aria-pressed="false">      <svg aria-hidden="true">…</svg>    </button>  </li>  …</ul>
修正の手順3ステップ
  1. ボタンを a の外へ出し、カードの中でリンクの後ろに置きます。リンクが囲むのは写真、商品名、価格になり、名前は「Speckled mug $24」になります。
  2. position: relative をリンクからカードへ移します。ハートは写真の隅に残り、見た目は元のままです。
  3. ボタンの処理は変えません。ハートを押して動くのはハートだけになり、一覧はそのまま残ります。

これで修正前の例は直り、4.1.2を満たします。ソース上でハートがリンクの後ろにあるため、Tabはリンク、ハートの順に移動し、順序も前と同じです。

修正にならない応急処置
wish.addEventListener('click', (event) => {  event.preventDefault();  event.stopPropagation();  …});

04

修正の確認

4項目

確認方法: キーボード、スクリーンリーダー、マウス、タッチ

4件中0件を確認済み

OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。カードやリンクのコンポーネントを変更した際は、再度確認します。

制限

このガイドが扱うのは、カードのリンクの中に置いたボタンです。逆にボタンの中にリンクを置く形はaxeが報告するもので、直し方は同じく2つを並べて置くことです。言葉のないリンクをバナーやカードに重ねた場合は、名前のないリンクの問題です。名前のないバナーや画像のリンクを参照してください。どのカードも同じリンクの言葉で終わる場合はどれも同じ「続きを読む」のリンク、ホバーでしか現れないカードの操作はホバーでしか現れないカードの操作ボタン、ボタンの働きをするリンクはリンクと読み上げられ、Spaceキーで押せないボタンを参照してください。対象とする支援技術で、操作全体を確認してください。

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

EaseWebのサービス

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

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

サービス内容を見る