概要
絵文字はテキストベースのコミュニケーションにおいて感情や意図を伝える重要な要素となっている。しかし、スクリーンリーダーでの読み上げはブラウザや支援技術によって異なるため、意図した情報を正しく伝えられない場合がある。
絵文字はテキストベースのコミュニケーションにおいて感情や意図を伝える重要な要素となっている。しかし、スクリーンリーダーでの読み上げはブラウザや支援技術によって異なるため、意図した情報を正しく伝えられない場合がある。
WCAGでは H86: Providing text alternatives for emojis, emoticons, ASCII art, and leetspeak というテクニックを公式に提供している。これは WCAG 達成基準 1.1.1「非テキストコンテンツ」(レベルA) を満たすためのテクニック(Sufficient Technique)として位置付けられている。
絵文字は技術的にはフォント(Unicode文字)だが、意味的には画像に近い。スクリーンリーダーは絵文字に遭遇しても「これは絵文字である」とは通知せず、Unicode名をそのまま読み上げる。そのため、ユーザーはそれが絵文字なのか実際に書かれたテキストなのか判断できない場合がある。
素の <span>🥺</span> の場合、スクリーンリーダーによって読み上げが異なる。多くのスクリーンリーダーは絵文字をCLDR名(Unicode Common Locale Data Repository)で読み上げる(例:🥺の場合「pleading face」など)。
ただし、環境や絵文字の種類によって読み上げ方に差異があり、一部のスクリーンリーダーでは一貫性に欠ける場合がある。
NVDA 2025.xではeSpeak NGとUnicode CLDRが更新され、絵文字のローカライゼーションデータも追加されている。現代のスクリーンリーダーは絵文字をネイティブでかなり正確に読み上げるようになった。
ただし、以下の問題は存在している。
マークアップ方法は以下の通り。
<span role="img" aria-label="お願い">🥺</span>
role="img"とaria-labelを指定することで、スクリーンリーダーは aria-label の内容を画像として読み上げる(例:「お願い、画像」または「お願い、グラフィック」)。
<span aria-hidden="true">🥺</span>
装飾的な利用をしているのであれば、aria-hidden="true"を指定することでスクリーンリーダーの読み上げを無効にする。
<span role="img" aria-label="あなたは最高">👉🤘</span>
個別のUnicode名(例:「指差し、人差し指と小指を立てた手」など)で読み上げられるのを防ぎ、制作者の意図した意味を伝えられる。
絵文字を使う
├─ 意味がない(装飾的で意味を伝える必要がない)
│ └─ aria-hidden="true"
│
└─ 意味がある
├─ Unicode名で意図が伝わる
│ └─ 素のままでOK
│
└─ Unicode名と意図が異なる
└─ role="img" + aria-label
H86によると、このマークアップが必要な理由は以下の通り。
<span> には alt 属性が使えないaria-label を付けることはARIA仕様で禁止されているため、role="img" で画像要素として定義する必要があるrole="img" を付けることで、ブラウザはアクセシビリティツリー上で絵文字を画像として公開し、aria-label の値をアクセシブル名として使用する。これにより、どのスクリーンリーダーでも一貫した読み上げが保証される。
| 達成基準 | レベル | 絵文字との関連 |
|---|---|---|
| 1.1.1 非テキストコンテンツ | A | 絵文字は非テキストコンテンツであり代替テキストが必要 |
| 1.4.11 非テキストのコントラスト | AA | 絵文字の視認性(背景とのコントラスト比3:1) |
| 2.2.2 一時停止、停止、非表示 | A | アニメーション絵文字は5秒以内に停止するか制御可能にする |