頁面區塊 Sections

人像疊字引言

全幅人像畫面上疊放引言文字的 React 評價區塊,切換時影像交叉淡接並緩慢推近,文字逐行由遮罩中升起,可自動播放、拖曳切換。

把客戶評價做成一張全幅人像海報:大圓角畫面鋪滿人像(沒有照片時以暖色雙色漸層與抽象半身剪影佔位),底部的暗色漸層上疊著白色引言與署名。切換時舊圖淡出、新圖淡入並在整個播放間隔裡從 1.08 緩慢推近到 1;引言以行為單位從遮罩中逐行升起,舊文字向上淡出。頂端每則一段細進度條,右下角有上一則/下一則、頁數與暫停鈕,也可以左右拖曳畫面切換。

把這個效果裝進你的專案

在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。

npx webberui@latest add portrait-overlay-quote

還沒有專案,或安裝遇到問題?看快速開始 →

Playground

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

7000
700
編輯中的呼叫預設屬性
<PortraitOverlayQuote/>

完整範例包含預覽的排版與資料。先安裝元件,再把範例檔貼入你的專案。

安裝

npx webberui@latest add https://webberui.com/r/portrait-overlay-quote.json

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

使用

import { PortraitOverlayQuote } from "@/components/ui/portrait-overlay-quote";

<PortraitOverlayQuote
  eyebrow="客戶怎麼說"
  title="他們把網站換上新介面之後"
  testimonials={[
    {
      quote: "改版後的訂位頁,\n讓週末候位少了一半。",
      name: "林語晴",
      role: "營運主理人",
      company: "青嶼咖啡",
      highlight: "少了一半",
    },
    {
      quote: "司機打開派車畫面就知道下一站。新人第一天就能獨立跑線。",
      name: "陳柏宇",
      role: "調度主管",
      company: "北辰物流",
      photoSrc: "/images/team/chen.jpg",
    },
  ]}
  interval={7000}
  onIndexChange={(i) => console.log(`切到第 ${i + 1} 則`)}
/>

Props

Prop型別預設值說明
testimonialsPortraitOverlayQuoteItem[]—評價清單
eyebrowstring—標題上方的小標
titlestring—區塊標題;有提供時作為 section 的 aria-labelledby
subtitlestring—標題下方的說明文字
autoplaybooleantrue是否自動播放;使用者開啟「減少動態效果」時一律關閉
intervalnumber7000自動播放間隔(ms);未提供時讀 --wb-portrait-overlay-quote-interval
durationnumber700文字逐行升起的時長(ms);未提供時讀 --wb-portrait-overlay-quote-duration
aspect"16/9" | "4/3" | "1/1""16/9"md 以上的畫面比例;md 以下固定 4/5
indexnumber—受控的目前索引;未提供時由元件內部管理
defaultIndexnumber0非受控模式的初始索引
onIndexChange(index: number) => void—索引變動時回呼
classNamestring—透傳到根 section

PortraitOverlayQuoteItem

欄位型別預設值說明
quotestring—引言內文;可用 \n 手動斷行,未斷行時自動依句末標點切行
namestring—姓名,同時用來產生縮寫頭像(中文取末兩字、拉丁取首字母)
rolestring—職稱
companystring—公司
ratingnumber—評分(0–5),顯示為星等
avatarHuenumber—佔位人像與頭像的色相;未提供時依索引以黃金角度(137.508°)推算
highlightstring—quote 中要以強調色底線標記的片段
metric{ value: string; label: string }—搭配引言的關鍵數字
photoSrcstring—人像照片網址;未提供時以漸層 + 抽象剪影佔位

細節

  • 節奏變數:--wb-portrait-overlay-quote-interval(預設 7000ms)與 --wb-portrait-overlay-quote-duration(預設 700ms)。傳入 interval/duration 時會寫進這兩個變數,元件掛載後再從 computed style 讀回,所以在外層覆寫變數也會生效。
  • 強調色只走 --wb-portrait-overlay-quote-accent(淺色預設 #0d9488、深色預設 #2dd4bf),用在小標、引言重點底線與進度段。
  • 一個 rAF 迴圈同時推進 Ken Burns 縮放與進度段:暫停時計時不前進,進度停在當下,繼續後從原處接著跑;滑鼠移入、鍵盤焦點在區塊內、按下暫停鈕、分頁切到背景、捲出畫面時都會暫停。
  • 影像交叉淡接固定 800ms,比文字慢,讓畫面先換、字再升起;每行以 90ms 錯開。
  • 拖曳或左右滑動位移超過 60px 才會切換;從按鈕上開始的拖曳不算。

可及性

  • 根元素是 section,有標題時以 aria-labelledby 指向標題;輪播區為 role="region" 並帶 aria-roledescription="輪播"
  • 每則評價是 role="group"、aria-roledescription="評價",aria-label 例如「第 2 則,共 5 則」;引言以 figure、blockquote、figcaption 呈現
  • 自動播放進行中 aria-live="off",避免定時打斷螢幕閱讀器;暫停或手動切換時改為 polite
  • 上一則/下一則與暫停鈕都是 type="button" 並有 aria-label,暫停鈕帶 aria-pressed;焦點在區塊內時可用左右方向鍵切換
  • 自動播放預設開啟時一定有可見的暫停鈕(WCAG 2.2.2),滑鼠移入或焦點進入也會暫停
  • 使用者系統開啟「減少動態效果」時:自動播放關閉、不做 Ken Burns 推近與文字位移,影像與文字改為 150ms 淡入,仍可用按鈕切換