WebberUI

Grain Overlay

canvas 逐幀閃爍的噪點顆粒疊層,提供 fine/coarse/vintage 三款質感,替漸層與圖片補上底片般的雜訊。

載入預覽⋯

Playground

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

0.22
1
0.55
24
<GrainOverlay />

安裝

npx shadcn@latest add https://webberui.com/r/grain-overlay.json

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

安裝依賴後,從 registry JSON(/r/grain-overlay.jsonfiles[0].content)複製 grain-overlay.tsx 原始碼到你的 components/ui/ 目錄:

npm install motion clsx tailwind-merge

使用

GrainOverlay 是一層絕對定位的疊層,放進任何 relative 容器即可覆蓋整塊背景。若容器加上 isolate,混合模式只會作用於容器內部、不透到頁面背後。

import { GrainOverlay } from "@/components/ui/grain-overlay";

<div className="relative isolate overflow-hidden rounded-xl bg-gradient-to-br from-indigo-500 to-pink-500">
  <GrainOverlay variant="coarse" />
  {/* 你的內容 */}
</div>

Props

Prop型別預設值說明
variant"fine" | "coarse" | "vintage""fine"顆粒質感預設,未覆蓋的參數沿用此款
intensitynumber依 variant疊層整體不透明度(0–1)
grainSizenumber依 variant單顆顆粒邊長(CSS px,整數)
contrastnumber依 variant噪點對比(0–1),每顆亮暗的振幅
blendModeGrainBlendMode依 variant混合模式(overlay/soft-light 等)
fpsnumber依 variant閃爍更新頻率(1–60)
animatedbooleantrue是否逐幀閃爍;false 時為靜態單張
frameCountnumber8預先產生並循環的噪點張數(1–24)

三款 variant 的預設值:fine(grainSize 1、細緻低調)、coarse(grainSize 3、對比高、粗獷)、vintage(soft-light 柔光、慢速閃爍,仿老膠卷)。任一數值 prop 顯式傳入時即覆蓋該款預設。

細節

  • 噪點以 canvas 逐幀繪製:預先產生 frameCount 張獨立的低解析灰階雜訊,每幀依 fps 節流隨機挑一張放大填滿,形成真實的底片閃爍。
  • 顆粒亮度以中灰(128)為中心、contrast 決定振幅;搭配 overlay 混合模式時,中灰不改變底色,只疊加明暗顆粒。
  • grainSize 以 CSS 像素計,透過關閉影像平滑(方塊放大)維持顆粒銳利,並在高 DPR 螢幕上保持一致的顆粒大小。
  • 調整 intensityblendMode 屬純樣式變更,不會重建噪點;grainSizecontrastfps 等改動才會重新產生張數。
  • ResizeObserver 監看容器尺寸,重建噪點採去抖處理;rAF、計時器與 Observer 於卸載時全數清理。

可及性

  • 疊層帶 aria-hiddenpointer-events-none,純裝飾、不干擾輔助科技與底層互動。
  • 使用者系統開啟「減少動態效果」時,自動停止逐幀閃爍、改渲染單張靜態噪點。

On this page