
2026/01/20 0:15
CSS ウェブコンポーネント ― マーケティングサイト向け(2024)
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
この記事では、Shadow DOM と JavaScript に依存する「通常の」ウェブコンポーネントは、スイムレーンやバナーといったシンプルな UI でさえ JS が必要になるため、マーケティングサイトのデザインシステムには過剰だと主張しています。まず HTML ウェブコンポーネント を説明し、これはコンポーネント内に通常の HTML を許容し、最小限のハイドレーションで進化的拡張、サーバー側レンダリング(SSR)への対応、およびアクセシブルなスタイリングを提供します。
これを踏まえて著者は CSS ウェブコンポーネント を提案しています。これは構造に完全にベーシック HTML のみを使用し、属性セレクタでインタラクティビティやバリアント、アクセシビリティを駆動する新しいモデルです。JavaScript は一切必要ありません。例として、CSS だけでスタイリングされたスイムレーンコンポーネントが挙げられ、
layout="reverse" のようなレイアウト変更はメディアクエリと swim-lane[layout="reverse"] セレクタで処理されます。ボタンコンポーネント(link-button)では、variant="secondary"、pill、または size="large" のような属性を使ったバリアント切替が示されています。
このアプローチは、カスケードレイヤー、コンテナクエリ、高度な疑似クラス(
:has()、:is()、:where())、カスタムプロパティ(@property)およびテーマ化のための light-dark() 関数など、モダン CSS 機能を活用します。Popover API のようなネイティブ API を利用すれば、メニューやアコーディオンといった小規模な JavaScript インタラクションも置き換え可能です。
著者は、この CSS 中心モデルがボタン、スイムレーン、カードなどの基本的なマーケティングコンポーネントをほぼ網羅でき、HTML/CSS だけで最小限またはゼロ JavaScript によって開発負荷を削減し、SSR を通じてパフォーマンスと SEO を向上させ、アクセシビリティの準拠を簡素化し、マーケター・デザイナー・フロントエンドチームにとって JS バンドルサイズを縮小できると考えています。
本文
2024年11月4日 – @hawkticehurst
ヒント
「通常の」ウェブコンポーネント(シャドウDOMを持つものなど)は、マーケティングサイトのデザインシステムにはひどい解決策だと私は思います。
スイムレーンやバナー、カードなどのウェブコンポーネントに出くわすたびに悪い味が残ります。なぜなら、これらは(非常に高度なものを作っていない限り)JavaScript を依存させる必要がないコンポーネントだからです。しかしウェブコンポーネントの世界では、最初からブラウザへコンポーネントを登録するために JavaScript が必須になるので、そのままロックインされてしまいます。
HTML ウェブコンポーネント
昨年は主にマーケティングサイトのデザインシステムに取り組んでいました。よくある課題は、低スペックデバイスや不安定なネットワークを使うユーザーにもアクセスしやすいサイトを構築することです。その実現方法は簡潔に言えば「JavaScript を少なくして、プログレッシブエンハンスメントを念頭に置く」ことです。
その中で私は HTML ウェブコンポーネント のアーキテクチャがマーケティングサイトのデザインシステムにどのように適用できるかに注目しています。
ざっくり言うと、HTML ウェブコンポーネントは通常通り HTML を書き、インタラクティブにしたい部分だけをカスタムエレメントでラップする手法です。
例えばカウンター付きボタンを作る場合は次のようになります:
<counter-button> <button>Count is <span>0</span></button> </counter-button> <style> counter-button button { /* Counter button styles */ } </style> <script> class Counter extends HTMLElement { // Counter button behavior } customElements.define("counter-button", Counter); </script>
HTML ウェブコンポーネントのマークアップは、通常通りパース・レンダリング・スタイリングされます。カスタムエレメントに紐づく JavaScript が実行された瞬間にシームレスにハイドレーションが行われます。
対照的に「通常の」ウェブコンポーネント(シャドウDOM を使用)は、ランタイムで JavaScript により動的生成されるため、まるで SPA のようです。
このアーキテクチャはマーケティングデザインシステムにとって強力な候補であり、さらに「通常の」ウェブコンポーネントにありがちな落とし穴を回避できます:
- プログレッシブエンハンスメントの完全実装
- 最小限かつ自己完結型 JavaScript – HTML ウェブコンポーネントはアイランドとして考えられます
- カスタムエレメント API の力でバリエーションを実装可能
- マークアップは完全に SSR 可能
- 通常の HTML と同じようにスタイリングできる
- 共通のアクセシビリティ慣行が問題なく適用できる
しかし、これらすべてのメリットにもかかわらず、根本的な問題は残ります:HTML ウェブコンポーネントは JavaScript を必要とする。
CSS ウェブコンポーネント
ここで疑問が生まれます。「HTML ウェブコンポーネント」のアイデアを取り入れつつ、すべての JavaScript を省略したらどうなるでしょうか? それが CSS ウェブコンポーネント です。
注:これまで誰もこの概念について語ったことはなく、私自身「CSS ウェブコンポーネント」という名称で説明しています。既に書かれたものがあればぜひ教えてください!
HTML ウェブコンポーネントと同じように機能しますが、キーとなる機能を CSS で実装します。
例 – スイムレーン コンポーネント
<swim-lane> <section> <h2>Creativity unleashed</h2> <p>A brand new way of illustrating for the web.</p> <a href="/product">Learn more</a> </section> <img src="product.jpg" alt="Product image" /> </swim-lane> <style> swim-lane { display: flex; align-items: center; gap: 2rem; color: white; background: black; padding: 1rem; border-radius: 16px; } swim-lane h2 { /* Swimlane title styles */ } swim-lane p { /* Swimlane description styles */ } swim-lane a { /* Swimlane link styles */ } @media (max-width: 650px) { /* Mobile responsive styles */ } </style>
CSS 属性セレクタで機能を追加
<swim-lane layout="reverse"> <section>…</section> <img src="product.jpg" alt="Product image" /> </swim-lane> <style> swim-lane[layout="reverse"] { flex-direction: row-reverse; } @media (max-width: 650px) { swim-lane[layout="reverse"] { flex-direction: column-reverse; } } </style>
カスタムエレメントに属性を定義するので、ネイティブ HTML 属性との名前衝突の心配はありません。
data- プレフィックスも不要です。
この手法がどこまで通用するか?
理論上、この方法はかなり遠くまで行けます。マーケティングデザインシステムに必要なほとんどの基本コンポーネントは、特定のスタイルバリエーションを持つベーシックな HTML 要素だけで構成されることが多いからです。
例 – リンクボタン
<link-button> <a href="">Learn more</a> </link-button> <link-button variant="secondary"> <a href="">Learn more</a> </link-button> <link-button pill> <a href="">Learn more</a> </link-button> <link-button size="large"> <a href="">Learn more</a> </link-button> <style> link-button a { /* Default link button styles */ } link-button[variant="secondary"] a { background: transparent; color: white; } link-button[pill] a { border-radius: 50px; } link-button[size="large"] a { padding: 10px 20px; font-size: 1.25rem; } </style>
CSS/HTML の追加パワー
- カスケードレイヤーでスタイル適用をより細かく制御
- コンテナクエリで親コンテナに応じた条件付きバリエーション
、:has()
、:is()
で複雑なセレクタを簡潔化:where()- テーマ用 CSS 変数と
ルールでさらに強力な変数管理@property - システムに合わせたテーマ切替の
light-dark() - Popover API を使ったメニュー、ツールチップ、ダイアログを JavaScript なしで実装
- FAQ セクション用専用アコーディオン
可能性は非常に広がります。
あなたはどう思いますか?