Skip to content

Glass 毛玻璃

液态 / 磨砂玻璃表面。<r-glass> 会对它背后的内容做磨砂与折射——backdrop-filter 的模糊 + 提饱和做磨砂,SVG feDisplacementMap 做液态光线弯折,再加镜面亮边与高光形成"玻璃感"。所有视觉参数都可通过属性与 token 调节,内容放默认插槽。

何时使用:需要在丰富内容之上叠一层高级的半透明面板时——hero 卡片、悬浮工具条、媒体浮层。displace 控制"液态"程度(0 为纯磨砂平面)。在不支持 backdrop-filter 的环境会优雅降级为普通半透明面。

演练场

拖动舞台里的玻璃、调节每个旋钮、复制对应代码。默认参数就是 iOS 磨砂材质的观感。

<r-glass displace="8">
  <div class="panel">…</div>
</r-glass>
html
<r-glass displace="8">
  <div class="panel">…</div>
</r-glass>

<r-glass> 放在彩色或复杂的内容之上——在纯色背景上看不出效果。

嵌套

<r-glass> 可组合:一层套一层做出叠加材质(比如玻璃面板上再放一个玻璃工具条),每一层都会折射它背后的内容。

外层面板
嵌套的玻璃工具条
html
<r-glass radius="26">
  <div class="panel">
    外层面板
    <r-glass radius="16" displace="6">
      <div class="toolbar">嵌套的玻璃工具条</div>
    </r-glass>
  </div>
</r-glass>

API 参考

属性

属性类型默认值说明
blurnumber16背景模糊半径(px),即磨砂程度。
saturatenumber180背景饱和度百分比,提升玻璃后内容的色彩(vibrancy)。
displacenumber8液态折射强度(SVG 位移 scale)。0 为纯磨砂平面,越大越"波浪"。
frequencynumber0.005湍流基频,越小则涟漪越大越平滑。
radiusnumber20圆角半径(px)。
tintstring淡白玻璃填充色,任意 CSS 背景值。
sheenbooleanfalse表面流动的镜面高光动画。
interactivebooleanfalsehover 抬升 + 按下回弹反馈,用于可点击的玻璃。同时让 host 变成可键盘操作的按钮——role="button"、可 tab 到、Enter/Space 等同点击。
rimbooleanfalse可选开启的镜面边缘 + 色散描边,观感更"有光"。优先 WebGL(始终同步可用),后台悄悄升级到 WebGPU(若可用)。两者都不可用时降级为普通 CSS 镜面渐变。

折射 displace

displace 驱动 SVG feDisplacementMap 的 scale —— 光线穿过表面时被弯折的强度。设为 0 即为纯磨砂平面。

displace = 0
displace = 60
html
<r-glass displace="0">…纯磨砂…</r-glass> <r-glass displace="60">…液态…</r-glass>

流光与交互

sheen 会添加一道流动的镜面高光;interactive 会添加 hover 抬升与富有弹性的按下反馈(使用共享的 --ran-motion-ease-spring 令牌)。

悬停或按下试试
html
<r-glass sheen interactive displace="36">
  <div>Hover &amp; press me</div>
</r-glass>

Rim —— GPU 镜面边缘(可选开启)

rim 加一层镜面高光:固定从左上方打光的镜面边缘,加上圆角边框处一圈细微的色散(RGB 分离)描边。跟 displace 的折射不同,它完全不采样背景——着色器只知道面板自身的宽高和圆角半径,所以不会有"整体截取背景做折射"那种方案的交互性/可访问性代价(见下方说明)。它只是叠加在同一个 backdrop-filter 磨砂效果之上的纯装饰层,开关它不会改变玻璃背后采样的内容或方式。

优先用 WebGL 渲染——同步创建、几乎所有浏览器都支持,所以 rim 自己的首次出现不会被拖慢——如果浏览器同时支持 WebGPU,会在后台悄悄升级过去(效果完全一样,像素级一致)。两种 GPU API 都不可用时(很老的浏览器、被禁用、SSR)会静默降级为普通的 CSS 镜面渐变——不存在"坏掉"的中间状态。

无 rim
rim
html
<r-glass>…普通 CSS 镜面高光…</r-glass> <r-glass rim>…GPU 镜面边缘 + 色散描边(WebGL,可升级到 WebGPU)…</r-glass>

CSS parts 与 token

::part(glass)::part(specular)、以及(开启 rim 时的)::part(rim) 或覆盖 --ran-glass-* 自定义属性来定制内部:

Token作用
--ran-glass-blur背景模糊半径。
--ran-glass-saturate背景饱和度。
--ran-glass-radius圆角半径。
--ran-glass-tint填充背景。
--ran-glass-border亮边。
--ran-glass-shadow阴影(高光 + 景深)。
--ran-glass-specular-background镜面高光背景。
--ran-glass-specular-opacity镜面高光强度。
--ran-glass-reduced-transparency-background系统"降低透明度"开启时的兜底背景。
--ran-glass-reduced-transparency-shadow同一状态下的兜底阴影。

说明

  • 背景采样<r-glass> 通过 backdrop-filter 折射它背后的 DOM,因此背后可选中的文字、正在播放的视频、可交互元素都照常可用。上面的 rim 是一个只根据面板自身形状计算的纯装饰 GPU 层,不采样背景。
  • 可读性:正文请放在不透明的内层面上,不要只靠玻璃扛对比度。
  • 降低透明度<r-glass> 响应系统级"降低透明度 / 提高对比度"设置(prefers-reduced-transparency: reduce):会切换成一个不透明、跟随主题的实色面(默认 --ran-color-bg-elevated),而不是继续磨砂/折射。系统原生控件是自动适配的,这是自定义元素对等的实现。
  • 跨浏览器折射差异feDisplacementMap 液态效果目前只在 Chromium 内核渲染,Safari/Firefox 会丢弃 backdrop-filter 里这一段、保留模糊/饱和度/亮度的磨砂效果——这是合理的(虽然更平的)降级,不是坏掉了。
  • 动效纪律:表面只过渡 transform(绝不过渡颜色),所以明暗主题切换始终一帧完成;流光与按下都遵循 prefers-reduced-motion

Released under the MIT License.