在 Icarus 主题中实现黑白主题切换教程
适用于 Hexo + Icarus ≥ 3.x
1️⃣ 写在前面
Icarus 主题优雅,但 官方并未提供主题便捷切换的 方法,很多同学:
- 不会 Styl → CSS 编译
- 切换主题时 页面闪屏
- 返回主页 按钮状态错乱
- 黑夜主题 黄色导航栏丢失
本篇一次性解决以上痛点,最终效果如本博客
2️⃣ 方案总览
步骤 | 作用 | 文件 |
---|---|---|
① 编译 CSS | 把官方 .styl 变为 .css | dist/css/ |
② 变量驱动 | 用 CSS 变量换色,0 闪屏 | theme-vars.css |
③ JS 绑定 | 按钮事件 & PJAX 缓存修复 | theme-toggle.js |
④ 按钮插入 | 放在搜索按钮前 | navbar.jsx |
3️⃣ 第 ① 步:把官方 .styl
编译成 .css
3.1 安装依赖(一次性)
1 | cd themes/icarus # 或 node_modules/hexo-theme-icarus |
3.2 一键编译
1 | npm run build:css # 输出 dist/css/default.css & cyberpunk.css |
如果提示
Missing script
,直接跑:
1 | npx stylus source/css/ -o dist/css/ --compress |
3.3 复制到博客
将生成的 css 文件复制到你的资源文件夹。
1 | cp dist/css/*.css ../../source/css/ |
4️⃣ 第 ② 步:CSS 变量 换色
4.1 新建文件
source/css/theme-vars.css
1 | /* 主题切换核心动画 */ |
5️⃣ 第 ③ 步:新建切换脚本
source/js/theme-toggle.js
1 | (function () { |
6️⃣ 第 ④ 步:把按钮插到搜索按钮前
layout/common/navbar.jsx
在 <div class="navbar-end">
末尾、搜索按钮 之前:
1 | <div class="navbar-end"> |
7️⃣ 第 ⑤ 步:把文件挂到 <head>
layout/common/head.jsx
1 | <link data-pjax rel="stylesheet" href={url_for('/css/' + variant + '.css')} /> |
8️⃣ 一键测试
1 | hexo clean && hexo s |
- 点击右上角 🌙 → ☀️ → 0.6 s 过渡
- 进入文章 → 返回主页 → 按钮状态 零延迟
- 黑夜主题:导航栏、页脚、按钮 官方主题配色·
9️⃣ 常见问题 FAQ
现象 | 原因 | 解决 |
---|---|---|
按钮点击无反应 | 按钮 id 写错 / JS 没加载 | 控制台 document.getElementById('theme-toggle') 检查 |
黄色没出现 | 没覆盖官方 CSS | 确认 cyberpunk.css 已放 source/css |
页面全白 | 兜底 * {} 覆盖了图片 | 用上方 修正版 CSS |
🔟 结语
至此,你拥有:
官方 Cyberpunk 主题随心切换
0.6 s 丝滑过渡
特别提醒:代码块的主题推荐使用 github-vsc 不然会导致黑夜和白天的样式问题。
在 Icarus 主题中实现黑白主题切换教程