WebberUI

Era Strata Layout

把年代/階段疊成水平地層帶的手風琴式版面,展開層垂直撐開、其餘壓縮,層內內容帶視差浮出。

載入預覽⋯

Playground

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

440
72
<EraStrataLayout />

安裝

npx shadcn@latest add https://webberui.com/r/era-strata-layout.json

或在 components.json 設定 registries 後,改用 @webberui/era-strata-layout 安裝。

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

npm install motion lucide-react clsx tailwind-merge

使用

import {
  EraStrataLayout,
  type EraStratumData,
} from "@/components/ui/era-strata-layout";

const eras: EraStratumData[] = [
  {
    id: "1998",
    era: "1998",
    title: "車庫創業",
    summary: "三個人、一台伺服器。",
    content: "第一個版本在深夜上線。",
    accentClassName: "bg-amber-400 dark:bg-amber-500",
  },
  // ...
];

<EraStrataLayout items={eras} height={440} defaultActive={0} />;

trigger 可切換觸發方式:click(預設)、hover 懸停展開,或 scroll 隨頁面捲動逐層推進。

// 隨捲動推進:捲進巢狀容器時把該容器 ref 傳入 container
<EraStrataLayout items={eras} trigger="scroll" height={480} />

Props

Prop型別預設值說明
itemsEraStratumData[]地層資料,依序由上而下堆疊
activenumber受控的展開索引(click/hover 模式生效)
defaultActivenumber0非受控模式的初始展開索引
onActiveChange(index: number) => void展開索引變更時觸發
trigger"click" | "hover" | "scroll""click"觸發展開的方式
heightnumber | string440版面總高度(數字為 px)
collapsedSizenumber72收合地層/標題列的高度(px)
parallaxbooleantrue內容是否帶視差浮出
containerRefObject<HTMLElement | null>scroll 模式的巢狀捲動容器 ref
labelstring"年代地層"無障礙標籤
classNamestring外層容器 class
stratumClassNamestring套用在每個地層帶上的 class

EraStratumData

欄位型別說明
idstring穩定識別碼,作為無障礙錨點與 key
eraReactNode年代/階段標記,收合時仍可見
titleReactNode章節標題,收合時仍可見
summaryReactNode展開時最先浮出的一句摘要
contentReactNode展開時帶視差浮出的主要內容
accentClassNamestring左側地層色條的強調色 class

細節

  • 展開層以彈簧轉場垂直撐開,其餘地層同步壓縮回 collapsedSize,只留標題列可見
  • 使用 flexbox 的 flex-grow 分配剩餘空間,同一時間恰有一層展開;請確保 heightcollapsedSize × 地層數
  • 層內 summarycontent 以不同起始位移依序浮出,形成視差層次;parallax={false} 時僅保留淡入
  • scroll 模式會撐出對應的捲動高度並釘住視窗,捲動進度映射到展開的地層;點擊某層會平滑捲動至該層

可及性

  • 每個地層標題為原生 button,帶 aria-expandedaria-controls,內容區為 role="region" 並以標題 aria-labelledby
  • 標題列採 roving tabindex:Tab 進入後以 (或 )在各層間移動,HomeEnd 跳至首尾,EnterSpace 展開
  • 收合的內容區標記 inertaria-hidden,不會被鍵盤或輔助科技誤入
  • 使用者系統開啟「減少動態效果」時,改為全展開的靜態清單,所有內容一次呈現、不做壓縮或動畫

On this page