UIコンポートネント作成の方法は今や様々な方法がありますが、JSを減らす、ないしは無くすことができればそれに越したことはありません。
ネイティブHTMLを活用することで、JSやCSSへの依存をある程度減らすことができるかもしれません。Cool native HTML elements you should already be usingを読んでとても勉強になったので、備忘録として残したいと思います。
ネイティブHTMLを使って嬉しいのか
以下のような利点があると思っています。
- JSの依存関係を考えなくても良くなる場合がある
- ブラウザネイティブなため、互換性の心配がUIライブラリと比較して小さい
- ネイティブHTMLはアクセシビリティへの配慮ができているので、ネイティブHTMLをうまく活用できるとアクセシビリティへの対策もできる
モーダルウィンド
過去にまとめたことがあるので、よければ別の記事(HTML】便利そうな dialog 使ってみた感想)を参照してください。
-
dialog
要素にによりキーボードで操作可能 - モーダルを開くとフォーカスが自動的にモーダルの中に移動
- ESCキーでモーダルを閉じる
などが自動で実装されており大変便利です。
アコーディオン
<details>
<summary>クリックして開く見出し</summary>
ここに隠されたコンテンツが入ります
</details>
details
要素で追加の詳細情報を確認できるようになります。
ただ、details
要素には必ずsummary
要素を含まなければならず、詳細情報が非表示になった状態では、summary
要素の内容のみが表示されます。
メモ
-
details
要素はインタラクティブな要素の一つでもあるので、デフォルトでキーボードによるフォーカスが可能 -
details
要素にはopen
属性をつけることができるので、デフォルトで開いた状態も作れる -
name
属性を活用することで排他的アコーディオンになる - アコーディオンのネストも可能
デモ
See the Pen native html accordion by 小林誠 (@knicisow-the-vuer) on CodePen.
スライダー
input
要素の type='range'
を活用すると実装できます。
スライダーをつまみで調整できるインターフェースなため、大まかな値を直感的に操作しやすい反面、細かい値の微調整には向きません。
ちなみに ARIAロールは slider
です
メモリ付き
範囲入力にdatalist
要素を使用することで、書く値のチェックマークを表示できます。
以下のように実装します。
<input type="range" min="1" max="5" list="steps" />
<datalist id="steps">
<option>1</option>
<option>2</option>
<option>3</option>
</datalist>
リアルタイム値表示
少しのJSを使用することで簡単に表現できます。
<input type='range'>
が動かされると、すぐ後ろの<output>
要素の値をスライダーの値に同期させます。
<input type="range" value='50' min="1" max="100" oninput="this.nextElementSibling.value = this.value" />
<output>50</output>
デモ
See the Pen native html slider by 小林誠 (@knicisow-the-vuer) on CodePen.
output要素はアプリケーションの実行結果やユーザーの操作結果を表示するために使用します。
span
などでも代用できそうな気もしますが、
- name属性で名前をつけられる(formの値として送信はされない)
- フォームに配置するとリセットボタンで初期値に戻せる
- ARIAロールが
status
であり、値が変化した際に支援技術に対して通知する機能を持つ
と機能を持つので、output
を使える場面ならこれを活用する方がいいでしょう。
プログレスバー
nativeなhtmlがサポートしています。
参考: progress
See the Pen native html progressbar by 小林誠 (@knicisow-the-vuer) on CodePen.
これは動的な進捗状況を表現するためのものなので、単なる静的なグラフとして表現したい場合はmeter
を使用します
静的なグラフ meter
棒グラフのようなゲージとしてレンダリングされます。
<meter value='0.75>0.75</meter>
注意:
value
だけでUIは表現できますが、meter
要素を解釈しないブラウザに対するフォールバックとして、テキストを入れておくことが無難だそうです。
参考: meter
検索可能なドロップダウン
datalist
やoptgroup
を活用することで検索したり、グループ化を簡単に実装できます。
入力補完の候補を表示
datalist
要素に id
属性を指定し、そのid
をinput
要素のlist
属性で指定することで、datalist
の子要素であるoption
要素が補完候補になります。
入力しながら絞り込みができるので、検索フォームで活用できます。
<!-- datalist -->
<label for='browser'>リストを選択してください</label>
<input list='browser-names' name='browser' id='browser' />
<datalist id='browser-names'>
<option value='Edge' />
<option value='Firefox' />
<option value='Chrome' />
<option value='Safari' />
</datalist>
ちなみにinput
要素にtype='range'
を指定すると option
で指定した位置にメモリがつくスライダーとなります。
候補のグループ化
select
要素の中で、optgroup
要素を使用すると、option
要素をグループ化できます。
<!-- group list -->
<label for='food'>食べ物を選択してください</label>
<select id='food'>
<optgroup label='Fruits'>
<option value=''>🍏Apple</option>
</optgroup>
<optgroup label='Vegetables'>
<option value=''>🍅Tomata</option>
</optgroup>
<optgroup label='Desserts'>
<option value=''>🍮Pudding</option>
</optgroup>
</select>
注意:
-
optgroup
にはoption
以外を入れることができない -
optgroup
を入れ子にできない
参考: optgroup
デモ
See the Pen native html datalist by 小林誠 (@knicisow-the-vuer) on CodePen.
キャプション付き画像
figcaption
を使用するとキャプションを表現できます
figcaption
はfigure
要素のなかの先頭か末尾におく必要があります。
以下のように書きます
<figure>
<img src="image.jpg" alt="..." />
<figcaption>画像の説明</figcaption>
</figure>
See the Pen Untitled by 小林誠 (@knicisow-the-vuer) on CodePen.
注意:
figcaption
のスクローンリーダーの読み上げ対象となるので、alt
と同じ文言を書いた場合、2度同じ内容が読み上げられるので注意が必要です。
参考: figcaption
マークされたテキスト
強調やハイライトを表現し、強調したいケース以外に、検索語句をハイライトとしたい場合でも使用できます。
<mark>ここテストに出ます!</mark>

まとめ
ここまで見ていただきありがとうございます。
自分も過去にspanタグやjsを無理やり駆使して、車輪の再発明をしたことがあります。😅
こういったネイティブHTMLの挙動を知っておくと、実装を効率化させたり、よりアクセシビリティに配慮されたUIコンポーネントを実装できます。
誰かの参考になると嬉しいです。