WebberUI

Liquid Metal

反光液態鉻/金屬流動表面,以 2D canvas 即時繪製,含鏡面條紋與可選滑鼠漣漪。

用域扭曲的多層正弦場模擬流動的液態金屬,映到三段色階並疊上銳化的鏡面亮帶,繪製在低解析緩衝上再由 CSS 平滑放大。

載入預覽⋯

Playground

即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。

1
3
0.6
3
<LiquidMetal />

安裝

npx shadcn@latest add https://webberui.com/r/liquid-metal.json

或在 components.json 設定 registries 後,改用 @webberui/liquid-metal 安裝。

安裝依賴後,打開 liquid-metal.json,把 files[0].content 的內容複製到你的 components/ui/liquid-metal.tsx

npm install motion clsx tailwind-merge

使用

前景內容放進 children,佈局(如置中、高度)寫在 className 上:

import { LiquidMetal } from "@/components/ui/liquid-metal";

<LiquidMetal className="flex h-[400px] items-center justify-center rounded-2xl">
  <h1 className="text-4xl font-bold text-white mix-blend-difference">
    Chrome
  </h1>
</LiquidMetal>

自訂色階、開啟滑鼠漣漪並調快流速:

<LiquidMetal
  colors={["#1a1005", "#b45309", "#fef3c7"]}
  specular="#fffbeb"
  interactive
  speed={1.4}
  distortion={0.8}
  className="flex h-[320px] items-center justify-center rounded-2xl"
>
  <p className="text-lg text-white mix-blend-difference">熔金</p>
</LiquidMetal>

Props

Prop型別預設值說明
colors[string, string, string]鉻銀配色三段金屬色階:[陰影, 中間調, 高光]
specularstring"#f8fafc"鏡面反射亮帶的顏色
speednumber1流動速度倍率
scalenumber3空間頻率,越大表面紋理越密
distortionnumber0.6域扭曲強度,越大液態感越強
reflectionsnumber3鏡面亮帶密度
interactivebooleanfalse滑鼠在表面拖出漣漪(觸控不作用)
resolutionnumber192內部繪製緩衝寬度,越小越省效能
childrenReact.ReactNode前景內容,疊在金屬表面之上
classNamestring附加到最外層容器的 class

細節

  • 低解析緩衝 + CSS 放大。 逐像素運算跑在固定寬度(預設 192)的離散緩衝上,putImageData 後由 CSS 把 canvas 拉伸填滿容器,瀏覽器的雙線性內插自然把像素抹成平滑的液態表面,成本與容器實際大小無關
  • 表面由三層正弦疊加成連續場,座標本身再被正弦推移(域扭曲),形成錯位流動;鏡面條紋是對場值取高頻正弦後 pow4 銳化的亮帶,疊在三段色階之上做出鉻的反射
  • 緩衝長寬比透過 ResizeObserver 跟著容器調整,避免金屬紋理被拉伸變形;離開時 cancelAnimationFramedisconnect 一併清理
  • 會變動的 props 存進 ref,動畫迴圈每幀讀最新值,改參數不必重啟 requestAnimationFrame
  • interactive 開啟時,游標位置正規化為 0~1,在該點注入環狀漣漪並隨距離高斯衰減;只在 pointerType === "mouse" 時作用,離開後漣漪淡出
  • 使用者系統開啟「減少動態效果」時,只繪製單一靜態金屬表面,不啟動動畫迴圈

On this page