動画アクセシビリティ完全チェックリスト:字幕/操作/低刺激/フォールバック
“再生できる” だけでは到達性は確保されません。短い操作パス / 明確なフォーカス / 状態同期 / 低刺激 を一括で設計し、キーボード/スクリーンリーダ/低刺激設定利用者のフリクションを除去します。
WCAG 参照
該当主基準: 1.2x (字幕/音声解説) / 2.1.1 (キーボード) / 2.2.2 (一時停止) / 2.3.1 (閃光) / 2.5.3 (ラベル名)。
要点 (TL;DR)
- 初回は常に paused + 明示ポスター + keyboard focusable control。
- 字幕は WebVTT 外部 + transcript (SEO/検索性) を別要素。
- prefers-reduced-motion で自動ループ/背景アニメ停止。
- ショートカット: Space/Enter, ←→ ±5s, ↑↓ 音量, M mute, F fullscreen, C captions。
- 状態 (play/mute/speed/captions) を localStorage に永続化。
TL;DR: 自動再生は muted + ユーザー主導。字幕は WebVTT (track default) と transcript。Space/Enter/矢印/ M / F / C / ←→ で操作。focus-visible スタイルと ARIA 状態同期。prefers-reduced-motion でループ/アニメ停止。エラー/バッファ/遅延状態を視覚/テキストで示す。
1. 自動再生ポリシー
- 初回は paused + poster 表示
- muted + ユーザー操作後に auto-resume 可
- スクロールイン再生は IntersectionObserver + フォーカス競合回避
2. 字幕 / transcript
- <track kind="subtitles" srclang="ja" default />
- 多言語: ja / en / (必要に応じ fr)
- transcript: details 要素でテキスト提供
- 自動生成利用時は編集タイムスタンプを保持
3. キーボード操作
Space/Enter
=再生切替 / ←→
=±5s / ↑↓
=音量 / M
=mute / F
=全画面 / C
=字幕 / .
=フレームステップ。
実装例: カスタムコントロール (抜粋)
// コンテナ
<div className="relative" role="group" aria-label="動画プレイヤー">
<video ref={ref} aria-label="デモ動画" preload="metadata" playsInline />
<div className="controls flex gap-2 p-2" aria-label="再生コントロール">
<button onClick={togglePlay} aria-pressed={playing} aria-label={playing ? '一時停止' : '再生'}>
{playing ? 'Pause' : 'Play'}
</button>
<button onClick={toggleMute} aria-pressed={muted} aria-label={muted ? 'ミュート解除' : 'ミュート'}>M</button>
<button onClick={()=>seek(-5)} aria-label="5秒戻る">-5s</button>
<button onClick={()=>seek(5)} aria-label="5秒進む">+5s</button>
<button onClick={toggleCaptions} aria-pressed={captions} aria-label={captions ? '字幕オフ' : '字幕オン'}>CC</button>
<button onClick={toggleFullscreen} aria-label="全画面">F</button>
</div>
</div>
// キーボードショートカット
useEffect(()=>{
const h=(e:KeyboardEvent)=>{
if(!ref.current) return;
switch(e.key){
case ' ': case 'Enter': togglePlay(); e.preventDefault(); break;
case 'ArrowLeft': seek(-5); break;
case 'ArrowRight': seek(5); break;
case 'ArrowUp': changeVolume(+0.05); break;
case 'ArrowDown': changeVolume(-0.05); break;
case 'm': case 'M': toggleMute(); break;
case 'f': case 'F': toggleFullscreen(); break;
case 'c': case 'C': toggleCaptions(); break;
case '.': stepFrame(); break;
}
};
window.addEventListener('keydown',h); return ()=>window.removeEventListener('keydown',h);
},[]);
4. フォーカス可視性
- :focus-visible でリング (2px + コントラスト比 > 3:1)
- Tab 移動順は WCAG 2.4.3 に準拠
- アイコンボタンは aria-label 更新 (再生→一時停止)
5. 視覚的状態表示
- buffering: スケルトン + aria-busy
- seeking: ミニロードインジケータ
- ended: リプレイボタン autofocus 候補
- error: 文言 + 再試行 + fallback 画像
6. 低刺激モード
- prefers-reduced-motion 時: 自動ループ停止
- 背景装飾動画 → 静止ポスター差替
- フラッシュ点滅検出 (輝度差) で警告フラグ
7. 音量 / 速度 / 永続化
- volume, muted, playbackRate, captionsEnabled を localStorage
- 初期値はユーザー保存 > システム設定 > デフォルト
- UI で現在値を aria-valuenow 発話
8. メディアセッション API
モバイル OS のロック画面操作を有効化 (title/artwork/updatePositionState)。
9. ログ & モニタリング
- 再生開始遅延 / stalling 回数
- 字幕切替イベント
- ユーザーショートカット使用頻度 (改善余地)
10. チェックリスト統合
- muted 初期化 + 自動再生条件
- VTT track (ja/en)
- keyboard shortcuts + focus-visible
- ARIA ラベル同期
- reduced-motion ハンドリング
- エラー/バッファ表示
- 状態永続化
- メディアセッション情報
11. FAQ
- 自動再生で音を鳴らせる?
- ユーザー過去操作 + 明示設定がない限り不可。
- 字幕とキャプションの違い?
- 効果音/環境音/話者情報を含むか。WCAG では包括的情報が必要。
- 音声解説(Audio Description) 必須?
- 重要視覚情報が台詞外で提示されるコンテンツは必要。