トピックを検索
キーボードで再生できない、または字幕ボタンのない動画
商品動画のポスター画像の上に描いた再生ボタンが、クリックしか受け付けず、スクリーンリーダーには何も伝えません。あるいは、サイト独自のプレーヤーに、動画にある字幕と音声解説版をオンにするボタンがありません。
<div class="big-play"></div> 問題
キーボードとスクリーンリーダーの利用者は動画を始められず、字幕にもたどり着けません。字幕ボタンのないプレーヤーでは、誰も字幕と音声解説版をオンにできません。
コーヒー豆の焙煎店には淹れ方の動画があり、確認済みの字幕と音声解説版もそろっています。店はサイトの見た目に合わせて、独自のプレーヤーを作ってもらいました。ポスター画像の真ん中に丸い再生ボタンがあり、再生が始まると、再生位置の線、再生、時間、音量、CCとADが並ぶ暗い操作バーが出ます。丸い再生ボタンはクリックの処理を付けたdivで、操作バーはこのボタンをクリックするまで隠れています。マウスなら、すべて動きます。キーボードでは、Tabキーを押すと見出しから動画の下の「ハウスブレンドを購入」へ一気に移ってしまいます。再生ボタンで止まらないので、動画は始まらず、字幕ボタンのある操作バーも出てきません。スクリーンリーダーでページを読み進めても、動画のある場所に押せるものは見つかりません。再生ボタンに役割も名前もないからです。
ボタンは正しく作ったのに、何かが抜けているプレーヤーもよくあります。再生ボタンも操作バーも、名前のある本物のボタンとスライダーですが、操作バーには再生、再生位置、ミュート、音量しか描かれていません。キーボードで動画を始められ、スクリーンリーダーでも何の操作部品かがわかります。しかし、動画に付いている字幕ファイルは一度も表示されず、サーバーにある音声解説版も再生されません。字幕も音声解説版も、オンにする手段がプレーヤーにないからです。
達成基準2.1.1 キーボードは、マウスでできることはすべてキーボードでもできることを求めます。動画を始めるには、divをクリックするしかありません。divはフォーカスを受け取らず、クリック以外の操作に反応しないため、キーボードでは始められず、操作バーの機能もすべて、この最初のクリックの先に閉じ込められます。達成基準4.1.2 名前・役割・値は、どの操作部品も名前と役割を伝えることを求めます。このdivはどちらも伝えません。三角形はCSSで描いているので読む文字がなく、押せることを示すものもありません。W3Cの失敗例F59は、スクリプトでdivを操作部品にしながら役割を与えない、まさにこの問題を挙げています。失敗例F15は、アクセシビリティAPIを使わない独自の操作部品という、より広い場合を扱っています。
2つ目のプレーヤーは、両方の達成基準を満たします。満たしていないのは、音声付きの動画を再生するものすべてにEN 301 549が求める2つの要件です。7.1.1は動画にある字幕を表示する操作モードを、7.2.1は動画にある音声解説を選んで再生する仕組みを求めます。字幕トラックは動画にあり、音声解説版はサーバーにありますが、このプレーヤーではどちらも出せません。ブラウザー標準の操作部品なら字幕を表示できましたが、独自の操作バーに置き換えた際に、字幕の操作が抜けてしまいました。どちらの項目もWCAGにはありませんが、EN 301 549の表A.1は、Webページに求める要件としてどちらも挙げています。この表の項目に適合すれば、EUのWebアクセシビリティ指令に適合していると推定されます。
ショップは、商品の説明に動画をよく使います。1つ目のプレーヤーで淹れ方がわかるのは、マウスを使う人だけです。2つ目のプレーヤーでは、字幕と音声解説版を最も必要とする人のために用意しておきながら、オンにする手段がありません。
10グループ中5グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響あり)
- 難聴 (影響あり)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響なし)
- 認知 (影響なし)
- 光過敏 (影響なし)
- 手の操作が限られる Tabキーで見出しから動画の下のリンクへ移ってしまうため、キーボード、スイッチ、音声操作の利用者は動画を始められず、字幕ボタンのある操作バーも出てきません。音声操作では、Playという名前で押せるものが見つかりません。
- 視覚を使わない 動画のある場所で、スクリーンリーダーは押せるものを何も見つけられません。再生ボタンに役割も名前もないからです。ADボタンのないプレーヤーでは、目の見えない人のために作った音声解説版が一度も再生されません。
- 聴覚を使わない 動画には確認済みの字幕があるのに、ろう者にはオンにする手段がありません。一方のプレーヤーではマウスで再生を始めたあとでしかオンにできず、もう一方ではまったくオンにできません。
- 聴覚が限られる ナレーションの一部が聞こえる人は、聞き取れない部分を字幕で補いますが、ここではそれができないか、マウスでしかできません。
- 視覚が限られる 画面を拡大したり拡大鏡を使ったりしていて、小さなポインターを見失いやすい人は、キーボードでページを移動します。Tabキーは再生ボタンで止まりません。
クリックの処理を付けたdivには役割がないため、axeには確かめる手がかりがありません。EaseWebの診断は、動画プレーヤーの中のdivやspanのうち、要素自体にポインターのカーソルが設定され、クラスに play、pause、mute、captions のような語を含み、Tabキーで一度も届かないものを報告します。映像の4分の1以上を覆う再生用の層は、プレーヤーの中にほかに届くものがない場合だけ報告します。クラス名がこれらの語と違う操作部品や、ポインターのカーソルが出ない操作部品は、このチェックでは見つかりません。ただし、onclick 属性やボタンの役割を持つものは、Tabキーで届かない操作部品として報告されます。再生ボタンがアイコンだけの本物のボタンなら、名前がないことをaxeが button-name として報告します。再生ボタンが消えたときにフォーカスが移るかは、どのチェックにもわかりません。独自の操作部品を持つプレーヤーについては、診断の動画ごとの確認項目に、近くで字幕ボタンが見つかったかどうかが書かれます。見つからなければ、プレーヤーで字幕を表示でき、音声解説版を再生できるかを人が確かめるよう求めます。AIによる修正では、divに role="button" と tabindex="0" を付けただけで終わることがあります。これでは、Tabで止まってもEnterキーやSpaceキーで何も起きません。また、本物のボタンにしても、フォーカスがあるまま隠してしまい、フォーカスの行き場がなくなることがあります。
試してみる
キーボードだけで、淹れ方の動画を再生し、字幕をオンにしてください。
「問題1」では、映像の上の再生ボタンはクリックしか受け付けません。Tabキーを押すと、見出しから動画の下のリンクへ一気に移ります。プレーヤーの下の欄を見ると、スクリーンリーダーがそこで何も見つけられないことがわかります。マウスでクリックすると、プレーヤーの残りの部分が出ます。「問題2」では、再生ボタンはキーボードで押せます。ところが、操作バーには、字幕も音声解説版もオンにする手段がありません。修正を適用して、もう一度試してください。
問題あり 修正できますか?
プレーヤーを順に読むと、スクリーンリーダーの読み上げ:
(何もない:ボタンも文字もない)
修正方法
ポスター画像の上の再生ボタンを、操作バーへフォーカスを引き継ぐ名前付きのボタンにし、操作バーをはじめから表示して、動画に字幕や音声解説版があれば、そのボタンを置きます。または、ブラウザー標準の操作部品を使います。
- 1ポスター画像の上の再生ボタンも含め、どの操作部品もHTML標準のボタンかスライダー、またはブラウザー標準のものにする。
- 2どれも何をするものかを伝え、消える操作部品は、代わりに出るものへフォーカスを引き継ぐ。
- 3動画に字幕や音声解説版があれば、プレーヤーでオンにできる。
クリックしか受け付けない、ポスター画像の上の再生ボタン
<div class="player"> <video src="brew-guide.webm" poster="brew-guide.jpg"> <track kind="captions" srclang="en" label="English" src="brew-guide.en.vtt"> </video> <div class="big-play"></div> <div class="player-bar" hidden> <input type="range" class="seek" aria-label="Position" min="0" step="1" value="0"> <button type="button" class="play" aria-label="Play"></button> <span class="time">0:00</span> <button type="button" class="mute" aria-label="Mute" aria-pressed="false"></button> <input type="range" class="volume" aria-label="Volume" min="0" max="1" step="0.1" value="1"> <button type="button" class="captions" aria-pressed="false">CC<span class="visually-hidden"> captions</span></button> <button type="button" class="described" aria-pressed="false">AD<span class="visually-hidden"> audio description</span></button> </div></div>再生ボタンと、字幕と音声解説のある操作バー
<div class="player"> <video src="brew-guide.webm" poster="brew-guide.jpg"> <track kind="captions" srclang="en" label="English" src="brew-guide.en.vtt"> </video> <button type="button" class="big-play" aria-label="Play video"></button> <div class="player-bar"> <input type="range" class="seek" aria-label="Position" min="0" step="1" value="0"> <button type="button" class="play" aria-label="Play"></button> <span class="time">0:00</span> <button type="button" class="mute" aria-label="Mute" aria-pressed="false"></button> <input type="range" class="volume" aria-label="Volume" min="0" max="1" step="0.1" value="1"> <button type="button" class="captions" aria-pressed="false">CC<span class="visually-hidden"> captions</span></button> <button type="button" class="described" aria-pressed="false">AD<span class="visually-hidden"> audio description</span></button> </div></div>この方法を選ぶ理由:まずHTMLの要素を使う
再生ボタンは click にしか反応しないdivで、Tabの止まり先も、役割も、名前もありません。三角形はCSSで描いているため、読むものも何もありません。プレーヤーのほかの部分は、すべてこのボタンの先にあります。操作バーは最初のクリックまで隠れているので、操作バーのボタンがどれほど正しく作られていても、キーボードの利用者はたどり着けません。
ポスター画像の上の再生ボタンはHTML標準のボタンなので、キー操作を書かなくても、Tabキーで届き、EnterキーとSpaceキーで押せ、スクリーンリーダーは「Play video、ボタン」と読みます。押すとこのボタンは消えるため、スクリプトはフォーカスを操作バーの再生ボタンへ移します。このボタンは、動画が再生されるとPauseと読まれます。この1行がないと、ブラウザーはフォーカスをページそのものに戻し、フォーカスはプレーヤーから離れてしまいます。操作バーは再生ボタンを押す前から表示しているので、字幕と音声解説も再生と同じく1回押すだけで済み、動画を始める前にオンにしておけます。操作バーのCCボタンは動画にすでにある字幕トラックを表示し、ADボタンは、音声解説がなく、画面の情報が伝わらない動画と同じ方法で、再生中の位置のまま音声解説版に入れ替えます。どちらもオンかどうかを aria-pressed で伝え、名前は表示されている文字で始まります。
どちらも2.1.1と4.1.2を満たし、字幕と音声解説版をオンにできます。再生ボタンと操作バーをHTML標準のボタンと範囲入力で作る方法は、ショップ独自の見た目を保ち、CCとADを音量の隣に置けますが、本来ならブラウザーが用意してくれる上のスクリプトが要ります。ブラウザー標準の操作部品は属性1つで済みますが、サイトの見た目に合わせられず、音声解説ボタンは操作部品の外に置くことになり、Chromeでは字幕が音量より1段下のメニューに入ります。HTML標準のボタンとスライダーを使ってください。Section 508の503.4.1とEN 301 549の7.3が求めるとおり、どのブラウザーでも字幕を音量の隣に置けるのは、2つのうちこちらだけです。ブラウザー標準の操作部品は、そのどちらも適用されないページで、プレーヤーを作り直すまでの応急の修正です。
再生ボタンには、何を再生するかがわかる名前を付けます。ページに動画が1つなら「Play video」で足ります。複数あるなら、「Play: How to brew our house blend」のように、aria-label か、動画の見出しを指す aria-labelledby で、それぞれに別の名前を付けます。マウスのための便利な仕掛けとして、ポスター画像全体がクリックに反応してもかまいません。ただし、キーボードのための丸いボタンは残します。
操作バーは、動画を始める前から表示しておきます。最初に押すまで再生ボタンしか見せないプレーヤーでは、字幕と音声解説が再生より1段下になり、字幕が必要な人は字幕なしで動画を始めるしかありません。EN 301 549の7.3は、動画が主な内容のページで、これらを主な操作と同じ階層に置くよう求めています。詳しくは操作バーに字幕のボタンがない動画プレーヤーで説明しています。ポスター画像をすっきり見せたいデザインなら、ポスター画像の上で、再生ボタンの隣に字幕ボタンを置きます。下の「デザインの案」にも、この形の例があります。
操作バーの操作部品にも、ほかの操作部品と同じ決まりが当てはまります。
- 再生ボタンは、名前(PlayかPause)だけを変える。ARIA Authoring Practicesは、切り替えボタンのラベルは状態が変わっても変えてはならないとしているので、ボタンは名前を変えるか、名前を変えずに
aria-pressedで状態を伝えるかのどちらかにし、両方はしない。 - ミュート、CC、ADは名前を変えずに、オンかどうかを
aria-pressedで伝える。 - 再生位置のスライダーは、
aria-valuetextで「12 seconds of 24 seconds」のように時間を言葉で伝え、スクリーンリーダーが単位のない数字を読まないようにする。divで描いた再生位置の線では、role="slider"、tabindex="0"、矢印キー、HomeキーとEndキー、すべてのaria-value属性をスクリプトで用意することになる。input type="range"なら、どれも最初からそろっている。
操作バーは、キーボードの利用者に見える場所に置いておきます。再生が始まって数秒で消える操作バーは、フォーカスがプレーヤーに入ったら再び表示し、フォーカスがある間は消さないようにします。そうしないと、キーボードの利用者は見えない操作部品の上をTabキーで移動することになります。どの操作部品にも、ポスター画像の上の再生ボタンにも、暗い操作バーと、映像の明るい部分と暗い部分の両方に対して目立つフォーカスの枠を付けます。詳しくはフォーカス表示が見えない独自デザインのボタンで扱っています。
SpaceキーやKキーで再生、Mキーでミュート、Cキーで字幕といったキーボードショートカットは、あればうれしいものですが、ボタンの代わりにはなりません。プレーヤーにフォーカスがあるときだけ働く1文字のショートカットは、2.1.4で認められています。ページのどこでも働くものは、オフにできない1文字のショートカットの一つになります。
動画にあるものだけを出します。字幕トラックがあればCCボタンを、音声解説版があればADボタンを置きます。これらのボタンの置き場所と操作の回数は操作バーに字幕のボタンがない動画プレーヤーで、字幕の大きさと色はスタイルを変えられない字幕、変換で消える字幕で扱っています。ページを軽くするために、クリックされてからYouTubeやVimeoのプレーヤーを読み込むポスター画像にも、同じHTML標準の再生ボタンが必要です。埋め込みが読み込まれたあとの操作部品はサービス側のものなので、下の手順で、実際に何が描かれるかを確認してください。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得、または全ガイドをコーディングエージェントで使う。
デザインの案
見栄えのよいポスター画像から始まる動画でも、キーボードで再生できます。
淹れ方の動画の始め方を、5通りに描きました。それぞれにTabで移動し、再生する前に字幕をオンにしてみてください。3つはキーボードで始められて字幕も出せますが、2つはできません。
デザインファイルで
- 再生ボタンをボタンとして描き、フォーカスの枠も描く。横に、スクリーンリーダーが読み上げる名前(「動画を再生」など)を書く。
- 最初に押したあと:操作バーのあるプレーヤーを描き、フォーカスが移る先として一時停止ボタンに印を付ける。
- 字幕ボタンと、音声解説版があれば音声解説ボタンを、常に出ている操作バーか、ポスター画像の上で再生ボタンの隣に置き、動画を始める前から見えるようにする。
- フォーカスの枠を、ポスター画像の最も明るい部分と最も暗い部分の両方に重ねて描き、どちらでも見えるようにする。
合格
再生時間を添えた、ピル型の再生ボタン ポスター画像の隅のピルに、「見る」と「0:24」を#1b1b1bの上に白(17.22:1)で書きました。ボタンだとわかり、始める前に動画の長さも伝わります。映像の下の操作バーははじめから出ているので、CCとADも1回押すだけでオンにできます。Tabキーはピルで止まり、Enterキーで再生が始まります。黄色の枠は暗いすき間の外側に出るので、映像のどこに重なっても見えます。- ポスター画像全体を1つのボタンに ポスター画像と、#1b1b1bの帯に白で載せたタイトル(17.22:1)、小さな再生の印までを1つのボタンにしました。名前はタイトルなので、スクリーンリーダーは何が再生されるかを読みます。下の操作バーははじめから出ているので、字幕も再生前に1回でオンにできます。枠はカード全体を囲むため、カードごとに別の動画が並ぶ一覧に向いています。
ポスター画像の上で、再生の隣にCCとAD ポスター画像の上に、再生、CC、ADを並べました。操作バーのないすっきりしたポスター画像でも、動画を始める前に、字幕や音声解説をそれぞれ1回でオンにできます。ボタンは#1b1b1bの上に白(17.22:1)で、オンにすると黄色く塗られ、再生が始まると出る操作バーにも同じ選択が引き継がれます。
不合格
再生ポインターについて動く再生の吹き出しWCAG 2.1.1 丸い「再生」の吹き出しがポスター画像の上でマウスについて動き、どこをクリックしても動画が始まります。下にボタンはないため、Tabキーは動画を素通りします。タッチ画面には、吹き出しが追いかけるポインターもありません。基本原則:まずHTMLの要素を使う
音を出すボタンしかない、消音で繰り返す動画EN 301 549 7.1.1 動画は消音のまま繰り返し再生され、音を出す丸いボタンが1つあるだけです。ナレーションには字幕があるのに表示する手段がないため、レシピを知るには音を出すしかありません。ここでは止めた状態で描いていますが、実際のサイトでは繰り返し再生されます。
修正の確認
マウスを使わない4つの確認
確認方法: キーボード、スクリーンリーダー
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。プレーヤーやそのライブラリーを更新した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。扱うのは、プレーヤーの操作部品に届くか、何を伝えるか、字幕と音声解説版をオンにできるかです。中身は別のガイドで扱います。字幕は字幕のない動画と、確認されていない自動字幕で、音声解説は音声解説がなく、画面の情報が伝わらない動画で扱います。音声付きで自動再生される動画は、まず止める手段が必要で、止められない自動再生の音声で扱います。ほかのコンテンツと並んで自動で動く動画には一時停止が必要で、一時停止できない、流れる文字、カルーセル、アニメーションで扱います。視聴者が使うブラウザーと支援技術で、一連の流れを確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
参考資料
- WCAG Understanding: keyboard(新しいタブで開きます)
- WCAG Understanding: name-role-value(新しいタブで開きます)
- WCAG Technique F59(新しいタブで開きます)
- WCAG Technique F15(新しいタブで開きます)
- etsi.org: en_301549v030201p.pdf(新しいタブで開きます)
- w3.org: player(新しいタブで開きます)
- ARIA APG: button(新しいタブで開きます)
- developer.mozilla.org: hidden(新しいタブで開きます)
- developer.mozilla.org: mode(新しいタブで開きます)
- chromium.googlesource.com: media_controls_impl.cc(新しいタブで開きます)
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。