SCHEME D / apple-liquid-glass

琉璃 液态玻璃

不是「半透明 + 模糊」这么简单。每个控件的本质是四层叠加:壁纸层 → 材质层(背滤模糊 + 染色)→ 折光层(1px 渐变描边 + 边缘透镜)→ 高光层(顶部镜面反射),内容浮在最上面。缺任何一层,玻璃就会退回成「灰色半透明块」。

强调#0A84FF
模糊28px
饱和180%
染色rgba(255,255,255,.12)
圆角28 / 20 / 14
01

分层模型 Layer Anatomy

你听到的「一个控件一个图层」是简化说法:真正要做的是每控件 4 个子层。前两层决定「像不像玻璃」,后两层决定「贵不贵气」。

L0 壁纸

玻璃背后的内容没有内容的玻璃只是灰块。壁纸必须够彩色、够有明暗。

+ L1 材质

背滤模糊 + 染色blur(28px) saturate(180%),染色 rgba(255,255,255,.12)。

+ L2 折光

1px 受光边 + 内辉光左上亮、右下弱,模拟玻璃厚度与边缘受光。

+ L3 高光

顶部镜面反射一道 screen 混合的白光带,出 Apple 那种湿润反光。

L1 only · 灰玻璃
只有材质层
L1 + L2 + L3 · 琉璃
四层齐全 · 有厚度
02

材质令牌 Tokens

玻璃的三个参数就能决定观感:模糊半径、饱和度提升、染色浓度。Apple 的取向是「重模糊 + 高饱和 + 低染色」——让背后的颜色透上来,但形状被揉开。

🌙暗调(默认)
blur 28饱和 180% · 染色 .12 · 边 .72
☀️亮调(浅色壁纸)
blur 24饱和 200% · 染色 .55 · 边 .95
◎正文
rgba(255,255,255,.96)暗调 · 亮调用 #0B1020
◆强调
#0A84FF亮调 #007AFF
/* 琉璃 · 玻璃原语(4 层) */
.glass{
  position:relative; isolation:isolate;
  background:rgba(255,255,255,.12);                     /* L1 材质染色 */
  -webkit-backdrop-filter:blur(28px) saturate(180%);
  backdrop-filter:blur(28px) saturate(180%);
  border-radius:28px;
  box-shadow:0 18px 48px -18px rgba(0,0,0,.55),
             inset 0 1px 0 rgba(255,255,255,.28);       /* L2 内辉光 */
}
/* L2 折光:只留 1px 边框的渐变描边 */
.glass::before{
  content:""; position:absolute; inset:0; border-radius:inherit; padding:1px;
  background:linear-gradient(140deg,
    rgba(255,255,255,.72), rgba(255,255,255,.10) 34%,
    rgba(255,255,255,.10) 66%, rgba(255,255,255,.28));
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite:xor; mask-composite:exclude;
}
/* L3 高光:顶部镜面反射带 */
.glass::after{
  content:""; position:absolute; inset:0; border-radius:inherit; pointer-events:none;
  background:linear-gradient(180deg,
    rgba(255,255,255,.45), rgba(255,255,255,.06) 24%, transparent 52%);
  opacity:.5; mix-blend-mode:screen;
}
03

组件 Components

所有控件都复用 .glass 的 4 层,只改圆角、染色浓度与内容排布。

68%
✦客厅主灯
62%4 盏 · 暖白
❄卧室空调
24°C待机
◍Wi-Fi
Home-5G已连接
♪正在播放
WeightlessMarconi Union
04

边缘折光 Refraction

L2 折光层 · 渐变描边 + 内辉光(默认方案,零成本、可全站使用);需要真实折射时,额外复制一层背景做 SVG 位移 —— 注意 filter:url() 只作用于元素自身,不做背滤,所以要先把背景复制进玻璃里再位移,仅建议用于大面积面板。

<!-- 折射滤镜:用噪声当位移图,把玻璃后方的像素推开 -->
<svg width="0" height="0">
  <filter id="lg-refract" x="-15%" y="-15%" width="130%" height="130%">
    <feTurbulence type="fractalNoise" baseFrequency="0.012 0.02"
                  numOctaves="2" seed="9" result="noise"/>
    <feGaussianBlur in="noise" stdDeviation="1.2" result="soft"/>
    <feDisplacementMap in="SourceGraphic" in2="soft" scale="18"
                       xChannelSelector="R" yChannelSelector="G"/>
  </filter>
</svg>
/* 用法:在玻璃内部复制一层背景,再对它位移 —— filter 不会折射 backdrop */
.pane{ overflow:hidden; }
.pane .bend{
  position:absolute; inset:-24px;
  background: /* 与背后一致的渐变/图片 */;
  filter:url(#lg-refract);
  opacity:.5; mix-blend-mode:screen;
}
05

布局模式 Patterns

A · 悬浮控制台:全屏壁纸 + 单列玻璃栈(顶部胶囊导航、中部数据卡、底部操作条),玻璃之间留 16px 让壁纸从缝隙透出来。B · 侧栏 + 内容浮层:左侧玻璃侧栏(饱和度 −20% 更沉),右侧内容区用大玻璃面板承载。

9:41◍ ⏻ ▮

控制中心

◍Wi-Fi
Home-5G
♪音乐
播放中
✦灯光
62%
❄空调
24°C
亮度68%
音量44%
06

规则 Rules

该做 / DO

  • 每块玻璃背后必须有内容(壁纸 / 图形),否则它只是灰块。
  • 模糊 20–32px、饱和 160%–200%、染色 ≤ .20,是稳定区间。
  • 受光边只做左上 1px,右下弱化,光源仍是一个方向。
  • 文字层 z-index 提到最上,必要时给标题加 0 1px 深色投影。
  • 相邻玻璃留 12–16px 间隙,禁止大面积重叠嵌套。

不该做 / DON'T

  • 不要在玻璃上再叠玻璃三层以上(背滤层层叠加会糊成牛奶)。
  • 不要用纯白 rgba(255,255,255,.9) 染色,直接变成不透明卡片。
  • 不要给正文用低于 .7 透明度的白字,壁纸亮处会读不出。
  • 不要对列表每一项都上 backdrop-filter(每项一个背滤层,必掉帧)。
  • 不要忘了 -webkit-backdrop-filter,Safari 上会直接不生效。