- Webで JS依存の機能をHTML/CSSで置き換える 最新の方法を紹介
details・summary、datalist、popover などの標準要素を活用して、アコーディオン、自動補完、モーダル、オフスクリーンナビゲーションを実装
- このようなアプローチは ダウンロード・評価・メモリ使用量を削減し、性能とユーザー体験を改善
- 各機能ごとに CodePenの例、MDNドキュメント、ブラウザー互換性情報 も提供
- JSは本当に必要な領域にだけ使い、HTML/CSSの進化した機能を積極的に活用すべき
HTMLとCSSでJS機能を置き換える
- 長年にわたり JavaScript は、HTMLやCSSだけでは実装できない機能を担ってきた
- しかしHTMLとCSSの機能が拡張されたことで、一部のJS機能は ネイティブなWeb技術で置き換え 可能になった
- JSはダウンロード・展開・評価・メモリ保持が必要なため、置き換え可能な機能は HTML/CSSへ移す のが効率的
- JSは複雑なロジックに集中し、単純なUI制御は HTML/CSSに委ねる 方向を提示
アコーディオン / 展開コンテンツパネル
details と summary 要素で、JSなしでもアコーディオンを実装可能
- コンテンツをクリックして開閉でき、
open 属性で初期状態を指定
- 同じ
name 属性を使うと 1つのパネルだけが開く
- CSSでスタイリングしたり、JSで開閉を制御したりすることも可能
- 関連資料: MDN
details ドキュメント、CodePenの例、ブラウザー互換性表
自動補完候補入力欄
input と datalist の組み合わせで 自動フィルタリングされるドロップダウン を実装
- 入力時に候補リストが自動でフィルタリングされる
- テキスト以外にも
number、time などさまざまな入力タイプをサポート
- Firefoxは現在テキストベースの入力のみ対応しており、モバイルではアクセシビリティ上の制約がある
- 関連資料: MDN
datalist ドキュメント、SitePointチュートリアル、ブラウザー互換性表
モーダル / ポップオーバー
popover および popovertarget 属性で、JSなしのモーダル・ポップオーバーを実装
auto、hint、manual の3つのモードを提供
auto は外側クリックや ESC で閉じ、manual は手動でのみ閉じる
- FirefoxおよびiOSは
hint モードをサポートしていない
- 関連資料: MDN
popover ドキュメント、Chromeブログ、CodePenの例、アクセシビリティ関連動画
オフスクリーンナビゲーション / コンテンツ
popover 機能を活用して オフスクリーンナビゲーションメニュー を実装可能
nav 要素を使って意味づけし、CSS translate で画面内外へ移動
- 外側クリックで閉じられ、
popover="manual" で手動クローズ設定も可能
::backdrop 疑似要素で背景を半透明にできる
- 関連資料: MDN Popover API、Chromeブログ、CodePenの例
結論
5件のコメント
こうした試みは、たまに自分がオーバーエンジニアリングしているのではないかと省みるきっかけにはなるが、要求事項が豊富な実務の観点では、ほとんど曲芸に近い。
> ** と ** 要素で、JSなしでもアコーディオンを実装可能
何か内容が途中で切れている気がします
修正しておきました〜!
限界があるのは明らかですし、AIが本格的に有効になった時点で……こういうリファクタリングをする必要があるのでしょうか?
JSコンテンツのブロックのような部分も考慮しているのでしょうか?
Hacker Newsの意見
CodePenのリンクの代わりに、HTMLの代替例をページ内に直接載せていたら、ずっと説得力があったと思う
<details>/<summary>タグの可能性は本当にすごいほとんど何でもできるのに、たいていのコンポーネントライブラリはこれを無視している
aria属性も不要で、アクセシビリティも最初から備わっている
<details>はGitHubのようなMarkdownベースのサイトでも動く。長いログを折りたたんで見やすく投稿できる本“You Don’t Need JavaScript”を書いていて感じたのは、JSは新機能を追加するというより、プラットフォームの既存機能を補完することが多いということ
<input>と<datalist>は実用面では不十分ユーザーはタイプミス許容、補助テキスト、モバイルUXなどを期待するが、datalistはそれを満たせない
HTMLのセマンティックな使い方やアクセシビリティはほとんど重視されていない
「HTMLだけで実装しよう」という記事なのに外部サービスに依存しているのは矛盾しているように感じる
WHATWG stage 3にあり、JSベースのドロップダウンの悪夢のような実装を置き換えられそう
Chromeブログの記事参照
HTMXやPhoenix LiveViewのような代替も使ってみたが、完全な解決策ではない
結局、現代的なJSを受け入れるのが現実的だという気がする
<marquee>タグはECサイトの横スクロール実装に向いていたのに、今はJSで無理やり実装している。HTMLがもっと多くのUIパターンを標準でサポートしてほしい複雑なWebアプリにはJSが必須だが、HTMLだけで可能な領域も多い
しかしJSは今やデータ収集と広告トラッキングの中核ツールになってしまった
JSなしでもビッグテックが同じレベルの監視と広告サービスを実装できるのか気になる
結局、JSへの反感は単なる技術問題ではなく、広告エコシステムへの不信から来ている