Communitygithub.com

Web Liquid Glass

Appleスタイルのリキッドガラス表面をWeb上で構築(CSS + React/Next.js + Tailwind)。単なるぼかしボックスではなく、本物のガラスのように見えるUIを実現します。Glisse Reactコンポーネントライブラリと併用可能。

Web Liquid Glass とは?

Web Liquid Glassは、本番のNext.js + Tailwindサイトから抽出された、プロダクション品質のガラス素材CSSです。従来のCSSフィルターによる単純なぼかし(ブラー)とは異なり、マテリアル(彩度・明度調整)、リム(エッジの光沢)、シーン(上部のスペキュラーハイライト)、深度(影)の4要素を組み合わせることで、iOS 26/27のようなリアルなガラス表現を実現します。リファレンスCSS(約2,200行)には各値の詳細なコメントが付いており、必要なセクションだけ読み解けます。また、Glisse(`npm install glisse`)というReact 18+対応のコンポーネントライブラリも用意されており、ボタン、スイッチ、タブバー、セグメントコントロールなどの操作系UIにリキッドガラスを適用できます。ただし、CSSの競合を避けるため接頭辞の調整やアクセシビリティ対応(`prefers-reduced-transparency`、`prefers-contrast`)の追加が必要です。SafariではSVGフィルターを使った屈折表現が利用できない制限もあり、フォールバック設計が不可欠です。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/NotYousha/claude-skills/tree/HEAD/skills/web-liquid-glass

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Web Liquid Glass は何をしますか?

プロダクション品質のWeb用ガラス素材です。実際のNext.js + Tailwindサイトから抽出されました。完全なソースコードは reference/ にあります。

  • reference/liquid-glass.css:素材全体(トークン、サーフェス、バリアント、シェイプドガラス、屈折、劣化)。約2,200行。各値の詳細なコメント付き。ファイル全体ではなく、必要なセクションだけ読みましょう。
  • reference/glass.tsx:<Glass> ReactコンポーネントとSVG屈折フィルター。
  • reference/glass-specular.tsx:ポインターと傾きを追跡するスペキュラーハイライト。

リファレンスは2つのサイトヘルパー(cn と lite-mode モジュールの LITE_CLASS)をインポートしています。プロジェクトの独自の cn/clsx と「エフェクトオフ」用のクラス名に置き換えてください。sky-*、kiosk-*、祈り関連のセレクターはサイト固有のバリアント例です。削除するか、パターンとして利用してください。

ガラスとは

ガラスは4つの部分から成ります。Web版が最初の1つだけ実装すると、安っぽく見えます。

  1. マテリアル:ぼかしと彩度の向上(約200%)。約150%未満では灰色のプラスチックに見えます。明るさのリフトとコントラストのプルを追加し、背後にあるコンテンツをソフトなウォッシュに拡散させます。
  2. リム:明るいヘアラインで光がエッジに当たる部分。反対側のエッジは暗く。リムなしのぼかしは決してガラスに見えません。
  3. シーン:上部エッジ内側のソフトなスペキュラーハイライト。
  4. 深度:幅広で非常にソフト、低不透明度の影。タイトなカードシャドウではありません。

屈折(エッジでのコンテンツの歪み)は5番目の要素で、Webで安価に実現できない唯一のものです。backdrop-filter: url(#svg-filter) が必要で、Chromiumでのみ動作します。

ガラスを配置する場所

ガラスはナビゲーション層(バー、カプセルナビ、フローティングコントロール、シート)に配置し、本文コンテンツには配置しないでください。ガラス上のテキストコントラストは背後でスクロールするコンテンツに依存するため、保証できません。コンテンツには不透明カードをデフォルトとし、サーフェスごとにガラスをオプトイン(.lg)にします。

実際に時間を要するルール

  1. ガラスCSSは @tailwind base と同じファイル内、@layer 内に置くこと。 Tailwindはファイルごとに @layer を解決するため、別のCSSファイルでは @layer base でエラーになります。ラッパーを削除するとルールが非レイヤー化され、非レイヤールールはすべてのTailwindユーティリティよりも優先されます。.lg { position: relative } がナビの fixed を静かに上書きしてしまいます。
  2. --x: calc(var(--x) * 0.7) と絶対に書かないこと。 これはループです。計算値の時点で無効となり、エラーなしで継承値にフォールバックします。代わりに2番目の変数(--lg-clarity-bump、--lg-press)を使用してください。
  3. ガラスサーフェスは正確に1つのエッジを持ち、::before がそれを描画します。 2つのエッジ(::before リムと inset box-shadow ベベル、またはボーダーボックス外側のスプレッドシャドウ)は、アルファ値をいくら調整しても修正できない「二重ボーダー」を引き起こします。
  4. corner-shape は継承されません。 サーフェスに corner-shape: squircle がある場合、境界線を描画するすべての疑似要素には border-radius: inherit と corner-shape: inherit の両方が必要です。そうしないとリムがボディと異なる曲線を描きます。
  5. ガラス内のガラスに backdrop-filter を付けないでください。 すでに着色された背景をサンプリングし、濁ってしまいます。ガラスバー内の選択チップ(.lg-chip)は、独自のぼかしを持たない着色レンズです。
  6. :root で継承されたカスタムプロパティをアニメートしないでください。 ドキュメント全体のスタイルが無効になります。60サーフェスのページで1フレームあたり約11.6ms、同じ値を要素ごとに書き込む場合の2msに対して。
  7. バーはスクロールフレームごとに再ブラーします。 .lg-bar に小さなブラー半径と contain: paint を指定してください。デバイスがまだカクつく場合は --lg-blur-bar: 0px を設定します。リムとシーンで見た目は十分保たれます。
  8. グリッチを修正するためにフロストガラスを平坦化しないでください。 ほぼ不透明な「ベタ塗り」バーはガラスの見た目を失います。代わりに幾何学的な原因(エッジでボディを薄くするマスク、二重リム)を見つけてください。
  9. SVG屈折レンズは自身のボックスを超えてサンプリングしてはなりません。 Chromeではそこが透明になり、元のコンテンツがゴーストとして透けて見えます。

SafariとiPhone

WebKitは backdrop-filter をサポートしますが、その内部のSVGフィルターを拒否するため、Safariでは屈折がまったく利用できません。Safariが屈折できるのは独自のツールバーだけです。viewportFit: "cover" を設定してページをその下で実行させ、env(safe-area-inset-*) をナビとフッターで必須にします。

アクセシビリティとフォールバック(常にこれらを同梱すること)

すべてのサーフェスは、ほぼ不透明な色合いに劣化し、見た目が近く、フレームあたりのコストがかからなければなりません。

  • @media (prefers-reduced-transparency: reduce)
  • @supports not (backdrop-filter: blur(1px))
  • @media (prefers-contrast: more):より強い色合いとソリッドエッジ
  • ルートクラス(例:.lg-off):すべてのガラスサーフェスを一度に無効化(ユーザートグルまたは低電力モード用)

バーには独自の、より高い最大色合い(--lg-tint-max-bar)を指定し、コンテンツが下をスクロールしてもナビリンクのテキストコントラストを維持します。

適用方法

  1. reference/liquid-glass.css からトークンブロックとサーフェスセクションを、プロジェクトのメインCSSファイルの既存の @layer ブロック内にコピーします(ルール1)。
  2. カラートークンをプロジェクトのパレットにマッピングします。リファレンスはshadcn形式の hsl(var(--card)) トークンを使用しています。
  3. reference/glass.tsx の <Glass> またはプレーンな .lg、.lg-bar、.lg-nav、.lg-pane、.lg-chip、.lg-refract クラスを使用します。
  4. reference/glass-specular.tsx のスペキュラーハイライトは、コストに見合う場所(ヒーローコントロール、メインナビ)にのみ追加し、prefers-reduced-motion を尊重します。
  5. ChromeとSafariの両方で、ライトモードとダークモードの両方で、賑やかな写真上とプレーンテキスト上で確認します。

既製コントロール:Glisse

Glisse by Kelvin Zhang(npm install glisse、MIT、React 18+、依存関係なし)は、プレス・トゥ・リフトレンズ動作が組み込まれた、インタラクティブなリキッドガラスコントロールを出荷します。Button、Switch、Slider、TabBar、SegmentedControl、Menu、Input、SearchField、そしてプレーンな Glass サーフェス。そのスタイルはJSバンドルによって注入されるため、CSSファイルのインポートは不要です。

どちらをいつ使うか:

  • Glisseはコントロール用:スイッチ、スライダー、タブバー、セグメントコントロール。ドラッグ中にサムがレンズに浮き上がります。手作業で構築するには数日かかります。
  • この素材はサーフェス用:ナビバー、カプセルナビ、パネル、シート、写真上のカード、そして既存のデザインシステムやTailwindテーマに合わせる必要があるもの。

組み合わせる際の注意点:

  1. 両方とも lg- プレフィックスを使用します。 Glisseは .lg-glass、.lg-button、.lg-tab-bar と変数 --lg-blur、--lg-tint、--lg-rim、--lg-filter を定義し、これらがこの素材のトークンと衝突します。両方を使用するページでは、この素材のプレフィックスを(例:ylg- に)リネームするか、Glisseをそれらの変数をリセットするラッパー内にスコープします。さもなければ、互いに静かに再調整し合います。
  2. Glisseのダークモードは data-theme="dark" または prefers-color-scheme をキーにします。 Tailwindの .dark クラスではありません。クラスベースのダークモードの場合、<html> に .dark とともに data-theme を設定するか、Glisseはライトのままです。
  3. Glisseは prefers-reduced-motion を処理しますが、prefers-reduced-transparency や prefers-contrast は処理しません。 このスキルのアクセシビリティセクションのフォールバックをGlisseコントロールの周囲に追加してください。
  4. Glisseの .lg-glass はすでにエッジをinset box-shadow で描画しています。 その上に ::before リムを追加しないでください(ルール3:エッジは1つのみ)。

関連スキル