チェックボックスUI - コピペで使えるアクセシビリティ対応モジュール
はじめに
こんにちは。株式会社VOWZ の Chikara です。
弊社では、定期的なアクセシビリティ講習の実施や、制作したWebページに対するアクセシビリティチェックなど、企業として継続的にアクセシビリティに取り組んでいます。
今回は、チェックボックスUIに関する解説をお届けします。
HTML標準のセマンティクスのinput type="checkbox"
を使用したモジュールにあわせて、div
要素などをカスタマイズして実装したモジュールの2例を紹介させていただきます。
モジュールだけを確認したい場合は、目次の【モジュール】をご参照ください。
基本編
【モジュール】標準的なチェックボックスUI
標準的なチェックボックスUIのコード解説
こちらのコードでは、HTMLの標準機能を使用しているため、さまざまなサポートが受けられます。
まず第一に、aria-checked
などの状態管理を行うための JavaScript を用意する必要がありません。
HTML と CSS だけで動作する構成となっており、シンプルさと堅牢さの両立が実現されています。
<h3 id="id-group-label">好きなアニメにチェックを入れてください</h3>
<div role="group" aria-labelledby="id-group-label">
-
id
属性を使用することで、aria-labelledby
属性によってラベルと対象要素を関連付けることができます。 -
role="group"
を付与することで、内包される要素がひとつの意味的なグループであることを明示できます。
ただし、ul
要素に対してrole="group"
を指定すると、本来のrole="list"
が上書きされてしまうため、付与は避けるべきです。
<label class="c-check-label">
<input type="checkbox" class="c-check">
SPY×FAMILY
</label>
-
label
要素の中にinput
要素とラベルテキストを含めることで、id
とfor
属性による紐付けを省略することができます。 - 一方で、
label
要素の外にinput
要素を配置する場合は、id
属性とfor
属性による明示的な紐付けが必要です。 -
input
要素単体で使用する場合は、aria-label
などでラベル情報を提供する必要があります。
.c-check {
appearance: none; /* デフォルトスタイルの打ち消し */
-webkit-appearance: none;
width: 20px;
height: 20px;
margin: 0;
border: 2px solid #ccc;
border-radius: 2px;
transition: .3s;
position: relative;
}
.c-check-label:hover {
color: #008060;
}
.c-check-label:hover .c-check {
border-color: #008060;
box-shadow: 0 0 0 1px #008060 inset;
}
- スタイルの自由度が限られがちな
input
要素に対して、appearance: none;
を指定することで、ブラウザによるデフォルトスタイルを無効化しています。 -
appearance
プロパティは主要なブラウザでサポートされていますが、念のため-webkit-appearance
も併用して対応範囲を広げています。 - デフォルトスタイルを無効にした場合、ホバーやフォーカスなどステータス変化に応じたスタイルが消えてしまうため、必要に応じてそれらを明示的に追加する必要があります。
応用編
【モジュール】カスタムチェックボックスUI
カスタムチェックボックスUIのコード解説
カスタム要素として実装しているため、スタイル面での拡張性は高く、デザインの自由度も確保しやすい構造になっています。
ただし、機能面では aria
属性や JavaScript に依存しているため、実装が適切でない場合、アクセシビリティ上の問題が生じる可能性があります。
意図した挙動が支援技術でも正しく伝わるよう、仕様に沿った丁寧な実装が求められます。
HTML
<li>
<div role="checkbox"
aria-checked="false"
tabindex="0"
aria-label="SPY×FAMILYを選択">SPY×FAMILY
</div>
</li>
-
role="checkbox"
を使用することで、input type="checkbox"
と同等の挙動を持たせることができます。 -
aria-checked
によって、チェックの状態(オン/オフ)を明示的に管理します。 -
tabindex="0"
を指定することで、div
要素でもキーボード操作によるフォーカスが可能になります。 -
aria-label
に「〜を選択」などの文言を設定することで、支援技術にとってわかりやすく、よりアクセシブルな実装になります。
input
を label
の外に配置したチェックボックス
【モジュール】
input
要素が label
要素の外に出ている
今回の実装のように、<li>
<input id="check-1" type="checkbox" class="visually-hidden">
<label for="check-1" class="c-check-label"># SPY×FAMILY</label>
</li>
input
要素が label
要素の中に含まれている
<label class="c-check-label">
<input type="checkbox" class="c-check">
SPY×FAMILY
</label>
業務の中で、input
要素が label
要素の外に配置されたチェックボックスに触れる機会がありましたので、備忘録として記載しておきます。
まとめ
チェックボックスに関しては、HTML標準の機能だけでも、十分なカスタマイズ性を備えていると感じています。そのため、どうしても必要な事情がある場合を除き、標準要素の活用を優先するのが望ましいかもしれません。もちろん、カスタム要素の使用が問題というわけではありませんが、role
属性などを正しく設定した上での実装が前提となりますので、ご注意ください。
今回ご紹介したモジュールについては、すべての支援技術での完全な動作保証まではできないものの、Chromeの拡張機能「axe DevTools」でのアクセシビリティチェックをクリアしたものを掲載しています。アクセシブルなサイトづくりを目指すエンジニアの皆さまにとって、ささやかでも一助となれば幸いです。
本記事に関するご質問や、そのほか気になる点などありましたら、お気軽にコメントいただければと思います。
※本記事で掲載されているモジュールの一部は、W3Cによる ARIA Authoring Practices を引用・調整したものです。ライセンスは W3C Software License に準拠します。
※選択肢の例として『SPY×FAMILY』『鬼滅の刃』など、人気アニメを使用しています。
Discussion