ボタンhover時など動的状態も測定。
outline:none; で消したまま放置はNG。ブランドカラーに揃えた2pxソリッド枠で「見てわかる」ガイドを。
コピペで使えるCSSスニペットは以下👇
1 2 3 4 5 6 7 8 9 10 11 |
:focus-visible { outline: 2px solid #00d1ff; /* 明るいシアン */ outline-offset: 2px; transition: outline-color 0.15s ease; } @media (prefers-color-scheme: dark) { :focus-visible { outline-color: #ff8c00; /* 暗い背景で映えるオレンジ */ } } |
ページ全体に lang="ja"
を指定していても、
aria-label="Download"
のように 異なる言語のラベル が混在すると、
スクリーンリーダーが “日本語読み” で英単語を読んでしまいます。
結果:「ダウンロード」が「ドゥワンロード」に──アクセシビリティ得点がマイナス。
結論:テキスト系属性(aria-label
、aria-describedby
、alt
など)は、
UI文言と同じ 翻訳フロー に乗せる必要があります。
「更新が起きたことを知らせたい」ことからaria-live=”assertive” を量産していませんか?Live Region は乱用すると、読み上げ渋滞を引き起こしてしまいます。
通知コンポーネントが aria-live="assertive"
だと割り込み過多のため、通常は polite
で十分です。
polite"
をデフォルト、assertive
は本当に緊急な場面だけ
#main
だけで満足せず、長尺LP では「商品一覧へ」など複数スキップを配置しスクロール疲労を軽減。
ミュート初期値+キーボード操作で再生停止可能に。キャプションはSRT管理。
色だけでNGを示さない。赤枠+aria-describedby
でテキストを紐付け、送信前に一括要約を提示。
複雑テーブルでは headers
属性で交差セルを明示し、読上げの「今どの列?」迷子を防止。参考htmlは以下👇
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
<table> <caption>月別売上(地域 × 商品 × 数量 / 金額)</caption> <!-- 1段目:大見出し(colgroup) --> <thead> <tr> <th id="hd-region" rowspan="2" scope="col">地域</th> <th id="hd-product" rowspan="2" scope="col">商品</th> <th id="hd-jan" colspan="2" scope="colgroup">1 月</th> <th id="hd-feb" colspan="2" scope="colgroup">2 月</th> </tr> <!-- 2段目:サブヘッダー --> <tr> <th id="hd-jan-qty" scope="col">数量</th> <th id="hd-jan-val" scope="col">金額</th> <th id="hd-feb-qty" scope="col">数量</th> <th id="hd-feb-val" scope="col">金額</th> </tr> </thead> <tbody> <!-- APAC 行グループ --> <tr> <th id="hd-apac" rowspan="2" scope="rowgroup">APAC</th> <th id="hd-apac-widget" scope="row">ウィジェット</th> <td headers="hd-apac-widget hd-jan-qty">500</td> <td headers="hd-apac-widget hd-jan-val">¥1,000,000</td> <td headers="hd-apac-widget hd-feb-qty">550</td> <td headers="hd-apac-widget hd-feb-val">¥1,100,000</td> </tr> <tr> <th id="hd-apac-gadget" scope="row">ガジェット</th> <td headers="hd-apac-gadget hd-jan-qty">300</td> <td headers="hd-apac-gadget hd-jan-val">¥600,000</td> <td headers="hd-apac-gadget hd-feb-qty">320</td> <td headers="hd-apac-gadget hd-feb-val">¥640,000</td> </tr> <!-- EMEA 行グループ --> <tr> <th id="hd-emea" rowspan="2" scope="rowgroup">EMEA</th> <th id="hd-emea-widget" scope="row">ウィジェット</th> <td headers="hd-emea-widget hd-jan-qty">420</td> <td headers="hd-emea-widget hd-jan-val">¥840,000</td> <td headers="hd-emea-widget hd-feb-qty">460</td> <td headers="hd-emea-widget hd-feb-val">¥920,000</td> </tr> <tr> <th id="hd-emea-gadget" scope="row">ガジェット</th> <td headers="hd-emea-gadget hd-jan-qty">280</td> <td headers="hd-emea-gadget hd-jan-val">¥560,000</td> <td headers="hd-emea-gadget hd-feb-qty">300</td> <td headers="hd-emea-gadget hd-feb-val">¥600,000</td> </tr> </tbody> </table> |
HTML化が理想。難しければタグ付きPDF+読み順チェック。社内テンプレで作る段階から改善していくのも手です◎
ニュースやSNSフィードを AJAX で自動更新すると、画面は静かに差し替わりますが、スクリーンリーダー利用者には変化が伝わらず「何が起きた?」と置いてけぼりになります。
そこで更新コンテナに role=”alert” または aria-live=”polite” を指定しておくと、DOM が書き換わった瞬間に支援技術が新しいテキストを読み上げ、利用者へ確実に通知できます。速報やエラーなど緊急度が高い情報は割り込み読上げの alert、通常の新着投稿は待機読上げの polite と使い分けると騒がしさを防げます。
期間 | 主なタスク | 成功のコツ | |
---|---|---|---|
1 | 2 週間 | Axe/Lighthouse で自動診断 → 人力レビュー | 影響度 × 工数で優先度スコア化 |
2 | 1 か月 | コードレベル修正(上記10ポイント) | 修正 → デプロイ → 再検証を CI/CD に組み込む |
3 | 3 か月〜 | デザイナー・編集者ガイドライン整備/社内勉強会 | KPI に「アクセシビリティ不具合ゼロ」を設定 |
アクセシビリティは「あと付けのコスト」ではなく、ROIを最短で高めるUX改善そのものです。まずは「色のコントラスト」と「フォームエラー表示」の2点だけでも、今日チェックしてみませんか? ほんの小さな修正が、ユーザーの離脱を防ぎ、検索順位やブランドの信頼性を引き上げます。
編集者:tacot
大学卒業後、デジタルマーケティング会社に入社しメディア広告営業やウェブサイトのディレクションを担当。前職の経験を活かしウェブディレクターをしながらWeb制作業界にまつわるコンテンツを執筆中。
監修者:Miki Kohinata
早稲田大学出身。学生時代、将来独立することを決めエンジニアの道へ。就職したIT企業で藤本と運命的に出会いKOHIMOTO設立。目指すのは人の心に寄り添えるエンジニア。人生のテーマソングはWeekend by 5lack。
INDEX
PICK UP