視覺化 3D 卡片編輯器,透過簡單的滑桿與色彩選擇,創造出類似 Apple Credit Card 或雷射箔面遊戲王卡的高級質感卡片,並一鍵匯出可用的 HTML + CSS 代碼。
- 即時 3D 預覽:滑鼠移動即可體驗真實的 3D 傾斜效果
- 雷射箔面 (Holographic):動態彩虹漸層,跟隨滑鼠角度變化
- 磨砂玻璃 (Frosted Glass):backdrop-blur 營造高級透明感
- 景深效果 (Depth):卡片元素有不同的 Z 軸位移,創造立體層次
- 3 種視覺主題:大地 / 夢境 / 賽博,各有獨特風格
- 16 種主題色:對應 Tailwind 色系,一鍵切換光暈顏色
- 社群連結:支援 6 種平台,輸入網址後自動顯示對應圖示
- 完整匯出:Copy HTML 包含完整樣式與互動腳本
- 圖片下載:將卡片截圖存為 PNG,可直接分享社群
flowchart TB
subgraph UI["使用者介面"]
Preview["預覽區<br/>3D 卡片"]
Panel["控制面板<br/>Bento Grid 佈局"]
ThemeSwitch["主題切換<br/>Earth / Dream / Cyber"]
end
subgraph JS["JavaScript 模組"]
App["app.js<br/>主入口"]
State["state.js<br/>響應式狀態"]
Card["card.js<br/>3D 引擎"]
Controls["controls.js<br/>輸入綁定"]
Export["export.js<br/>匯出功能"]
Theme["theme.js<br/>主題管理"]
end
subgraph CSS["CSS 模組"]
Variables["variables.css<br/>設計 Tokens"]
Base["base.css<br/>Reset + 基礎"]
Layout["layout.css<br/>Bento Grid"]
CardCSS["card.css<br/>3D 特效"]
ControlsCSS["controls.css<br/>控制元件"]
Themes["themes/<br/>earth / dream / cyber"]
end
subgraph Effects["視覺特效層"]
Foil["雷射箔面<br/>conic-gradient"]
Glare["反光層<br/>linear-gradient"]
Glass["磨砂玻璃<br/>backdrop-blur"]
Noise["噪點紋理<br/>SVG feTurbulence"]
end
subgraph Export["匯出引擎"]
HTML["HTML Generator<br/>獨立組件"]
Screenshot["html2canvas-pro<br/>PNG 截圖"]
end
UI --> JS
JS --> CSS
Card --> Effects
Theme --> Themes
Export --> Screenshot
Preview --> Export
| 技術 | 用途 | 備註 |
|---|---|---|
| Vanilla JavaScript | 狀態管理與 DOM 操作 | ES Modules 模組化 |
| CSS Variables | 動態樣式綁定 | --mouse-x, --mouse-y, --card-hue |
| CSS Transform 3D | 3D 傾斜效果 | preserve-3d, translateZ, rotateX/Y |
| Tailwind CSS (CDN) | 快速樣式開發 | 僅開發用,匯出不依賴 |
| html2canvas-pro | 卡片截圖功能 | MIT License,見下方說明 |
本專案使用 html2canvas-pro 而非原版 html2canvas。
原因:原版 html2canvas 無法正確處理 SVG filter(如 feTurbulence 噪點紋理),會導致 InvalidStateError: Failed to execute 'createPattern' 錯誤。
html2canvas-pro 資訊:
| 項目 | 內容 |
|---|---|
| 來源 | yorickshan/html2canvas-pro |
| 授權 | MIT License ✅ 可自由商用 |
| 性質 | 原版 html2canvas 的 fork,持續修復 bug |
| 使用者 | Metabase (40k+ stars)、Open WebUI (50k+ stars) |
flowchart LR
subgraph Themes["三種視覺主題"]
Earth["🌍 Earth<br/>大地風格"]
Dream["🌙 Dream<br/>夢境風格"]
Cyber["⚡ Cyber<br/>賽博風格"]
end
subgraph EarthStyle["Earth 特色"]
E1["Wabi-sabi 侘寂美學"]
E2["SVG 噪點紋理背景"]
E3["溫暖大地色調"]
E4["襯線字體標題"]
end
subgraph DreamStyle["Dream 特色"]
D1["Aurora 極光漸層"]
D2["Claymorphism 軟 3D"]
D3["冰藍 + 薰衣草色"]
D4["動態背景動畫"]
end
subgraph CyberStyle["Cyber 特色"]
C1["CRT 掃描線效果"]
C2["霓虹綠發光"]
C3["Monospace 終端字體"]
C4["故障藝術按鈕"]
end
Earth --> EarthStyle
Dream --> DreamStyle
Cyber --> CyberStyle
# 直接用瀏覽器開啟
open index.html
# 或使用本地伺服器(推薦,避免 CORS 問題)
npx serve .- 預覽區:移動滑鼠體驗 3D 效果
- 控制面板:
- 頭像:點擊上傳圖片
- 身份:輸入名稱與職稱
- 簡介:輸入個人描述
- 社群:輸入網址,自動顯示圖示
- 材質:調整傾斜強度 / 反光強度
- 主題色:16 種 Tailwind 色系
- 匯出:
Copy HTML:複製完整 HTML(含互動腳本)Download Image:下載 PNG 圖片
| 平台 | 輸入格式範例 |
|---|---|
| GitHub | github.com/username |
| X (Twitter) | x.com/username |
facebook.com/username |
|
instagram.com/username |
|
| Threads | threads.net/@username |
linkedin.com/in/username |
社群連結預設隱藏,輸入網址後才會顯示。匯出的 HTML 也只包含已填寫的連結。
:root {
--mouse-x: 0.5; /* 0~1,滑鼠 X 軸位置 */
--mouse-y: 0.5; /* 0~1,滑鼠 Y 軸位置 */
--tilt-intensity: 15; /* 傾斜強度 */
--glare-opacity: 0.4; /* 反光強度 */
--card-hue: 200; /* 主題色相 */
}
.holo-card {
--rotateX: calc((var(--mouse-y) - 0.5) * var(--tilt-intensity) * -1deg);
--rotateY: calc((var(--mouse-x) - 0.5) * var(--tilt-intensity) * 1deg);
transform: rotateX(var(--rotateX)) rotateY(var(--rotateY));
}.rainbow-glare {
background: conic-gradient(
from calc(var(--mouse-x) * 360deg)
at calc(var(--mouse-x) * 100%) calc(var(--mouse-y) * 100%),
rgba(255,0,128,0.3),
rgba(255,128,0,0.3),
rgba(255,255,0,0.3),
rgba(0,255,128,0.3),
rgba(0,128,255,0.3),
rgba(128,0,255,0.3),
rgba(255,0,128,0.3)
);
mix-blend-mode: color-dodge;
}day-15-holo-card/
├── index.html # 主頁面
├── .gitignore # 版本控制忽略清單
├── css/
│ ├── variables.css # 設計 Tokens
│ ├── base.css # Reset + 基礎樣式
│ ├── layout.css # Bento Grid 佈局
│ ├── card.css # 3D 卡片特效
│ ├── controls.css # 控制元件樣式
│ └── themes/
│ ├── earth.css # 大地主題
│ ├── dream.css # 夢境主題
│ └── cyber.css # 賽博主題
├── js/
│ ├── app.js # 主入口
│ ├── state.js # 響應式狀態管理
│ ├── card.js # 3D 引擎
│ ├── controls.js # 輸入綁定
│ ├── export.js # 匯出功能
│ ├── social.js # 社群連結處理
│ ├── theme.js # 主題切換
│ └── utils/
│ └── dom.js # DOM 工具與安全 localStorage
├── README.md # 說明文件(中文)
└── README_EN.md # 說明文件(英文)
匯出的 HTML 是完整可用的組件,包含:
- 所有 CSS 樣式(無需 Tailwind)
- 互動腳本(滑鼠追蹤)
- 當前設定值(傾斜/反光/主題色)
- 已設定的社群連結
直接貼到任何網頁即可使用。
前幾天我嘗試了各種專案方向:有純視覺的、有涉及音樂與聲音的,還有畫面與媒體的結合。今天特別想挑戰「視覺化名片產生器」的概念:一張可嵌入網站的社交名片,讓每個人都能創造出屬於自己的獨特卡片。
名片彷彿代表了我們的身份,因此我想呈現一張華麗的名片。
但這也是一種暗喻:我們每個人都有多樣的社交面向。華麗的卡片背後連結著各種社群媒體:GitHub、X、Instagram、LinkedIn⋯⋯然而,那些連結未必全然等同於我本人。
社群帳號是我們選擇呈現的切面,是精心策展的櫥窗。真正的我們,遠比任何一張名片更加複雜、更加立體。
這張全息卡片的炫目光澤,或許正是對這種現象的視覺化詮釋。
經過完整的 Code Review,修復了以下問題:
| 優先級 | 問題 | 修復內容 |
|---|---|---|
| High | XSS 風險 | colorPicker 改用 DOM API 避免 innerHTML 注入 |
| Medium | URL 注入 | 社群連結加入協議驗證,阻擋 javascript: 注入 |
| Medium | 檔案上傳 | 新增類型(圖片格式)與大小(5MB)驗證 |
| Medium | CSP | 加入 Content Security Policy meta tag |
| Medium | 錯誤處理 | html2canvas-pro 細緻化錯誤訊息 |
| Medium | 效能 | 文字輸入加入 150ms debounce |
| Medium | 程式碼品質 | 新增 js/utils/dom.js 工具模組 |
| Medium | 死程式碼 | 移除未使用的 batchUpdateState |
| Low | 無障礙 | Toast 加入 ARIA 屬性 |
| Low | 無障礙 | 顏色選擇器加入鍵盤導航(方向鍵、Enter、Home/End) |
| Low | 記憶體管理 | 新增 destroyCard() 事件監聯器清理函式 |
| Low | 程式碼品質 | 移除生產環境 debug console.log |
新增檔案:
.gitignore- 版本控制忽略清單js/utils/dom.js- 統一 DOM 工具與安全 localStorage
本專案採用 Apache License 2.0 授權。
第三方依賴:
- html2canvas-pro - MIT License
- Tailwind CSS - MIT License