我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我

我一直在给站点找“更现代”的气质,但总差了点意思。直到最近看到 Apple 的 Liquid Glass 设计体系,才真正被点燃了——原来那种清透、柔和、带一点“高级感”的界面,可以纯 CSS复刻出来。

今天就一起动手,把常见的 Glassmorphism(毛玻璃) 效果落到实处:半透明、背景虚化、带层次的“玻璃板”,既通透又不刺眼。


什么是 Glassmorphism?

一句话:半透明 + 背景虚化 + 微妙的景深,模拟磨砂玻璃的观感。

它好看的原因通常来自四点——为了易读,我按要点拆开:

  • 透明度(Transparency):轻微不透明(如 0.08~0.15),让底层背景若隐若现。

  • 模糊(Blur)backdrop-filter: blur(...) 对“玻璃板后面的内容”做虚化,霎时间就有了霜感。

  • 层次(Depth):柔和的 box-shadow 提升悬浮感与分层关系。

  • 鲜活底色(Vibrant Base):渐变或彩色底图能把“玻璃”的边缘与光影衬托出来。

背景要先铺好(越大胆越出片)

这一类设计离不开漂亮的背景——否则“玻璃”就像贴在纯白纸上,效果打了折扣。因此,先准备一个“能透出感觉”的底:

  • 纯色:比如高饱和紫色 #6200EA,简单直接;

  • 渐变:如 linear-gradient(135deg, #F6D365, #FDA085),流动更强;

  • 图片/纹理:低噪点、低对比的纹理图,既丰富又不抢戏。

关键 CSS 配方(最小可用解)

下面这份就是“毛玻璃基底方子”。先用它稳稳落地,再按需微调即可:

.glass-element {
  background: rgba(255, 255, 255, 0.1);
  backdrop-filter: blur(10px);
  border: 1px solid rgba(255, 255, 255, 0.2);
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
  border-radius: 16px;
}

为什么这么写?

  • background:半透明白,给“玻璃体”一点雾。

  • backdrop-filter: blur(10px):对背后内容做模糊,霜化感立刻到位。

  • border:极淡的白色描边,勾勒玻璃的“边”。

  • box-shadow:从背景“抬”起来,层级更清晰。

与此同时,数值别贪大:过强的 blur 或阴影,既影响性能,也容易显脏。10~12px 的模糊、多数场景够用。


跨浏览器兼容(优雅降级)

并非所有环境都支持 backdrop-filter。因此,先给一个“可用的退路”,再按支持情况增强:

.glass-element {
  background: rgba(255, 255, 255, 0.3); /* Fallback:没有 blur 时更厚一点 */
}

@supports (backdrop-filter: blur(10px)) {
  .glass-element {
    background: rgba(255, 255, 255, 0.1);
    backdrop-filter: blur(10px);
  }
}

提示:在 WebKit 系(如 Safari)下,通常还需同时加上 -webkit-backdrop-filter 以确保一致性。


真实场景怎么用?

  • 导航条:半透明导航与背景联动,既轻又不失层次;

  • Hero/主视觉:把 CTA 按钮做成毛玻璃,视觉“高级味”更足;

  • 信息卡片:概览数据、个人卡、商品卡都很适配;

  • 蒙层/弹窗:既聚焦内容,又不把背景“封死”。


Demo:把“玻璃仪表盘”搭起来

下面这段完整页面示例,包含背景渐变 + 多个玻璃卡片 + 悬浮反馈 + 进度条/统计,复制即跑:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Three-Column Grid With Subgrid</title>
    <style>
      body {
        font-family: "Arial", sans-serif;
        background: radial-gradient(
            circle at 20% 80%,
            #120078 0%,
            transparent 50%
          ),
          radial-gradient(circle at 80% 20%, #4c1d95 0%, transparent 50%),
          radial-gradient(circle at 40% 40%, #1e40af 0%, transparent 50%),
          linear-gradient(135deg, #0f0f23, #1a1a2e);
        min-height: 100vh;
        display: flex;
        justify-content: center;
        align-items: center;
        padding: 2rem;
      }

      .dashboard-container {
        display: grid;
        grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
        gap: 2rem;
        max-width: 1000px;
        width: 100%;
      }

      .glass-widget {
        background: rgba(255, 255, 255, 0.08);
        backdrop-filter: blur(12px);
        -webkit-backdrop-filter: blur(12px);
        border-radius: 20px;
        padding: 2rem;
        border: 1px solid rgba(255, 255, 255, 0.15);
        box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.3);
        color: white;
        transition: all 0.3s ease;
        position: relative;
        overflow: hidden;
      }

      .glass-widget::before {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        height: 1px;
        background: linear-gradient(
          90deg,
          transparent,
          rgba(255, 255, 255, 0.3),
          transparent
        );
      }

      .glass-widget:hover {
        transform: translateY(-8px);
        box-shadow: 0 20px 40px 0 rgba(0, 0, 0, 0.4);
        background: rgba(255, 255, 255, 0.12);
      }

      .widget-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 1.5rem;
      }

      .widget-title {
        font-size: 1.2rem;
        font-weight: 600;
        opacity: 0.9;
      }

      .widget-icon {
        width: 40px;
        height: 40px;
        background: rgba(255, 255, 255, 0.15);
        border-radius: 10px;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 1.2rem;
      }

      .widget-value {
        font-size: 2.5rem;
        font-weight: 700;
        margin-bottom: 0.5rem;
        background: linear-gradient(135deg, #ffffff, #a3a3a3);
        -webkit-background-clip: text;
        -webkit-text-fill-color: transparent;
        background-clip: text;
      }

      .widget-description {
        opacity: 0.7;
        font-size: 0.9rem;
        line-height: 1.4;
      }

      .progress-bar {
        width: 100%;
        height: 6px;
        background: rgba(255, 255, 255, 0.1);
        border-radius: 3px;
        margin-top: 1rem;
        overflow: hidden;
      }

      .progress-fill {
        height: 100%;
        background: linear-gradient(90deg, #4ade80, #22d3ee);
        border-radius: 3px;
        animation: progressAnimation 2s ease-out;
      }

      @keyframes progressAnimation {
        from {
          width: 0%;
        }
      }

      .stats-grid {
        display: grid;
        grid-template-columns: 1fr 1fr;
        gap: 1rem;
        margin-top: 1rem;
      }

      .stat-item {
        text-align: center;
        padding: 1rem;
        background: rgba(255, 255, 255, 0.05);
        border-radius: 10px;
        border: 1px solid rgba(255, 255, 255, 0.1);
      }

      .stat-number {
        font-size: 1.5rem;
        font-weight: 600;
        margin-bottom: 0.25rem;
      }

      .stat-label {
        font-size: 0.8rem;
        opacity: 0.7;
      }
    </style>
  </head>
  <body>
    <div class="dashboard-container">
      <div class="glass-widget">
        <div class="widget-header">
          <div class="widget-title">Revenue</div>
          <div class="widget-icon">💰</div>
        </div>
        <div class="widget-value">$45,280</div>
        <div class="widget-description">
          Monthly revenue increased by 12% compared to last month
        </div>
        <div class="progress-bar">
          <div class="progress-fill" style="width: 75%"></div>
        </div>
      </div>

      <div class="glass-widget">
        <div class="widget-header">
          <div class="widget-title">Active Users</div>
          <div class="widget-icon">👥</div>
        </div>
        <div class="widget-value">2,847</div>
        <div class="widget-description">
          Users currently online and engaging with your platform
        </div>
        <div class="progress-bar">
          <div class="progress-fill" style="width: 68%"></div>
        </div>
      </div>

      <div class="glass-widget">
        <div class="widget-header">
          <div class="widget-title">Performance</div>
          <div class="widget-icon">📊</div>
        </div>
        <div class="stats-grid">
          <div class="stat-item">
            <div class="stat-number">98.5%</div>
            <div class="stat-label">Uptime</div>
          </div>
          <div class="stat-item">
            <div class="stat-number">1.2s</div>
            <div class="stat-label">Load Time</div>
          </div>
          <div class="stat-item">
            <div class="stat-number">156</div>
            <div class="stat-label">Requests/min</div>
          </div>
          <div class="stat-item">
            <div class="stat-number">99.9%</div>
            <div class="stat-label">Success Rate</div>
          </div>
        </div>
      </div>

      <div class="glass-widget">
        <div class="widget-header">
          <div class="widget-title">Storage</div>
          <div class="widget-icon">💾</div>
        </div>
        <div class="widget-value">127 GB</div>
        <div class="widget-description">
          Total storage used across all your projects and assets
        </div>
        <div class="progress-bar">
          <div class="progress-fill" style="width: 42%"></div>
        </div>
      </div>
    </div>
  </body>
</html>

性能优化三招(别被 blur 拖垮)

**毛玻璃好看,但模糊是“重活”。**为了避免掉帧或发热,建议:

  1. 控制模糊半径blur(6~10px) 多数足够;越大越吃 GPU。

  2. 减少层数与重叠面积:同屏“玻璃板”别铺太满,能合并就合并。

  3. 优先测手机:低端设备更敏感,真机跑一遍,观察滚动与动画是否顺滑。


小结

换个角度讲,Glassmorphism 就像给界面“蒙上了一层会呼吸的玻璃”。只要背景够有戏、透明与模糊拿捏得当、阴影不过火,你就能在网页里重现 Apple 式的那种清透与高级

谨慎使用在关键部位(导航、按钮、卡片、弹窗),既提气质,又不喧宾夺主。试试把本文的 Demo 拆到你的项目里,然后按品牌配色微调,你会很快收获“现代感”的正反馈。

前端AI·探索:涵盖动效、React Hooks、Vue 技巧、LLM 应用、Python 脚本等专栏,案例驱动实战学习,点击二维码了解更多详情。

图片

最后:

深入React:从基础到最佳实践完整攻略

python 技巧精讲

React Hook 深入浅出

CSS技巧与案例详解

vue2与vue3技巧合集

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐