Joseph Chen
有了 React + Tailwind,你已經能做出任何樣式的頁面。但每次都要從零寫一個按鈕、一張卡片嗎?
這就是元件庫(Component Library)的價值:把常用的 UI 元件封裝好,直接引入使用。 HeroUI 是我選擇的元件庫,它基於 Tailwind CSS,設計美觀,和 Next.js 相容。
打開我任何一個 page.tsx,第一行 import 通常長這樣:
安裝與設定(只做一次)
Step 1:安裝套件
HeroUI 依賴 framer-motion 做動畫,兩個都要裝。
Step 2:設定 tailwind.config.ts
Step 3:加入 Providers
HeroUI 需要一個 Provider 包住整個 App,才能讓主題、動畫等功能正常運作:
Card — 最常用的容器
Card 是網頁裡最基本的「卡片容器」,有陰影、圓角,適合放各種資訊。
基本用法
這是卡片裡的內容
isPressable + as={Link} — 可點擊的卡片連結
我的 blog 文章列表用的方式:
as={ Link } 讓 Card 有 Link 的功能(可以導航),同時保有 Card 的樣式。Button — 豐富的變體
HeroUI 的 Button 有很多 variant(變體)和 color(顏色),組合使用可以表達不同的視覺層級:
variant 變體
常用 Props
| Prop | 型別 | 預設 | 說明 |
|---|---|---|---|
| color | string | default | primary / secondary / success / warning / danger |
| variant | string | solid | solid / flat / bordered / light / shadow / ghost |
| size | string | md | sm / md / lg |
| radius | string | md | none / sm / md / lg / full(圓角程度) |
| isIconOnly | boolean | false | 只有圖示的方形按鈕 |
| as | Component | button | 渲染成其他元件,常用 as={'{'}Link{'}'} |
| startContent | ReactNode | — | 按鈕左側的圖示或元素 |
| endContent | ReactNode | — | 按鈕右側的圖示或元素 |
Chip — 標籤與分類
Chip 是小標籤,我用它來顯示文章分類、EP 編號、技術標籤等。
Divider — 分隔線
最簡單的元件,就是一條水平線,用來分隔內容區塊:
以下是 opacity-30 的效果:
以下是 opacity-80 的效果:
其他常用元件快速一覽
Link
語意化連結,可以 href 外部 URL 或內部路由,支援 target="_blank"
Avatar
用戶頭像,可顯示圖片或文字縮寫,有 size / radius / bordered 等 props
Skeleton
載入佔位效果(骨架屏),讓頁面在資料還沒載入時有預覽框架
Spinner
載入中的旋轉動畫
Modal
彈出視窗,需搭配 useDisclosure Hook 控制開關
Tabs
分頁切換,每個 Tab 有自己的內容
HeroUI + Tailwind 混用
HeroUI 元件本身用 Tailwind 寫的,所以你可以在 HeroUI 元件上加 className 覆蓋或擴充樣式,兩者完全相容: