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

読み上げられないスケルトンスクリーン

読み込み中は灰色の仮のカードを並べ、届いた商品と黙って差し替えるため、スクリーンリーダーには待っていることも、商品が届いたことも伝わらない

WCAG 2.2
SC 4.1.3AA· 2.1 で追加
必須とする規格
EN 301 549(EU)
問題あり <div class="skeleton line"></div>
アクセシビリティの問題を示した図: 全盲:この見出しの下には何もないの?
01

問題

スクリーンリーダーの利用者には、読み込み中は見出しの下が空のように聞こえ、商品が届いても知らせがない

02

試してみる

灰色のカードが表示されている間に新着アイテムを読み、そのまま待って読み上げを聞いてみましょう

  • 問題1: 灰色のカードが表示されている間に「ページを読む」を押します。下の欄に、スクリーンリーダーが上から読む内容と、その後に自分から読み上げる内容が出ます。そのまま商品が届くのを待ちます。

  • 問題2: 同じカードの、すべてのプレースホルダーに aria-busy と aria-live を付けたものです。もう一度ページを読み、待ちます。

  • 修正を適用します。 読み込み中にページを読み、そのまま待ちます。「もう一度読み込む」で最初からやり直せます。

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

新着アイテム

30日以内なら返品無料です。

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

(灰色のカードが表示されている間に「ページを読む」を押してください)

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

03

修正方法

読み込み中であることと、届いたことを伝える

修正前

灰色の仮のカード

<h2>新着アイテム</h2><div id="arrivals" class="cards">  <div class="card">    <div class="skeleton photo"></div>    <div class="skeleton line"></div>    <div class="skeleton line short"></div>  </div>  …</div><p>30日以内なら返品無料です。</p>
問題点2点
  • 灰色のカードは中身のない div なので、スクリーンリーダーは見出しからすぐ「30日以内なら返品無料です。」へ進み、商品を読み込んでいることは伝わりません。
  • 商品はライブリージョンではない div に書き込まれるため、届いたことが読み上げられません。
修正後
修正プレースホルダーを隠し、ステータスの行で伝える
<h2>新着アイテム</h2><p id="arrivals-status" role="status" class="visually-hidden"></p><div id="arrivals" class="cards" aria-busy="true">  <div class="card" aria-hidden="true">    <div class="skeleton photo"></div>    <div class="skeleton line"></div>    <div class="skeleton line short"></div>  </div>  …</div><p>30日以内なら返品無料です。</p>
修正の手順6ステップ
  1. 見出しの下、一覧の外に、role="status" の空の p を置きます。こうすれば、スクリプトが書き込む時点で、ブラウザーはすでにこの領域を監視しています。visually-hidden クラスで画面からは隠し、デザインは変えません。画面では、灰色のカードがすでに待っていることを示しています。
  2. 仮のカードそれぞれに aria-hidden="true" を付けます。カードには伝えることがなく、ライブラリーがプレースホルダーに付けるライブリージョンや aria-busy も、一緒に黙ります。
  3. 一覧には、中身が入るまで aria-busy="true" を付けます。この属性に従うスクリーンリーダーは、作りかけの一覧を伝えるのを待てます。属性そのものは何も読み上げません。
  4. リクエストを始めるときに、ステータスの行へ「新着アイテムを読み込み中…」と書き込みます。スクリーンリーダーは、読み上げ中の内容を終えてからこの文言を読みます。この時点でセクションを読むと、見出しの次にこの行が読まれます。
  5. すべての商品を一覧に入れたら、「新着アイテムを3件読み込みました。」と件数を書き込みます。リクエストが失敗したときは、灰色のカードを消し、代わりに「新着アイテムを読み込めませんでした。」と書き込みます。
  6. どちらの場合も、aria-busy を false に戻します。

これで2つの修正前の問題はどちらも直り、4.1.3を満たします。待っていることも届いたことも、フォーカスを動かさずにステータスの領域で言葉にして伝えます。メッセージはカードごとではなく、一覧がそろったときに一度だけ書き込みます。

混同しやすいもの
04

デザインの案

待っていることも、届いたことも言葉にする

読み込み中の「新着アイテム」のカードを描く4つの方法です。見本は画面に入ると読み込みを始め、「もう一度読み込む」で最初からやり直せます。3つは待っていることとその結果を一度ずつ言葉で伝えるので合格です。1つはカードに「読み込み中…」と書いていますが、不合格です。

デザインファイルで

  • 読み込み中の言葉と、それに代わる言葉を、一字一句書く。たとえば「新着アイテムを読み込み中…」と「新着アイテム3件」。
  • 読み込みに失敗したときの画面を描く。灰色のカードがあった場所に、何が起きたかを伝える文と「再読み込み」ボタンを置く。
  • 灰色のカードは飾りだと書き添え、中に言葉を入れない。
  • 灰色のカードが何回、1回何秒で明滅するかを書く。合計5秒未満にし、待ち時間が長いときの止まった状態も描く。

合格

  • 新着アイテム

    カードの上に添える読み込み中の一行 見出しの下の控えめな一行が「新着アイテムを読み込み中…」、続いて「新着アイテム3件」と伝えます。白地に#4b5563で7.56:1です。スクリーンリーダーが読むのもこの一行なので、見える人にも読み上げを聞く人にも同じ言葉が届き、時間がかかっているだけの読み込みが止まった読み込みと同じに見えることもなくなります。
  • 新着アイテム

    1枚ずつ埋まっていくカード 灰色のカードが、届いた順に0.4秒おきに商品へ変わり、0.2秒かけて現れるので、ページが速く感じられます。読み上げる言葉は最後のカードを待って、「新着アイテムを3件読み込みました。」と一度だけ伝え、カードごとには伝えません。
  • 新着アイテム

    失敗をメッセージとして描いた読み込み リクエストが失敗すると、灰色のカードが「新着アイテムを読み込めませんでした。」という文と「再読み込み」ボタン(#1d4ed8に白で6.70:1)に変わり、同じ文が一度読み上げられます。灰色のカードを残したままでは、見える人にはまだ商品が届く途中のように見え、それ以外の人には何も伝わりません。

不合格

  • 新着アイテム

    読み込み中…
    読み込み中…
    読み込み中…
    カードごとに書いた「読み込み中…」WCAG 4.1.3 言葉は画面に3回、灰色の上に#4b5563で(6.10:1)書かれていますが、カードの一部なので、カードと一緒に消えてしまいます。たまたま行き当たったスクリーンリーダーはカードの数だけ読み、商品が届いたことは何も伝わりません。カードの外の一行なら、同じことを一度で伝えられます。
05

修正の確認

4項目、マウス不要

確認方法: スクリーンリーダー

4件中0件を確認済み

OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。読み込み表示のコンポーネントやデータの取得処理を変更した際は、再度確認します。

スクリーンリーダーでの role="status"、aria-busy="true"の読まれ方

制限

ライブリージョンと aria-busy の動きは、スクリーンリーダーやブラウザーによって異なります。ページそのものの読み込み中に書き込んだメッセージは、スクリーンリーダーが同時にページを読み始めると、遅れて読まれるか、読まれないことがあります。ステータスの行は読み上げ順の中に残るため、後からセクションに来た人にも「新着アイテムを読み込み中…」か件数が伝わります。このガイドでは、ページ内のあるセクションが届くまで、その代わりに表示するプレースホルダーを扱っています。ボタンを押した後のスピナーや読み込み中の文言は読み上げられない読み込み中の表示で、スクロールで読み込み続ける一覧はTabで近づくとフッターが遠ざかる無限スクロールで、新しい画面全体は読み上げられないSPAの画面遷移で扱っています。利用者が使うスクリーンリーダーで、実際のページを確認してください。

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

EaseWebのサービス

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

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

サービス内容を見る