頁面區塊 Sections
頭像分頁引言
客戶評價區塊 React 元件:左側直列頭像與姓名作為分頁,選中標記沿列滑動,右側引言以模糊交叉淡接切換,頭像同步放大,背景光斑跟著選中者換色相。
把幾則客戶評價收進同一個區塊:左側是一列頭像與姓名,點選或用方向鍵切換;選中標記(3px 強調色指示條+淡底色塊)以彈簧沿列滑動,清單裡的頭像同步放大到 1.1 倍。右側顯示選中者的大頭像、引言、作者與可選的成效數字,切換時舊內容模糊淡出、新內容從模糊中浮現;背景一團 8% 不透明度的柔和光斑依選中者的色相過渡。窄螢幕上清單自動改為橫向捲動的頭像列。頭像不需要照片:預設以姓名縮寫+黃金角度色相的漸層圓產生,也可傳 avatarSrc 換成真圖。
把這個效果裝進你的專案
在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。
npx webberui@latest add avatar-tab-quotesPlayground
即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。
400
350
6000
編輯中的呼叫預設屬性
<AvatarTabQuotes/>
完整範例包含預覽的排版與資料。先安裝元件,再把範例檔貼入你的專案。
安裝
npx webberui@latest add https://webberui.com/r/avatar-tab-quotes.json或在 components.json 設定 registries 後,改用 @webberui/avatar-tab-quotes 安裝。
使用
import { AvatarTabQuotes } from "@/components/ui/avatar-tab-quotes";
<AvatarTabQuotes
eyebrow="客戶怎麼說"
title="四個團隊,四種上線速度"
testimonials={[
{
quote: "改版後的會員頁一週就上線,門市店員也能自己換季節菜單。",
name: "林語晴",
role: "營運主管",
company: "青嶼咖啡",
highlight: "一週就上線",
metric: { value: "7 天", label: "從設計到上線" },
},
{
quote: "貨況追蹤頁的載入時間少了一半,客服電話跟著明顯變少。",
name: "陳柏宇",
role: "產品經理",
company: "北辰物流",
},
]}
/>Props
| Prop | 型別 | 預設值 | 說明 |
|---|---|---|---|
testimonials | AvatarTabQuotesItem[] | — | 評價資料,依序對應頭像列 |
eyebrow | string | — | 標題上方的小標 |
title | string | — | 區塊標題;同時作為 section 的無障礙名稱 |
subtitle | string | — | 標題下方的說明文字 |
value | number | — | 受控的選中索引;未提供時由元件內部管理 |
defaultValue | number | 0 | 非受控模式的初始選中索引 |
onValueChange | (index: number) => void | — | 選中索引變動時回呼 |
autoplay | boolean | false | 自動輪播;開啟時顯示暫停鈕與選中列下方的進度線 |
interval | number | 6000 | 自動輪播間隔(毫秒),最小 1000 |
orientation | "vertical" | "horizontal" | "vertical" | 頭像列方向;vertical 在 md 以下自動改為橫向捲動頭像列 |
pauseLabel | string | "暫停自動播放" | 暫停鈕標籤(輪播中) |
playLabel | string | "繼續自動播放" | 暫停鈕標籤(已暫停) |
listLabel | string | "選擇評價" | 頭像列(tablist)的無障礙名稱;沒有 title 時也作為 section 的名稱 |
className | string | — | 併入根 section |
AvatarTabQuotesItem
| 欄位 | 型別 | 預設值 | 說明 |
|---|---|---|---|
quote | string | — | 評價內文 |
name | string | — | 評價者姓名;同時用來產生頭像縮寫(中文取末兩字、拉丁取首字母) |
role | string | — | 職稱 |
company | string | — | 公司或單位,顯示在清單姓名下方與作者列 |
rating | number | — | 星等(1–5);未提供時不顯示 |
avatarHue | number | 依索引的黃金角度色相 | 頭像漸層與背景光斑的色相(0–360) |
highlight | string | — | quote 中要加強調色底線的片段,需與內文完全相符 |
metric | { value: string; label: string } | — | 引言下方的成效數字 |
avatarSrc | string | — | 頭像圖片網址;未提供時用縮寫+漸層圓 |
CSS 變數
| 變數 | 預設值 | 說明 |
|---|---|---|
--wb-avatar-tab-quotes-accent | #0d9488(暗色 #2dd4bf) | 指示條、大頭像細環、小標、成效數字與底線的強調色 |
--wb-avatar-tab-quotes-stiffness | 400 | 選中標記與頭像放大的彈簧剛度(damping 固定 34) |
--wb-avatar-tab-quotes-duration | 350ms | 右側內容模糊淡出/淡入各自的時長 |
--wb-avatar-tab-quotes-glow-duration | 600ms | 背景光斑換色相的過渡時長 |
細節
- 右側內容用
AnimatePresence的mode="wait":舊內容先模糊(8px)、上移 8px 並淡出,新內容再從下方 8px、模糊中浮現,兩段都使用--wb-avatar-tab-quotes-duration。 - 背景光斑是一個以
currentColor填色的徑向漸層,切換時只改color,讓瀏覽器原生的顏色過渡帶動色相變化,不需要逐格重繪。 - 窄螢幕時頭像列橫向捲動,切換(包括自動輪播)只捲動清單本身、不會拉動整個頁面,選中的頭像會被捲進可視範圍。
- 自動輪播在滑鼠移入、鍵盤聚焦於區塊內或分頁被隱藏時暫停;暫停時進度線停止,恢復後從頭計時。
可及性
- 根元素是
<section>,有title時以aria-labelledby指向標題,否則用listLabel作為名稱 - 頭像列為
role="tablist",aria-orientation依實際方向(直列或窄螢幕的橫向列)設定;每個頭像是role="tab"按鈕,採 roving tabindex - 直列時 ↑/↓、橫向時 ←/→ 切換,Home/End 跳到第一則與最後一則;切換後焦點跟著移動
- 右側是
role="tabpanel",以aria-labelledby指向目前的分頁;未自動輪播時內容變化以aria-live="polite"朗讀,輪播中則關閉朗讀避免干擾 - 引言以
figure/blockquote/figcaption呈現;頭像為裝飾性(aria-hidden),分頁名稱由姓名與公司組成 - 開啟自動輪播時一定顯示可見的暫停/播放鈕(WCAG 2.2.2)
- 使用者系統開啟「減少動態效果」時,自動輪播預設關閉(仍可按播放鈕開啟),彈簧滑動、頭像放大、模糊與位移改為 150ms 淡入淡出,內容仍可透過頭像切換