【Next.js】グラスモーフィズムの作り方を解説|Liquid Glass風すりガラス UI

公開日: 2026年9月12日 · 読了目安 10 分

Next.js と Tailwind CSS で、すりガラスのようなグラスモーフィズム UI を作る方法です。backdrop-blur の基本、文字を読みやすくするコツ、Liquid Glass風のログインカード、スクロールで変わるガラスのヘッダー、Safari の対策までコード付きで解説します。

すりガラス風のグラスモーフィズムはどこに使うか

Next.js で LP やログイン画面を作っていて、背景が透けて見える、すりガラスのようなカードを置きたくなることがあります。

グラスモーフィズムを上手に使う答えは、写真やグラデーションの上に、ガラスの面を1枚だけ置くことです。

Tailwind CSS なら、半透明の背景と背景のぼかし、細く明るい枠線の3つを組み合わせるのが出発点です。

ただし、このままでは文字が背景に沈みやすくなります。ガラスを全セクションに広げると、スマホの動作も重くなります。

  • グラスモーフィズムが失敗しやすい3つの原因

  • Tailwind で作るガラスのカードと、文字を読みやすくするコツ

  • Liquid Glass風のログインカードと、スクロールでガラスになるヘッダー

  • Safari で blur が効かないときの対策

グラスモーフィズムと Liquid Glass風の違い

グラスモーフィズムは、次の3つを組み合わせて、すりガラスの板のように見せる表現です。

  • 半透明の背景

  • 背景ぼかし(backdrop-filter: blur)

  • 細い明るい枠線

Liquid Glass は、Apple がネイティブアプリの UI 向けに示したマテリアルの名前です。

Web には同じものを再現する公式の API はありません。そのため Web で「Liquid Glass風」と呼ぶときも、やることはグラスモーフィズムとほぼ同じです。

違いを出すなら、角丸を大きくします。縁に光の反射のような明るい線を足すと、より立体的に見えます。

グラスモーフィズムが失敗しやすい3つの原因

ガラスの表現は、クラスを足すだけで見た目が変わるので手軽です。その分、次の3つで失敗しやすくなります。

背景が単色で、すりガラスにぼかすものがない

backdrop-blur は、後ろにあるものをぼかす効果です。背景が白一色なら、ぼかしても白いままで、ただの半透明のカードにしか見えません。

ガラスは、後ろに写真やグラデーション、色の付いた図形があって初めて成り立ちます。

ガラスの上の文字のコントラストが足りない

明るい写真の上に bg-white/10 と白い文字を重ねると、文字が背景に溶けます。

WCAG(Web のアクセシビリティの指針)の AA では、本文の文字と背景のコントラスト比を 4.5:1 以上にすることが求められます。見た目の雰囲気より、読めることを先に確保してください。

大きな面積や多くの要素をぼかしている

backdrop-filter は、スクロールのたびに後ろの描画をぼかし直すため、面積が広いほど処理が重くなります。固定ヘッダーの細い帯やカード1枚なら問題になりにくいものの、画面いっぱいのパネルや、ガラスのカードを何十枚も並べる使い方はスマホで重くなります。

Tailwind でグラスモーフィズムのカードを作る

基本の組み合わせをクラスで書くと、半透明の背景が bg-white/10、背景のぼかしが backdrop-blur-md です。

枠線は border border-white/20 で、細く明るい線にします。

下のコードでは、写真の上に、短い見出しとボタンを載せたガラスのカードを作ります。文字を読みやすくするために、写真の上に薄い黒のオーバーレイを敷き、ガラスの色も少し暗めにしています。

長い本文はガラスの上に置かず、不透明な背景のセクションに置きます。ガラスに載せるのは、次の程度にとどめます。

  • 見出し

  • 1〜2行の説明

  • ボタン

tsx
// components/GlassHero.tsx
  import Image from "next/image";

  export function GlassHero() {
    return (
      <section className="relative isolate flex min-h-[80vh] items-center justify-center overflow-hidden px-6">
        <Image
          src="/hero-mountain.jpg"
          alt=""
          fill
          priority
          className="-z-20 object-cover"
        />
        <div aria-hidden="true" className="absolute inset-0 -z-10 bg-black/30" />

        <div className="w-full max-w-md rounded-3xl border border-white/20 bg-zinc-900/70 p-8 text-white shadow-2xl supports-[backdrop-filter]:bg-white/10 supports-[backdrop-filter]:backdrop-blur-xl">
          <h1 className="text-3xl font-semibold tracking-tight">山の上で、静かに働く</h1>
          <p className="mt-3 text-sm text-white/80">
            電波の届く山小屋を、1泊から予約できます。
          </p>
          <a
            href="#booking"
            className="mt-6 inline-block rounded-full bg-white px-6 py-3 text-sm font-medium text-zinc-900"
          >
            空き状況を見る
          </a>
        </div>
      </section>
    );
  }

すりガラスのぼかしが効かないブラウザへのフォールバック

上のコードは、ふだんは bg-zinc-900/70 の不透明に近い背景にしています。

backdrop-filter に対応したブラウザでだけ、supports-[backdrop-filter]: で半透明とぼかしに切り替えます。ぼかしが効かない環境でも、文字が読めないことはありません。

ガラスのカードを Liquid Glass風に寄せる

Liquid Glass風に見せたいときは、角丸を rounded-3xl 以上に大きくし、縁の内側に明るい線を足します。shadow-[inset_0_1px_0_rgba(255,255,255,0.4)] のような内側の影を足すと、上端に光が当たったように見えます。

Liquid Glass風のログインカードを作る

ガラスの表現がいちばん映えるのは、ログイン画面のように「背景写真+小さなフォーム1つ」の画面です。入力欄が少なく、ガラスの面積も小さいので、読みやすさと処理の重さの両方を保てます。

入力欄の背景は bg-white/15 程度にし、プレースホルダの色も白の濃さを下げすぎないようにします。label は sr-only で残しておくと、見た目をすっきりさせたまま読み上げにも対応できます。

完成した画面が欲しいときは、リキッドガラス・ログイン をコピーするか(Free Sample。無料アカウントで回数制限なし。カタログ全体は30日ビルドパス $19 の1回払い、Lifetime $79 の1回払い、Plus は月額 $9)、3つの作り方の比較 を読んでください。

tsx
// components/GlassLogin.tsx
  export function GlassLogin() {
    return (
      <form className="w-full max-w-sm space-y-4 rounded-[2rem] border border-white/25 bg-zinc-900/70 p-8 text-white shadow-[inset_0_1px_0_rgba(255,255,255,0.4)] supports-[backdrop-filter]:bg-white/10 supports-[backdrop-filter]:backdrop-blur-2xl">
        <h1 className="text-center text-2xl font-semibold">ログイン</h1>

        <label htmlFor="user" className="sr-only">ユーザー名</label>
        <input
          id="user"
          name="user"
          autoComplete="username"
          placeholder="ユーザー名"
          className="w-full rounded-full border border-white/20 bg-white/15 px-5 py-3 text-sm placeholder:text-white/70 outline-none focus:border-white/60"
        />

        <label htmlFor="password" className="sr-only">パスワード</label>
        <input
          id="password"
          name="password"
          type="password"
          autoComplete="current-password"
          placeholder="パスワード"
          className="w-full rounded-full border border-white/20 bg-white/15 px-5 py-3 text-sm placeholder:text-white/70 outline-none focus:border-white/60"
        />

        <button
          type="submit"
          className="w-full rounded-full bg-white py-3 text-sm font-medium text-zinc-900 transition hover:bg-white/90"
        >
          ログイン
        </button>
      </form>
    );
  }

スクロールですりガラスになるヘッダーを作る

ページを開いたときはヘッダーを透明にしてヒーローを見せ、少し下にスクロールしたらガラスの背景を付ける形もよく使われます。ガラスの面積が細い帯だけなので、全ページに使っても重くなりにくい使い方です。

tsx
// components/GlassHeader.tsx
  "use client";

  import { useEffect, useState } from "react";

  export function GlassHeader() {
    const [scrolled, setScrolled] = useState(false);

    useEffect(() => {
      const onScroll = () => setScrolled(window.scrollY > 24);
      onScroll();
      window.addEventListener("scroll", onScroll, { passive: true });
      return () => window.removeEventListener("scroll", onScroll);
    }, []);

    return (
      <header
        className={
          "fixed inset-x-0 top-0 z-50 transition-colors duration-300 " +
          (scrolled
            ? "border-b border-white/10 bg-zinc-950/80 supports-[backdrop-filter]:bg-zinc-950/40 supports-[backdrop-filter]:backdrop-blur-md"
            : "bg-transparent")
        }
      >
        <nav className="mx-auto flex h-16 max-w-6xl items-center justify-between px-6 text-white">
          <a href="/" className="font-semibold">Brand</a>
          <a href="#contact" className="text-sm">お問い合わせ</a>
        </nav>
      </header>
    );
  }

ガラスのヘッダーをさらに作り込むなら

左右に余白を取って浮かせた pill 型のヘッダーや、下にスクロールすると隠れるヘッダーは、ヘッダーの記事で詳しく解説しています。https://design-layer.com/ja/articles/nextjs-modern-header-guide

完成したグラスモーフィズムのセクションをコピーして使う

DesignLayer の「リキッドガラス・ログイン」の詳細ページ。左でライブプレビューを確かめ、右の「Cursor 用にコピー」でソースをコピーできる
DesignLayer の「リキッドガラス・ログイン」の詳細ページ。左でライブプレビューを確かめ、右の「Cursor 用にコピー」でソースをコピーできる

ここまでのコードで、読みやすいガラスの UI は作れます。ただ、次の点まで揃えると、クラスを足すだけでは届かない調整が続きます。

  • 背景写真の選び方

  • ぼかしの強さ

  • 文字の色

  • ホバーの反応

DesignLayer には、風景写真の上にリキッドガラスのカードを置いた「リキッドガラス・ログイン」があります。壁紙の上にガラスの縦型ナビを置いた「ガラスサイドバーナビ」などもあります。

ブラウザでライブプレビューを確認し、背景写真と文言を差し替えて使えます。https://design-layer.com/ja/components

ライブプレビューは無制限です。無料サンプル10個を無料アカウントで回数制限なくコピーでき、動画プロンプトは月1回です。Free では MCP に接続できません。カタログ全体は30日ビルドパス($19の1回払い、自動更新なし)、Lifetime Access(先着100名の$79の1回払い)、Plus(月額 $9、いつでも解約可)です。

ガラスは1画面に1か所を目安にし、全ページに複製しないようにしてください。

グラスモーフィズムについてよくある質問

  • Safari 17 以前は、-webkit- の付いた -webkit-backdrop-filter にしか対応していません。

    Tailwind v3.4.5 以降の backdrop-blur は、-webkit- 付きも自動で出力します。効かない場合は、まず Tailwind を更新してください。

    この記事のように supports-[backdrop-filter]: で囲んだ場合、Safari 17 以前では不透明に近いフォールバックが表示されます。

    効かない環境のために、不透明に近い背景のフォールバックも用意しておきます。

まとめ:Next.js でグラスモーフィズムを作る手順

  • グラスモーフィズムは、写真やグラデーションの上にガラスの面を1枚だけ置く

  • 出発点は、半透明の背景・背景のぼかし・細く明るい枠線の3つ。文字のコントラストは 4.5:1 以上を確保する

  • ぼかしに対応していないブラウザには、不透明に近い背景を出す

  • Liquid Glass風は、大きな角丸と縁の明るい線で立体感を足す

  • ログインカードやスクロール後のヘッダーのように、面積の小さい場所で使う

ヒーローの作り方は https://design-layer.com/ja/articles/nextjs-animated-hero-section-guide で解説しています。

ホバーで反応するカードは https://design-layer.com/ja/articles/nextjs-hover-card-guide にまとめています。

仕上がったガラスのセクションから始めたい場合は、カタログで見比べてください。https://design-layer.com/ja/components

関連ガイド