Hexo - NexT 8 主題深度個性化方法
前言
不知不覺這個站點已經建立近半年了。正好又是假期,便想着能不能給站點加點新的東西,順便也學點新知識。希望達成的目標是:
- 對主題進行較深度的個性化;
- 不修改主題文件夾內的所有文件,以便更新。
之前一直使用對新手十分友好的 Redefine 主題,配置起來非常方便。但鑑於本次改造的目標是深度魔改,所以只好忍痛割愛,轉用擴展性更好的 NexT 主題。作為 Hexo 的常年大熱主題,前人的經驗在網絡上已經相當豐富,然而一旦涉及到深度美化,往往要改動主題源代碼,令我十分為難。幸好後來總算找到了一系列優雅的修改方法,兩個目標才得以完成。這一摸索的過程對仍然是新手的我來說實在是痛並快樂著,所以在此將我的修改方法記錄下來,以備不時之需。由於本人實在沒什麼技術可言,如果其中一些有更好的實現方法,還請告知我以助改進。
過程
準備
在最開始,如果你還在直接使用 /themes/next/_config.yml
作為 NexT 主題配置文件,強烈建議根據官方文檔指引改為使用 /_config.next.yml
。
自定義 CSS
根據 NexT 文檔的介紹,可使用 styles.styl
文件來在不修改主題源代碼的情況下實現對網站樣式的修改,具體過程如下:
首先,在主題配置文件中找到 custom_file_path
一節,將style
一行取消註釋:
1 | custom_file_path: |
然後,在 /source/_data
下新建名為 styles.styl
的文件,直接在其中添加 CSS 規則集,NexT 就能直接用該文件覆蓋所選擇的元素的原有樣式。譬如,想讓站點的字號變大,只需要在該文件中添加以下代碼:
1 | body{ |
比較方便且可視化的做法是,在測試頁使用 F12 進行修改,調整到滿意後再將代碼直接複製進 styles.styl
;當然也可以自行撰寫新的規則,讓它能夠滿足更多細化的需要。
插入 HTML:通過注入器
根據 Hexo 文檔,Hexo 提供了注入器擴展,以「將靜態代碼片段注入生成的 HTML 的 <head>
和 / 或 <body>
中」。說人話,就是可以將一段自定義的 HTML 插入到網頁的相應位置,從而在網頁上添加新的元素內容。本站的頁眉與頁腳均以此法添加。
首先在在博客根目錄下找到 scripts
文件夾(如果沒有則新建),然後在其中新建 injector.js
文件,這樣博客啟動時就會自動加載這個腳本。隨後就可以向其中添加注入器,其格式為:
1 | hexo.extend.injector.register(entry, value, to); |
entry
值用於指示注入代碼的位置,value
值用於指示注入代碼的內容(也就是將自定義的代碼寫在這裏),to
值用於指示注入器會在哪些頁面生效。關於 entry
和 to
所支持的取值以及示例,請直接參照官方文檔,在此處不再贅述。
注入器可以配合 styles.styl
使用,以達到結構與樣式分離的目的。
根據 NexT 文檔,該主題同樣提供了注入功能,並且比起 Hexo 注入器支持更多注入點。但我並沒能完全理解其使用方式,還請不吝賜教。不過幸好,NexT 還提供了另外的方法來在特定位置插入代碼,參見下一節。
插入 HTML:通過自定義文件
運用與 styles.styl
類似的方法,同樣可以向網頁中插入 HTML 代碼片段。讓我們回到這裏:
1 | custom_file_path: |
只需將需要添加代碼的部分取消註釋,然後在 /source/_data
下新建對應名稱的文件,在其中撰寫 HTML 代碼,就可以實現功能。譬如,想要在 header
部分添加頁眉,就取消掉 header
一行的註釋並新建文件,隨後可以這樣寫:
1 | <div class="custom-header">我是頁眉</div> |
然後在 styles.styl
中給 custom-header
添加想要的樣式。
修改生成文本:通過修改默認翻譯
根據 NexT 文檔,可以使用數據文件來修改當前語言的默認翻譯。藉助這一功能,可以將網頁中自動渲染生成的文本改為想要的文本。
首先,在 /source/_data
下新建 languages.yml
。然後打開 /themes/next/languages
,在其中找到當前語言的對應文件,打開它,就能看到所有生成文本對應的翻譯。在 languages.yml
中添加你想要的內容,覆蓋便會完成。更多詳細內容可以在 /themes/next/languages
中的 README.md
中瞭解,此處簡單舉一例:
譬如,想要修改文章末尾附帶的版權聲明內容,讓它變得更禮貌一些,那麼首先在語言文件中找到版權聲明對應的翻譯(以 zh-TW.yml
爲例):
1 | copyright: |
然後回到 /source/_data/languages.yml
,在其中添加新的文本:
1 | zh-TW: |
修改完成。
修改生成文本:通過 JavaScript
修改生成文本還有一種略顯粗暴的方法,就是使用 js 直接修改 HTML 內容。此處直接通過舉例說明:
首先獲取需要修改處的類名。比方說希望修改側邊欄處的「文章目錄」為「章節」,那麼在測試頁 F12,獲得其類名為 sidebar-nav-toc
。
然後在 /source/js
下新建一個 chapters.js
,在其中添加用於修改的代碼:
1 | const ch = document.getElementsByClassName("sidebar-nav-toc"); |
最後使用注入器或自定義文件,將調用該腳本的 HTML 代碼插入網頁,具體請參照先前的章節。
更多
如果你和我一樣也是對代碼幾乎一竅不通的初心者,這些使我受益匪淺的文章 / 站點可能會對你有幫助:
- 文檔 | Hexo
- Documentation | NexT
- 打造個性超讚博客 Hexo + NexT + GitHub Pages 的超深度優化 | reuixiy
- CSS:層疊樣式表 | MDN(如果不清楚想要的效果如何用 CSS 實現,可以在這裏查找。)