網站客製化
你可以透過 TOML 設定、CSS、自訂 HTML、JavaScript 等方式來 客製化 Zensical,讓網站符合你的需求。
Note
顏色、字型、圖示、Logo 另有專章,這裡著重在整體客製化流程。
修改 zensical.toml(基本客製化)
在 zensical.toml 進行基本客製化設定:
[project.theme]
variant = "classic"
features = [
"navigation.tabs",
"navigation.sections",
"content.code.copy",
]
[project.theme.palette]
scheme = "slate"
primary = "indigo"
accent = "pink"
[project.theme]
font.text = "Roboto"
font.code = "Fira Code"
📌 這可以客製化:
- 主題變體(
classic接近 Material for MkDocs,modern為新外觀) - 顏色主題(
palette) - 字體設定(
font) - 導覽選項(
navigation.tabs、navigation.sections) - 代碼顯示功能(
content.code.copy)
客製化 CSS
你可以使用 自訂 CSS 來調整樣式。
步驟 1:建立 extra.css
在 docs/css/extra.css 加入:
/* 修改標題顏色 */
.md-typeset h1 {
color: #ff4081;
}
/* 修改表格內文字垂直置中 */
.md-typeset table td {
vertical-align: middle;
}
/* 修改側邊欄背景 */
.md-sidebar {
background-color: #333;
}
步驟 2:在 zensical.toml 啟用
自訂 Logo、Icons
設定網站 Logo
設定社交媒體 Icons
[[project.extra.social]]
icon = "fontawesome/brands/github"
link = "https://github.com/your-repo"
[[project.extra.social]]
icon = "fontawesome/brands/linkedin"
link = "https://linkedin.com/in/your-profile"
自訂 HTML 頁面
你可以建立 overrides/ 目錄來覆蓋預設的 HTML。Zensical 使用 MiniJinja 模板(與 Jinja 大部分相容)。
步驟 1:建立 overrides/ 目錄
步驟 2:啟用 overrides/
常見可覆寫區塊包含 extrahead、content、footer、header、analytics 等。
加入 JavaScript
如果你需要額外的 互動效果,可以加入 JavaScript。
步驟 1:建立 extra.js
在 docs/js/extra.js 加入:
步驟 2:在 zensical.toml 載入
以模組、非同步或延遲方式載入 JavaScript
extra_javascript 的項目除了字串,也可以寫成帶有屬性的表:
[project]
extra_javascript = [
{ path = "js/extra.js", type = "module" },
{ path = "js/analytics.js", async = true },
{ path = "js/other.js", defer = true },
]
- 檔案副檔名是
.mjs時,Zensical 會自動當成 JavaScript 模組(type="module")。這個自動偵測只適用於純字串的項目。 - 因此,如果想以模組載入又要用
async,就必須明確寫出type = "module"。
自訂 404 錯誤頁面
在 overrides/ 資料夾放一個 404.html,就可以自訂找不到頁面時的畫面。這個檔案可以在網頁伺服器設定為後備頁面:
Zensical 本來就有預設的 404.html,所以只有想改內容時才需要建立。
覆寫模板區塊(建議做法)
覆寫模板有兩種方式:覆寫整個模板/partial,或覆寫模板中的區塊(block),官方建議使用區塊。
Zensical 的 main.html 繼承自 base.html。最穩當的方式是覆寫 main.html,而不是 base.html,因為 base.html 在未來版本更可能改變。
例如覆寫網站標題:
{% extends "base.html" %}
{% block htmltitle %}
<title>唯客學院 Zensical 教學</title>
{% endblock %}
如果是追加而不是取代內容,在區塊裡使用 {{ super() }} 保留原本的內容,這在加入第三方 script 時特別好用:
{% extends "base.html" %}
{% block scripts %}
<!-- 需要先執行的 script -->
{{ super() }}
<!-- 需要後執行的 script -->
{% endblock %}
主題提供的區塊:
| 區塊 | 用途 |
|---|---|
analytics |
Google Analytics 整合 |
announce |
公告列(見 頁首) |
config |
JavaScript 應用程式設定 |
container |
主要內容的容器 |
content |
主要內容 |
extrahead |
空的區塊,用來加入自訂 meta 標籤 |
fonts |
字型定義 |
footer |
頁尾(導覽與版權) |
header |
固定的頁首列 |
hero |
首頁大圖(如果有) |
htmltitle |
<title> 標籤 |
libs |
JavaScript 函式庫(頁首) |
outdated |
舊版本警告 |
scripts |
JavaScript 應用程式(頁尾) |
site_meta |
文件 head 裡的 meta 標籤 |
site_nav |
網站導覽與目錄 |
styles |
樣式表(含額外的來源) |
tabs |
頁籤導覽(如果有) |
覆寫 partial
也可以用同樣的檔名與位置取代整個 partial。例如要換掉頁尾,就建立 overrides/partials/footer.html,Zensical 就會改用你的版本(見 設定頁尾)。
自訂單頁模板
有些頁面需要不同的結構,例如首頁或參考頁。在 overrides/ 新增模板(檔名不可以和 Zensical 內建的 main.html、base.html 等重複),再用 front matter 指定給特定頁面:
MiniJinja 相容性
Zensical 使用 MiniJinja,不能呼叫任意的 Python 函式。如果覆寫中呼叫了無法用 MiniJinja 過濾器或測試取代的 Python 函式,就必須改由 Zensical 模組或其他支援的客製化機制提供。以 Material for MkDocs 9.6.18 或更新版本為基礎的覆寫,通常不需修改,見 從 MkDocs 遷移。
把主題打包成 Python 套件
想和別人分享你的主題擴充,可以把它打包成 Python 套件,讓使用者用 pip 安裝,並在設定裡用名稱引用。做法與 MkDocs 相同,透過 mkdocs.themes 進入點(entry point),所以既有的 Material for MkDocs 主題衍生品只要少量修改就能在 Zensical 執行。
建議的結構:
pyproject.toml 的重點是宣告進入點:
[project]
name = "my-theme"
version = "0.1.0"
dependencies = ["zensical>=0.0.37"]
[project.entry-points."mkdocs.themes"]
my_theme = "my_theme"
左邊的 my_theme 是使用者在設定檔中使用的名稱,右邊是套件內放主題檔案的資料夾。mkdocs_theme.yml 可以設定主題的預設值並宣告延伸自哪個主題(預設主題目前為了相容,名稱仍然是 material):
使用者安裝後這樣引用:
Zensical 比 MkDocs 更有彈性
mkdocs_theme.yml 在 Zensical 是選填的(MkDocs 的打包主題一定要有),而且 Zensical 也會從 custom_dir 讀取它,所以本機的覆寫資料夾也可以放主題設定。
總結
| 客製化項目 | 設定方式 |
|---|---|
| 修改主題顏色 | palette.primary / palette.accent |
| 修改字體 | font.text / font.code |
| 自訂 CSS | extra_css = ["css/extra.css"] |
| 自訂 Logo & Icons | theme.logo、[[project.extra.social]] |
| 自訂 HTML 結構 | 建立 overrides/,啟用 custom_dir |
| 加入 JavaScript | extra_javascript = ["js/extra.js"] |
| 模組/非同步載入 | { path = "...", type = "module" }、async、defer |
| 自訂 404 頁面 | overrides/404.html |
| 覆寫區塊 | overrides/main.html 的 {% block ... %} |
| 分享主題 | 打包成 Python 套件,用 mkdocs.themes 進入點 |
📌 這些設定能夠讓你的 Zensical 網站變得更獨特!