トピックを検索
ドラッグでしか色を選べず、値を入力できないカラーピッカー
ブランドカラーの設定で、四角い色の面と色相のバーがつまみのドラッグでしか動かず、選んだ色も文字で表示されるだけです。そのため、ピッカーのどこにもフォーカスが移らず、今の色も読み上げられず、色を入力することもできません。
<span class="hex">#366cd9</span> 問題
ドラッグできない人とスクリーンリーダーの利用者は、ブランドカラーを設定することも、今の色を知ることもできません。
ある予約アプリでは、店舗ごとにブランドカラーを設定でき、その色が予約ページの「今すぐ予約」ボタンに使われます。設定画面のピッカーは、デザインツールでおなじみの形です。四角い面は、横方向に白から鮮やかな色へ、縦方向に明るい色から黒へと変わります。その下に色相を選ぶ虹色のバーがあり、バーの下にはカラーコード「#366cd9」が書かれています。ピッカーの横のプレビューには、選んだ色で描いた予約ページのボタンが表示されます。マウスでは、四角い面の丸いつまみをつかんでドラッグし、次にバーのつまみをドラッグします。面のほかの場所をクリックしても何も起きず、動くのはつまみだけです。
Tabキーを押すと、フォーカスは設定画面の先頭から「保存」へ飛びます。ピッカーのどこにもフォーカスは移りません。スクリーンリーダーは、たどり着けば「#366cd9」を文字として読みますが、変更できるものは何もありません。ブランドガイドを開いて、そこに書かれたカラーコードを入力しようとしても、入力する場所がありません。
つまみはスクリプトがポインターイベントで動かす span 要素で、スクリプトが押下を受け付けるのはつまみの上だけです。ブラウザーにとって、四角い面とバーはCSSのグラデーションで描いた絵で、つまみは中身のないspanです。そのため、Tabで止まる場所にも、キーで動く部品にもならず、読み上げる内容もありません。このピッカーは3つの達成基準を同時に満たしません。ピッカーのどの操作もキーボードではできないため、2.1.1を満たしません。つまみには役割も名前も値もなく、スクリーンリーダーはここに操作部品があることも、今どの色かも伝えられないため、4.1.2を満たしません。バーの下のコードは文字で、入力欄ではありません。色を変える方法がドラッグしかないため、2.5.7も満たしません。色を選ぶのにドラッグは本質的ではなく、2.5.7の解説書(Understanding)も、色の値を入力するテキスト欄や、カラーホイールの別の位置のクリックを、ドラッグせずに色を設定する方法として挙げています。
キーボードに対応しただけでは2.5.7は満たせず、入力欄を足しただけですべてが解決するわけでもありません。タッチスクリーンの利用者には矢印キーがないため、キーとドラッグでしか動かない面は、やはり使えません。また、ドラッグできないが色は目で選びたい人にとって、入力欄しかない状態は不十分です。そのため、推奨する修正では両方を用意します。
ブランドカラーは一度設定すると、その店舗の予約サイトのすべてのページに表示されます。自分で設定できない人は、誰かに頼むしかありません。スマートフォンではつまみが小さく、選んでいる色を指が隠すため、誰にとっても思いどおりの色に合わせるのは難しくなります。
10グループ中4グループに影響
- 全盲 (影響あり)
- 弱視 (影響なし)
- 色覚 (影響あり)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響あり)
- 認知 (影響なし)
- 光過敏 (影響なし)
- 手の操作が限られる キーボード、スイッチ、音声操作の利用者は、押したまま動かす操作ができず、ピッカーにはTabで届く場所もないため、ブランドカラーを変えられません。
- 視覚を使わない スクリーンリーダーの利用者には、ピッカーに操作できる部品が見つかりません。カラーコードは、たどり着けても変更できない1行の文字です。
- 届く範囲・力が限られる 手にふるえがある人は、つまみを狙った色の上で止めておけず、指を離すときにも色がずれます。
- 色を知覚しない 一部の色を見分けられない人は、四角い面に出ているのが自分のブランドの青かどうかを目で判断できず、ブランドガイドのコードを入力する欄もありません。
自動チェックに見えるのは、2つのグラデーションと、いくつかの中身のないspanと、1行の文字で、問題は見つかりません。どれも操作部品であることを示していないので、名前やTabの停止位置を求めるルールの対象になりません。監査のキーボードチェックは、role属性や、マークアップに直接書かれたクリック処理を手がかりに操作部品を見つけますが、このつまみにはどちらもありません。EaseWebの監査は、CSSのグラデーションで描かれた四角い色の面や色相のバーに、つまみはあるのに、フォーカスを受けるもの(スライダーや入力欄)が中に何もない場合、確認を促す項目を出します。ページのほかの場所で色を設定できるかは、人が試さないと分からないからです。コード生成AIにピッカーの修正を頼むと、四角い面のつまみに role="slider" と tabindex="0" を付けて終わることがあります。スライダーの値は1つですが、面の値は2つあり、コードを入力する欄も現れません。
試してみる
つまみをドラッグしてブランドカラーを変えてください。次に四角い面の別の場所をクリックし、マウスを使わずにTabでも試してください。
下の欄に、スクリーンリーダーの読み上げが出ます。ドラッグせずに色を設定できますか?「#2a9d8f」を入力できますか?
問題あり 修正できますか?
スクリーンリーダーの読み上げ:
(Tabで設定画面を移動)
修正方法
ピッカーに色を入力できる欄を設け、四角い面とバーは、フォーカスを受けて値が読み上げられ、キーでも1回のクリックでも動く操作要素にします。
- 1色をコードで入力でき、その入力欄に名前がある。
- 2色を設定する部分はどれもフォーカスを受け、名前と値が読み上げられ、キーで動く。
- 3どの色も、ドラッグだけでなく、クリック、タップ、入力で設定できる。
<div class="brand-colour"> <span class="label">ブランドカラー</span> <div class="sv-area" style="background-color: hsl(220 100% 50%)"> <span class="handle" style="left: 75%; top: 15%"></span> </div> <div class="hue-strip"> <span class="handle" style="left: 61%"></span> </div> <div class="preview" aria-hidden="true" style="--brand: #366cd9">…</div> <span class="hex">#366cd9</span></div>ピッカーの横にカラーコードの入力欄
<div class="brand-colour" role="group" aria-labelledby="brand-label"> <span class="label" id="brand-label">ブランドカラー</span> <div class="sv-area" style="background-color: hsl(220 100% 50%)" aria-hidden="true"> <span class="handle" style="left: 75%; top: 15%"></span> </div> <div class="hue-strip" aria-hidden="true"> <span class="handle" style="left: 61%"></span> </div> <div class="preview" aria-hidden="true" style="--brand: #366cd9">…</div> <label for="brand-hex">カラーコード</label> <input type="text" id="brand-hex" value="#366cd9" maxlength="7" spellcheck="false" autocomplete="off"></div>つまみはフォーカスを受けないため、キーボードでは届きません。役割も名前も値もないため、支援技術はピッカーがあることを知りません。操作の入口はつまみの押下だけなので、どの色にもドラッグが必要で、コードは誰も入力できない場所に書かれているだけです。
ピッカーはドラッグで選びたい人のためにそのまま残し、ラベル付きのテキスト入力欄を加えます。色はコードで、キー入力でも貼り付けでも音声でも入れられます。HTML標準の入力欄なので、Tabの順序に入り、役割、名前(「ブランドカラー」のグループ内の「カラーコード」)、値を持ちます。ドラッグした結果もこの欄に書き込まれるため、欄には常につまみで設定した色が表示されます。aria-hidden でドラッグ専用の面とバーをアクセシビリティツリーから外すので、スクリーンリーダーには役割も名前もない2つのつまみではなく、入力欄が見つかります。既存のピッカーへの変更は最小で、誰でも正確な値を指定できます。ただし、これだけでは不十分です。マウスの利用者はつまみを少し動かすだけで同じ青を少し明るくできますが、キーボードや音声操作の利用者は新しいコードを自分で考えなければなりません。ブランドガイドのように、使うコードが先に決まっている設定には向きますが、目で見て色を選ぶ設定には向きません。
3つとも適合します。カラーコードの入力欄は変更が最小で、誰でも正確な値を指定できますが、ドラッグできない人はコードでしか色を選べません。ブラウザー標準のカラー入力は必要なコードが最も少ないものの、開くピッカーがブラウザーごとに違い、すべてで値を入力できるわけではなく、ページの中に置くことも、ポップアップの見た目を変えることもできません。キーボードやスクリーンリーダーの利用者も目で見て、またはコードで色を選べ、どのブラウザーでも同じように動き、デザインどおりのピッカーも保てるのは、スライダーとカラーコードの入力欄を組み合わせる方法だけです。ピッカーを自分で作るなら、この方法を使ってください。
スクリーンリーダーが読み上げる内容は、聞く人に意味が伝わるものにします。16進数のコードはほとんどの人には意味が分からず、彩度の「75%」も大差ありません。色相の aria-valuetext には色の名前を入れ、コードの横に色全体の名前(「濃い青」など)を書いて、誰でも読めるようにすることも検討します。プレビューは予約ページの絵で、操作部品ではないため、支援技術からは隠し、フォームのボタンとは離して描きます。Chromeは、標準のカラー入力の値を、赤・緑・青の割合として英語のままスクリーンリーダーに渡します(「21% red 42% green 85% blue」)。
ページに組み込んだ後の動作は、次の点で決まります。
- Tabの停止位置を1つにするか2つにするか:面の中の2つの入力はTabの停止位置が2つになるが、作りが単純で、ブラウザー標準のキー操作が使える。ライブラリーによっては面の停止位置を1つにし、左右の矢印キーで一方の見えない入力を、上下の矢印キーでもう一方を動かす。React Ariaのカラーエリアはこの作りである。
- フォーカスとコントラスト:見えない入力はフォーカスの枠を描かないため、
.sv-area:has(:focus-visible) .handleのようにしてつまみに枠を描く。白い輪に濃い縁を付けると、面のどの色の上でもつまみが見える。コントラストが足りない入力欄・アイコン・フォーカス枠を参照。 - カラーコードの入力欄:
#があってもなくても受け付ける。正しくないコードは黙って元に戻さず、入力されたまま残して、欄の横にメッセージを出す。直し方がわからないフォームエラーを参照。 - タッチ:面とバーに
touch-action: noneを付けるとドラッグでページがスクロールしなくなるが、そこに指を置いてページをスクロールすることもできなくなる。周りに常に余白が残る大きさにとどめる。 - 入力欄から開くピッカー:カラーコードの入力欄にフォーカスが移ったときに、その下に面とバーを開いてもかまわない。ただし、フォーカスは入力欄に残り、入力を続けられ、Escapeで閉じ、次の入力欄を覆わないようにする。フォーカスを動かさずに現れる内容はコンテンツの変化で、コンテキストの変化ではないが、フォーカスが離れるか利用者が閉じるまでは開いたままにし、フォーカスを動かさずに閉じられる必要がある。操作するだけでページが変わるドロップダウンと入力欄と近づくと消え、閉じられないツールチップを参照。
- 強制配色:コントラスト テーマは、面の色相とプレビューを塗る背景色を置き換え、面の濃淡とバーを描くグラデーションも消す。面、バー、プレビューには
forced-color-adjust: noneを指定し、つまみにはシステムカラーの枠線を付ける。
カラーピッカーのライブラリーはさまざまです。面に role="slider" を付けながら aria-valuenow がないもの(axeが報告します)、キーは効いても面の押下を受け付けないもの、入力欄がまったくないものもあります。ライブラリーの説明ではなく、フォーカスを受ける各部分が支援技術に何を伝えているかを確認してください。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得、または全ガイドをコーディングエージェントで使う。
デザインの案
入力でも、パレット、スライダー、ホイールでも、ドラッグなしで色を選べます。
ブランドカラーの設定を5通りに描きました。クリックだけで操作してから、Tabで移動して矢印キーや入力も試してください。4つはドラッグなしで設定でき、今の色がスクリーンリーダーにも伝わります。1つは、スクリーンリーダーに「ボタン」としか伝わりません。
デザインファイルで
- カラーコードは1行の文字ではなく、入力できる欄として描く。
- 入力欄から開くピッカーは、開いた状態と閉じた状態を描き、次の入力欄を覆わない位置に開く。
- 四角い面、バー、ホイールをクリックすると、ドラッグと同じようにつまみがそこへ移ることを書き添える。
- パレットの色には「Ocean」「Coral」のような読める名前を付け、画面にも表示する。
- つまみは濃い縁の付いた白い輪で描き、フォーカスの枠が付いた状態も描く。
合格
- ピッカーが開くカラーコードの入力欄 閉じた状態は、先頭に色の小さな四角が入った小さな入力欄です。クリックやTabで入力欄に移ると、カーソルを入力欄に残したまま、その下に小さな面と色相のバーが開きます。入力はそのまま続けられ、面やバーをクリックすればドラッグなしで色が決まり、Escapeで閉じます。キーボードの利用者はコードで色を指定します。
- 名前の付いた色見本のチップ 色ごとに、点と名前の入ったピルにし、枠線は#6b7280(4.83:1)です。選んだ色は2pxの#1a1a1aの枠線とチェックマークになります。ForestとSlateを見分けにくい人も名前で区別でき、スクリーンリーダーにも名前が伝わり、矢印キーで色の間を移動できます。
ブランドカラー
動かす先の色を描いた3本のスライダー 色相、彩度、明るさのそれぞれに、動かした先の色を描いたトラックと、端に書いた値(「220°」「75%」)があります。トラックのどこをタップしてもそこに設定され、矢印キーで1段ずつ動くため、どの色にもドラッグは不要です。- ブランドカラークリックで選べるカラーホイール 色相の輪の中央に選んだ色を、下にその名前を表示します。輪のどこをクリックまたはタップしても、つまみがそこへ移ります。WCAGの解説書がカラーホイールの例で示すとおりの動きで、矢印キーでも回せます。
不合格
- ブランドカラー名前のない丸い色見本WCAG 4.1.2 5つの丸い色見本で、選んだものにチェックマークが付きます。Tabでは届きますが、スクリーンリーダーは「ボタン」と5回言うだけで、OceanとCoralの区別も、どれを選んでいるかも伝わらず、音声操作で呼ぶ名前もありません。
修正の確認
5つの確認
確認方法: キーボード、スクリーンリーダー、マウス、タッチ
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。ピッカーやそのライブラリーを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。range入力の読み上げ方はスクリーンリーダーによって異なり、名前より先に値を読むものや、iOSのようにキーではなく上下のスワイプで動かすものもあります。ブラウザー標準のカラーピッカーはバージョンによって変わるため、利用者が使うものを確認してください。価格や音量のような1本のスライダーはドラッグでしか動かない範囲スライダー、ジェスチャー全般はボタンで代われないピンチ・ドラッグ・傾きのジェスチャーで扱います。選んだ色の上で白い文字が読めるかどうかは別の確認です。ブランドカラーや写真の上でコントラストが足りない文字を参照してください。対象とする支援技術で、設定の操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。