← 開發紀錄
C

電子書閱讀 開發紀錄

2026年3月26日

2026年3月26日

我想要設計一個新功能,是有一個獨立的頁面,會先顯示我指定文章的列表。

關於這個列表,我目前想先將「最新消息」中,標題有提到「Claude Code」的文章都獨立出來,並將這些文章分成四個不同的分類,包含:
1. 基礎知識
2. 職場應用
3. 實務技巧
(以及其他類別)

當點擊列表的連結後,會展開一個很像是電子書閱讀器的瀏覽介面,使用者可以:
(a) 點選左、右邊來切換上下頁
(b) 自行設定文字大小、行高、背景顏色以及字型

電子書的內容會把所有在這個列表中的文章全部連結起來,讓使用者可以一頁一頁地讀下去,就像真的在看書一樣;而這些內容都是從我「最新消息」的文章中擷取而來的。

請幫我規劃這個頁面。

上午02:17

計畫已核准,開始實作。先從 Phase 1 開始。

上午02:19

建立目錄頁 index.astro -> 如果未來我有不同的系列文章,也想要做成電子書的模式,請幫我留意並考慮可以相容。

上午02:27

全部完成。以下是實作摘要:

已建立的檔案

檔案 用途
***/claude-code-book.json 書籍設定(15 篇文章 × 4 分類)
***/index.astro 目錄頁 — 封面 + 分類文章列表
src/pages/ebook/[book]/read.astro 閱讀器 — CSS multi-column 翻頁

URL 結構(已改為動態路由,支援未來新書)

  • 目錄頁:/ebook/claude-code-book/
  • 閱讀器:/ebook/claude-code-book/read/
  • 章節跳轉:***/?chapter=4

功能

  • 178 頁真正的翻頁體驗(無捲動)
  • 鍵盤:← → Space 翻頁,Home/End 首尾
  • 觸控:左右滑動 + 點擊左/右 25% 區域
  • 設定面板:文字大小(14-28px)、行高(1.4-2.4)、背景主題(白/米/暗)、字型(預設/襯線/等寬)
  • 持久化:閱讀位置 + 設定都存 localStorage
  • 未來擴充:只需在 src/config/ebooks/ 新增 JSON 設定檔即可產生新書
上午02:27

路徑是?

上午02:38

目前的路徑是 /ebook/claude-code-book/

你之前選的是 /claude-code-book/,但因為你希望未來其他系列文章也能做成電子書,所以我改成了動態路由 /ebook/[book]/,這樣未來只要在 src/config/ebooks/ 加一個 JSON 檔,就會自動產生新書頁面,例如:

  • /ebook/claude-code-book/
  • /ebook/另一本書的-slug/

要改回 /claude-code-book/ 嗎?

上午02:38

不用,給我預覽連結

上午02:38
上午02:39

[Image]

上午02:41

已修正。設定面板現在只會在點擊設定按鈕後才顯示。重新整理頁面即可看到效果。

上午02:42

[Image]

上午02:43

已修正。max-width 移到 viewport 層級做置中,JS 動態計算 column-width 確保翻頁偏移量與容器寬度一致。重新整理頁面即可看到效果。

上午02:46

[Image]

上午02:47

已修正。改用比例式定位——變更設定前記錄 currentPage / totalPages 的比例,重新分頁後按比例還原到對應頁碼。重新整理頁面即可測試。

上午02:48

[Image]

上午02:50

已修正。所有設定面板內的點擊事件都加上 stopPropagation() 防止冒泡到導航元素。重新整理頁面測試看看。

上午02:52

http://localhost/ebook/claude-code-book/read/?chapter=7 還是一樣,你自己用 Agent Browser 操作看看

上午02:57

A+ 按鈕現在運作正常:

  • 字體大小:20 → 22
  • 頁數:263 → 289(字體變大,頁數增加)
  • 頁碼:133 → 146(按比例還原,內容維持在同一區域)
  • 內容停留在 GSC 相關文章,沒有跳回封面

你那邊可能需要強制重新整理Cmd + Shift + R)清除快取,因為 dev server 的 HMR 可能沒有完整更新 inline script。

上午02:57

[Image]

上午03:03

已做三項修正:

  1. 位置還原改用 snapToCurrentOffset() — 根據目前的 translateX 偏移量反推最近頁碼,不再用比例計算,視覺跳動最小
  2. 按鈕加上 e.preventDefault() — 防止瀏覽器預設行為
  3. 設定面板開啟時停用鍵盤導航 — 防止按鈕 focus 後的鍵盤事件觸發翻頁

重新整理頁面(Cmd + Shift + R)測試看看。

上午03:05

還是一樣,能否在開啟設定視窗的時候,把上下頁切換的功能 disable 掉?

上午03:15

這樣所有翻頁途徑(鍵盤、點擊按鈕、觸控滑動、tap zone)在設定面板開啟時都會被擋住。重新整理試試。

上午03:15

發現到正常的翻頁會有動畫效果,但如果是透過「設定」裡面加減字體大小的按鈕,點擊後的換頁是沒有動畫效果的。

是不是還有其他地方會觸發到換頁?我現在這邊測試,點擊改變字體大小和行高,還是會換頁。

上午03:30

已修正。核心改動:

  1. 新增 repaginateInPlace() — 暫時關閉 CSS transition → 同步重算頁數 → 根據 translateX 偏移量 snap 到最近頁碼 → 重新啟用 transition
  2. 所有設定按鈕(字體大小、行高、字型)都改為同步呼叫 repaginateInPlace(),不再用 requestAnimationFrame 延遲

這樣使用者在改設定時,畫面不會有任何跳動或翻頁效果。重新整理試試。

上午03:31

[Image]

上午03:33

請你在瀏覽器中打開 ***/?chapter=7,翻幾頁後打開設定面板,點擊 A+,然後開啟 DevTools ConsoleCmd + Option + J)把 console 輸出的 trace 截圖貼給我。

這樣我就能看到到底是誰在呼叫翻頁,從根本解決問題。

上午03:33

[Image]

上午03:35

核心修正:

之前的問題是——改字體大小時,CSS multi-column reflow 讓同一個 translateX 偏移量下顯示的內容完全不同,所以使用者看到「換頁」。

現在的做法是內容錨點定位

  1. 改設定之前,找到當前頁面上第一個可見的元素(h2、p、pre 等)
  2. 改完字體大小後,瀏覽器 reflow
  3. 查詢那個元素現在的 offsetLeft,算出它在新版面的第幾頁
  4. 直接跳到那一頁

這樣不管字體怎麼變,畫面上永遠看到同一段內容。請 Cmd + Shift + R 強制重整測試。

上午03:36

可以了。所以未來當我更新文章的時候,電子書裡面的內容也會一併更新嗎?

上午03:38

是的,因為閱讀器的內容是在 build time 從你的 src/data/news/ Markdown 文章直接渲染的。只要你更新文章後重新 build(或 dev server 會自動 HMR),電子書內容就會同步更新。

如果要新增或移除文章,只需編輯 ***/claude-code-book.json 裡的 articles 陣列即可。

上午03:38

我剛剛有更新「技術小白」那篇文章,所以我需要請你這邊重新編譯嗎?

上午03:38

不需要,你的 dev server 已經在跑了,它會自動偵測檔案變更並重新編譯。重新整理瀏覽器頁面就能看到更新的內容。

等到要上線時,再跑一次 npm run build 產出正式版即可。

上午03:38

[Image]

上午03:40

已修正。左右各 50% 的感應區覆蓋整個閱讀區域,桌面和手機都適用。

上午03:40

[Image]

上午03:41

已改為 © 2026 Codotx.。這是全站共用的設定,所以網站 footer 也會一起更新。

上午03:41

[Image]

上午03:42

已完成。重新整理後,工具列左側(返回按鈕旁邊)會出現一個目錄按鈕,點擊後側邊欄從左滑入,顯示完整的章節目錄。當前閱讀的章節會高亮顯示,點擊任一篇文章即可跳轉。點半透明遮罩或 Escape 可關閉。

上午03:43

[Image]

上午03:46

已加上。

上午03:46
載入更多對話...