WebberUI

Scroll Text Highlight

文字隨滾動進度逐字(或逐詞)由淡灰轉為前景實色的閱讀高亮。

載入預覽⋯

Playground

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

<ScrollTextHighlight />

安裝

npx shadcn@latest add https://webberui.com/r/scroll-text-highlight.json

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

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

npm install motion clsx tailwind-merge

使用

放在巢狀捲動容器內時,把容器的 ref 傳給 container

import * as React from "react";
import { ScrollTextHighlight } from "@/components/ui/scroll-text-highlight";

export function Example() {
  const scrollerRef = React.useRef<HTMLDivElement>(null);

  return (
    <div ref={scrollerRef} className="h-[300px] overflow-y-auto">
      <div className="py-40">
        <ScrollTextHighlight
          container={scrollerRef}
          text="隨著滾動逐字點亮的文字。"
          className="text-xl font-semibold"
        />
      </div>
    </div>
  );
}

以整個視窗為捲動容器時,可省略 container

<ScrollTextHighlight
  by="word"
  text="Scroll to reveal."
  className="text-4xl font-bold"
/>

Props

Prop型別預設值說明
textstring要隨滾動高亮的文字
by"char" | "word""char"高亮的最小單位
containerRefObject<HTMLElement>巢狀捲動容器的 ref;省略則以視窗為捲動容器
classNamestring附加樣式(建議在此設定字級與字色)

細節

  • useScroll({ target, container, offset: ["start end", "end start"] }) 取得目標文字在容器內從進入底部到離開頂部的捲動進度 scrollYProgress
  • 每個字(或詞)依索引分配到 [start, end] 的子區間,透過 useTransform 把進度映射成 opacity,逐一由淡灰轉為前景實色
  • 逐字模式以字素(grapheme)切割,emoji 與組合字不會被拆壞
  • 文字沿用 currentColor(前景色),淡出時自然呈現淺灰;請透過 className 指定字級與字色

可及性

  • 完整文字以 sr-only 呈現供輔助科技朗讀,逐字動畫層標記 aria-hidden,不會被重複朗讀
  • 使用者系統開啟「減少動態效果」時,直接渲染全部前景實色的靜態文字

On this page