1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JSはもういらない?2025年ならHTML/CSSだけで実装できるリッチなUI 10選

Posted at

JSはもういらない?2025年ならHTML/CSSだけで実装できるリッチなUI 10選

「このUI、JSライブラリ入れなきゃ…」そう思っていた時期が私にもありました。
しかし、ブラウザの進化により、かつては数十行のJavaScriptを駆使していた実装が、今やHTMLタグひとつ、CSS数行で完結します。

2025年現在、積極的に使っていきたい「脱JS」な実装を、**「昔のやり方」**と比較してまとめました。


1. ポップオーバー(Popover API)

ツールチップや簡易メニューを表示する際、もう座標計算は不要です。

【昔】JSで表示・非表示と位置を管理

// 昔はこう書いていた
const btn = document.querySelector('#btn');
const popover = document.querySelector('#popover');

btn.addEventListener('click', () => {
  popover.classList.toggle('active');
  // さらに外側をクリックした時に閉じる処理や
  // z-indexの管理、座標計算が必要だった...
});

【今】HTML属性だけで完結

<button popovertarget="my-popover">メニューを開く</button>

<div id="my-popover" popover>
  <p>これだけで最前面に表示。外側クリックで自動で閉じます。</p>
</div>


2. モーダルダイアログ(Dialog API)

アクセシブルなモーダルを自作するのは苦行でした。

【昔】divとJSで擬似モーダルを作成

// 昔の苦労
// 1. 背景を固定する
// 2. Escキー押下イベントを監視して閉じる
// 3. フォーカスがモーダルの外に出ないように制御(フォーカストラップ)
window.addEventListener('keydown', (e) => {
  if (e.key === 'Escape' && modal.isOpen) {
    closeModal();
  }
});

【今】<dialog> タグ

// 開くときだけ1行。Esc対応やフォーカス制御はブラウザ標準。
dialog.showModal();


3. アコーディオン(Details / Summary)

【昔】クリックイベントと高さ計算

// 昔のやり方(jQueryなど)
$('.summary').click(function() {
  $(this).next('.content').slideToggle();
});

【今】タグを置くだけ

<details>
  <summary>詳細を表示する</summary>
  <p>JS不要。検索(Ctrl+F)にもヒットするようになります(hidden=until-found)</p>
</details>


4. スムーズなカルーセル(Scroll Snap)

【昔】重いライブラリを導入

Slick.jsやSwiper.jsを読み込み、複雑なオプションを設定していました。

【今】CSS数行

.container {
  display: flex;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
}
.item {
  scroll-snap-align: center;
}


5. ダークモード対応(light-dark() 関数)

【昔】JSでクラスを付け替える

const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
if (isDark) document.body.classList.add('dark-mode');

【今】CSS関数1つ

:root {
  color: light-dark(#333, #ccc);
  background-color: light-dark(#fff, #1a1a1a);
}


6. 入力候補(Datalist)

【昔】自作のサジェスト機能

inputの値を監視し、フィルタリングしたリストを絶対座標で表示させるJSが必要でした。

【今】<datalist>

<input list="langs">
<datalist id="langs">
  <option value="JavaScript">
  <option value="TypeScript">
</datalist>


7. 強力なバリデーション

【昔】送信時にJSで全チェック

form.onsubmit = (e) => {
  if (input.value.length < 8) {
    alert('8文字以上で入力してください');
    return false;
  }
};

【今】属性で指定

<input type="text" required minlength="8" pattern="^[a-z]+$">


8. 要素のリサイズ(CSS resize)

【昔】マウスドラッグの距離を計算

mousedown, mousemove, mouseup を組み合わせて自作。

【今】CSS 1行

.box {
  overflow: auto;
  resize: both;
}


9. 画像の遅延読み込み(Lazy Load)

【昔】スクロール位置を監視

Intersection Observerを使うか、外部ライブラリを使用していました。

【今】属性を追加

<img src="image.jpg" loading="lazy">


10. 計算結果の表示(Outputタグ)

【昔】spanのinnerHTMLを書き換える

const total = a + b;
document.getElementById('result').innerText = total;

【今】意味のあるタグで表示

<form oninput="res.value = parseInt(a.value) + parseInt(b.value)">
  <input type="number" name="a"> + <input type="number" name="b">
  = <output name="res">0</output>
</form>


まとめ:標準機能は「速くて、安全」

JSライブラリを減らすことは、単にコードが短くなるだけでなく、表示速度の向上メンテナンスコストの削減に直結します。

2025年、新しい機能を実装する前に「これ、実はHTMLだけでいけるのでは?」と一度立ち止まってみるのが、モダンなエンジニアへの第一歩かもしれません。(自分は学生ですけどね)

1
2
0

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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?