資料展示

狀態頭像

頭像元件:圖片載入前顯示首字母,載入完成交叉淡接,附線上狀態呼吸點與 hover 描邊擴張,五種尺寸兩種外形。

成員列表、留言串、帳號選單都用得到的頭像。圖片在 mounted 後預載,載入前先顯示由 alt 產生的首字母——中文名取最後兩字、英文取前兩個單字的首字母,底色依名字的確定性 hash 從六個中性暖灰色調中挑選,同一個人每次都同色。圖片載入完成時兩層交叉淡接,載入失敗則保留首字母。右下角可加線上狀態點,線上時外圈緩慢呼吸;開啟 ring 後 hover 或外層連結聚焦時,描邊會從頭像邊緣擴張出來。

把這個效果裝進你的專案

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

npx webberui@latest add avatar

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

Playground

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

200
編輯中的呼叫預設屬性
<Avatar/>

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

安裝

npx webberui@latest add https://webberui.com/r/avatar.json

或在 components.json 設定 registries 後,改用 @webberui/avatar 安裝。

使用

import { Avatar } from "@/components/ui/avatar";

<Avatar src="/team/yuqing.jpg" alt="林雨晴" status="online" ring />

{/* 沒有圖片:顯示「雨晴」 */}
<Avatar alt="林雨晴" size="lg" shape="rounded" />

{/* 外層是連結時,聚焦也會顯示描邊 */}
<a href="/members/yuqing" className="rounded-full focus-visible:outline-none">
  <Avatar src="/team/yuqing.jpg" alt="林雨晴" ring delayMs={300} />
</a>

Props

Prop型別預設值說明
srcstring—頭像圖片網址;省略或載入失敗時顯示首字母
altstring—必填。圖片替代文字,同時是首字母與底色的來源
fallbackReactNode—覆寫自動產生的首字母,可放任意節點
size"xs" | "sm" | "md" | "lg" | "xl""md"24/32/40/56/72px
shape"circle" | "rounded""circle"正圓或 22% 圓角方形
status"online" | "busy" | "away" | "offline"—右下角狀態點;省略則不顯示
statusLabelstring依 status:"線上"/"忙碌"/"離開"/"離線"給螢幕閱讀器的狀態文字
ringbooleanfalsehover 或外層聚焦時顯示擴張的描邊
durationnumber200交叉淡接與描邊過渡時長(毫秒),寫入 --wb-avatar-duration
delayMsnumber0有 src 時延遲多久才顯示首字母(毫秒);圖片多半命中快取時設 300 可避免首字母閃一下
onLoadingStatusChange(status: "idle" | "loading" | "loaded" | "error") => void—圖片載入狀態變化時回呼
classNamestring—透傳到最外層元素

另外具名匯出 getInitials(alt),方便在其他地方(例如下拉選單的文字頭像)沿用同一套首字母規則。

細節

  • 首字母規則:含中日韓漢字的名字取最後兩個漢字(「林雨晴」→「雨晴」,單字名取一字),因為中文習慣以名稱呼;其他名字取前兩個單字的首字母並大寫(「Maya Lin」→「ML」)。
  • 預載只在 mounted 後以 new Image() 進行,SSR 首次渲染一律輸出首字母層,與 client 第一次渲染一致,不會產生 hydration 警告。
  • 圖片層與首字母層絕對定位疊在同一個框裡,交叉淡接時版面不會跳動。
  • 狀態點尺寸為頭像的 25%,外圈 2px 與背景同色;離開狀態用 CSS mask 畫成月牙,缺口是真正透明的;離線為空心圓。只有線上狀態有呼吸脈動(外圈放大至 1.8 倍並淡出,2 秒一輪)。
  • 時間節奏外露為 --wb-avatar-duration(預設 200ms)與 --wb-ease-out,可在全域樣式覆寫。

可及性

  • 圖片使用 alt;圖片未載入時首字母層為 role="img" 並以 aria-label 帶出完整名字
  • 有 status 時附上 sr-only 文字(例如「(線上)」),螢幕閱讀器會讀出「林雨晴(線上)」;狀態點與脈動本身 aria-hidden
  • 描邊同時回應 hover 與外層連結/按鈕的 focus-visible,鍵盤使用者也看得到聚焦位置
  • 使用者系統開啟「減少動態效果」時,交叉淡接改為直接切換、線上狀態點不脈動