用 Slidev 把 Markdown 變成簡報網站
Slidev 是一個用 Markdown 寫投影片的框架,支援 Vue 組件擴展、內建 UnoCSS 和動效系統,最終產出純靜態網站。這篇分享從技術選型、專案建立、樣式客製、動畫設定到部署的過程,以及幾個容易踩到的坑。
最近需要在會議上做簡報,與其用 PowerPoint 或 Google Slides,不如直接做成一個網站,隨時打開瀏覽器就能展示。最後選擇了 Slidev 這個框架,用 Markdown 寫投影片,搭配一些簡單的動效,最終部署成純靜態網站。
這篇文章會分享從技術選型到部署上線的過程,以及一些使用上的心得。
為什麼選 Slidev
一開始有考慮過幾個方案:
| 方案 | 優點 | 缺點 |
|---|---|---|
| Slidev | Markdown 撰寫、Vue 組件擴展、內建動效和樣式系統 | 依賴 Vue 生態 |
| reveal.js | 老牌、外掛多 | 需要寫比較多 HTML,客製化不太方便 |
| 自己刻 | 完全自由 | 要自己造翻頁、鍵盤控制、transition 等輪子 |
Slidev 最吸引我的地方是用 Markdown 就能寫投影片,而且如果需要更複雜的排版,隨時可以在 Markdown 裡面穿插 HTML 和 Vue 組件。內建的 UnoCSS 讓樣式也不用額外設定,寫法跟 Tailwind CSS 幾乎一樣。
建立專案
npm init -ynpm install @slidev/cli @slidev/theme-default在 package.json 加入 scripts:
{ "scripts": { "dev": "slidev", "build": "slidev build" }}接著建立 slides.md,這就是你的整份簡報:
---theme: defaulttransition: slide-lefttitle: My Presentation---
# Hello
This is the first slide.
---
# Second Slide
This is the second slide.每一頁用 --- 分隔,最上面的 --- 區塊是全域設定。跑 npm run dev 就能在瀏覽器看到結果了。
投影片結構
因為這是個人簡介,內容不是技術導向,我把它設計成一個比較有節奏感的流程:文字頁和圖片頁交替出現。
封面 → 個人照+簡介 → 主題文字 → 搭配照片 → 主題文字 → 搭配照片 → ... → 結尾每個主題都拆成獨立的頁面,不會把太多東西塞在同一頁。這樣在操作的時候節奏會比較好,聽眾也比較容易跟上。
自訂樣式
Slidev 預設的樣式比較中性,如果想要有自己的風格,可以在 styles/ 資料夾裡覆寫。建立 styles/index.ts 作為進入點:
import './custom.css'然後在 custom.css 裡面寫你的樣式:
.slidev-layout { background: #f5f0eb !important; color: #3a3a3a !important; font-family: 'Noto Sans TC', sans-serif !important;}這裡的 .slidev-layout 是每一頁投影片的最外層容器,用 !important 覆蓋預設 theme 的樣式。
如果要讓所有頁面都使用同一張背景圖,也可以直接寫在這裡:
.slidev-layout { background: url('/images/bg.jpg') center / cover no-repeat !important;}圖片放在 public/images/ 下,Slidev 會把 public/ 作為靜態資源的根目錄。
使用 Vue 組件
如果某些排版用純 Markdown 不好實現,可以建立 Vue 組件。把 .vue 檔放在 components/ 資料夾下,Slidev 會自動註冊,直接在 Markdown 裡面用就好:
<script setup lang="ts">defineProps<{ name: string level: number}>()</script>
<template> <div class="mb-4"> <div class="flex justify-between mb-1"> <span class="text-sm">{{ name }}</span> <span class="text-xs">{{ level }}%</span> </div> <div class="w-full rounded-full h-1.5" style="background: #d4cac0;"> <div class="h-1.5 rounded-full" style="background: #8c7b6b;" :style="{ width: `${level}%` }" /> </div> </div></template>在 slides.md 裡直接使用:
<SkillBar name="Vue.js" :level="90" /><SkillBar name="TypeScript" :level="85" />動效
頁間切換
在全域 frontmatter 設定預設的 transition:
---transition: slide-left---也可以在個別頁面的 frontmatter 覆寫:
---transition: fade---逐步顯示
用 <v-click> 包住想要按下一步才出現的內容:
# Title
<v-click>
This text appears after clicking.
</v-click>這在會議上很實用,可以控制資訊出現的時機,不會一次全部秀出來。
元素進場動畫
如果想要更細緻的動畫效果,可以安裝 @vueuse/motion:
npm install @vueuse/motion然後在 HTML 標籤上加 v-motion directive:
<div v-motion :initial="{ opacity: 0, y: 15 }" :enter="{ opacity: 1, y: 0, transition: { duration: 1000 } }"> Content here</div>踩到的坑
Markdown 裡的 HTML 縮排會變成 code block
這大概是最容易踩到的問題。在 slides.md 裡面寫 HTML 時,如果縮排超過 4 個空格,Markdown parser 會把它當成程式碼區塊,整段 HTML 就會被原封不動地顯示出來。
解決方法就是把巢狀 HTML 的縮排壓平,不要超過 3 個空格。雖然可讀性會差一點,但至少能正常渲染。
<p> 巢狀問題
如果在 <p> 標籤裡面放了 Markdown 文字,Slidev 會把文字解析成 <p>,導致 <p> 裡面又有 <p>,瀏覽器會報 hydration warning。解決方法是外層改用 <div>。
第一頁空白
全域 frontmatter 區塊本身也會被渲染成一頁投影片。如果你的第一頁是封面,可以直接把封面內容跟全域設定放在同一個 frontmatter 區塊裡,加上 layout: none 然後自己排版。
部署
npm run build 會在 dist/ 產出純靜態的 HTML/CSS/JS,可以部署到任何靜態網站託管服務。
我是部署到 Zeabur,連接 GitHub repo 後設定好 build command(npm run build)和 output directory(dist)就完成了。
如果是部署到 GitHub Pages 之類有 sub-path 的服務,記得在 build 時加上 --base 參數:
slidev build --base /your-repo-name/操作快捷鍵
在會議上用筆電操作時,這些快捷鍵很實用:
| 快捷鍵 | 功能 |
|---|---|
→ / Space |
下一頁 |
← |
上一頁 |
o |
總覽模式(快速跳頁) |
f |
全螢幕 |
這些都是 Slidev 內建的,不需要額外設定。
心得
用 Slidev 做簡報最大的好處是,它就是一個前端專案。想要什麼樣式就寫 CSS,想要什麼互動就寫 Vue 組件,不會被簡報軟體的功能限制住。而且因為是 Markdown,內容的維護和版本控制都很方便。
比較需要注意的是,Slidev 畢竟是把 Markdown 轉成 Vue 組件再渲染,有些 Markdown 和 HTML 混用的邊界情況會比較奇怪(像上面提到的縮排和巢狀問題),需要花一點時間摸索。
整體來說,如果你本身有前端開發的經驗,用 Slidev 做簡報會很順手,也能做出比傳統簡報軟體更有個人風格的東西。
相關文章
用 LQIP 讓圖片載入不再跳來跳去
用 LQIP 技術搭配三層圖片載入策略,讓照片牆從進場到開啟大圖的每個階段都不會出現空白或版面跳動。
AI 時代的個人知識庫:Obsidian、RAG 與 Agent 該怎麼分工?
Obsidian、RAG 與 AI Agent 常被放在一起討論,但它們其實負責不同任務。本文從個人知識管理的角度,拆解 Obsidian 如何保存筆記、RAG 如何檢索資料、Agent 如何把內容轉成可執行的工作流。
把模糊想法變成可執行工作:我的 Supekku Workflow 設計
AI Agent 協作的問題不只是 prompt,而是脈絡如何被保存。Supekku Workflow 是我用來把模糊想法整理成可執行工作的方式:先透過對話釐清意圖、範圍與成功標準,再把需要保存的內容轉成 proposal、criteria、reasoning、actions 與 verification。
讓 AI 學會查資料:RAG 與 Embedding 技術解析
當 AI 不再只靠訓練記憶回答問題,而是能即時從你的資料中檢索再生成,這就是 RAG(檢索增強生成)的核心概念。本文從 Embedding 向量化到 Cosine Similarity 相似度計算,完整拆解 RAG 的運作原理與實務要點。
如何在 Kobo 電子書閱讀器安裝自訂字型
身為 Kobo 使用者,一定要學會的自訂字型小技巧!內建字型看膩了?跟著這份筆記,把帶有手寫筆觸的「芫荽」字型裝進閱讀器裡。簡單、免費且不傷效能,讓你的每一本電子書都像精心排版過的實體書一樣順眼。
