WebberUI

滾動變形斑點

隨滾動進度在多個有機形狀間變形的漸層斑點。

useScroll 追蹤滾動進度,透過 useTransform 在多組結構一致的 SVG 路徑之間插值,斑點會如液體般在有機形狀間變形,同時交叉淡化多層漸層完成轉色,適合作為長頁面或滾動敘事的裝飾背景。

載入預覽⋯

Playground

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

280
60
<ScrollMorphBlob />

安裝

npx shadcn@latest add https://webberui.com/r/scroll-morph-blob.json

或在 components.json 設定 registries 後,改用 @webberui/scroll-morph-blob 安裝。

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

npm install motion clsx tailwind-merge

使用

import * as React from "react";
import { ScrollMorphBlob } from "@/components/ui/scroll-morph-blob";

function ScrollStory() {
  const containerRef = React.useRef<HTMLDivElement>(null);

  return (
    <div ref={containerRef} className="relative h-[400px] overflow-y-auto">
      <div className="pointer-events-none sticky top-0 flex h-[400px] items-center justify-center">
        <ScrollMorphBlob containerRef={containerRef} size={240} />
      </div>
      <div className="relative -mt-[400px]">{/* 滾動內容分段… */}</div>
    </div>
  );
}

未提供 containerRef 時,斑點會改為追蹤整頁(viewport)的滾動進度。

Props

Prop型別預設值說明
containerRefReact.RefObject<HTMLElement | null>滾動容器的 ref;未提供時追蹤整頁滾動進度
pathsstring[]內建 4 組blob 路徑序列(至少 2 組,SVG 指令結構必須一致才能插值)
colorsArray<[string, string]>內建 4 組每個形狀階段的漸層雙色,數量不足時循環使用
sizenumber280斑點邊長(px),SVG 以 200×200 viewBox 等比縮放
rotatenumber60捲動全程的累積旋轉角度(度),設 0 停用旋轉
glowbooleantrue是否在斑點後方疊加高斯模糊光暈
classNamestring透傳到外層容器

可及性

  • 斑點為純裝飾元素,外層容器標記 aria-hidden,輔助科技會完全略過
  • 使用者系統開啟「減少動態效果」時,改為渲染第一組形狀與漸層的靜態斑點,不做變形、旋轉或縮放
  • 動畫完全由滾動進度驅動,沒有自動播放的動態,畫面變化與使用者輸入同步
  • pointer-events-none 確保斑點不會攔截點擊或滾動操作

On this page