31
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【HTML】ネイティブHTMLだけで作れるUIコンポーネント

Last updated at Posted at 2025-05-12

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>

image.png

注意:
valueだけでUIは表現できますが、meter要素を解釈しないブラウザに対するフォールバックとして、テキストを入れておくことが無難だそうです。

参考: meter

検索可能なドロップダウン

datalistoptgroupを活用することで検索したり、グループ化を簡単に実装できます。

入力補完の候補を表示

datalist要素に id属性を指定し、そのidinput要素の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を使用するとキャプションを表現できます
figcaptionfigure要素のなかの先頭か末尾におく必要があります。

以下のように書きます

<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コンポーネントを実装できます。

誰かの参考になると嬉しいです。

参考

31
22
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?