自定义样式与注入
注入配置
1 | custom: |
| 配置项 | 注入位置 | 时机 |
|---|---|---|
head |
<head> 内,所有主题 CSS 之后 |
页面解析阶段 |
body_end |
</body> 之前 |
页面解析末尾 |
css |
<head> 内的 <link rel="stylesheet"> |
页面解析阶段 |
js |
</body> 之前的 <script src> |
页面解析末尾 |
post_footer |
每篇文章正文之后、评论区之前 | 模板渲染阶段 |
加载顺序
1 | <head> |
因为自定义 CSS 排在主题之后,同优先级的规则会覆盖主题,不需要 !important。
自定义 CSS
第 1 步:创建文件
把样式文件放到站点 source/css/custom.css。
第 2 步:在配置里登记
1 | custom: |
无需写 .css 后缀,也无需写路径前缀——主题会拼接为 /css/custom.css。
可以登记多个:
1 | custom: |
第 3 步:重新生成
1 | hexo clean && hexo g |
常见定制示例
1 | /* 缩小正文最大宽度,让长文更易读 */ |
优先用设计令牌
覆盖样式之前,先检查主题是否已经提供了令牌。改令牌比写覆盖规则更稳——它不会在主题升级后失效。
主题在 <head> 内联输出了这几个核心令牌:
1 | :root { |
在自定义 CSS 里直接改写即可:
1 | :root { |
下面这些配置本质上就是写令牌,能用配置就别写 CSS:
| 你想改 | 配置项 | 等价令牌 |
|---|---|---|
| 主色 | appearance.primary |
--xfm-primary |
| 导航高度 | navbar.height |
--xfm-nav-h |
| 圆角 | appearance.radius |
--xfm-radius 三兄弟 |
自定义 JS
方式一:文件注入
放到站点 source/js/custom.js,然后:
1 | custom: |
方式二:内联片段
1 | custom: |
可用运行时 API
自定义脚本执行时,主题的运行时已就绪(custom.js 在 core.js 等之后加载),可以直接使用:
1 | // 档位 |
示例:加一个”切换桌面版”按钮
1 | // source/js/custom.js |
custom.js 里的每个文件都会生成独立的 <script src> 标签,按数组顺序加载。不要依赖跨文件的变量声明顺序,或者干脆合并成一个文件。
注入 HTML
head
1 | custom: |
在 <head> 末尾注入。适合放:
- 额外的
<meta> - 站外字体预连接
<link rel="preconnect"> - 第三方验证脚本
body_end
1 | custom: |
在 </body> 前注入,在所有主题脚本之后。
post_footer
1 | custom: |
只作用于文章页,位置在正文之后、分享与版权卡之前。
body_end |
post_footer |
|
|---|---|---|
| 作用范围 | 全站每个页面 | 仅文章页 |
| 注入位置 | </body> 前 |
正文之后 |
| 典型用途 | 全局脚本 | 文章末尾的固定说明 |
完整的定制流程
翻一遍配置总览,确认目标效果是否已有配置项。有就用配置。
需要调视觉时,看是否能用 --xfm-* 令牌表达。能用就用令牌。
前两步都不满足,才写自定义 CSS。规则保持最小化,附上注释说明用途。
三档都看一遍(?__tier=mobile / tablet / desktop),深浅色都切一遍,确认没有破坏现有布局。
直接在 themes/xfm/source/css/ 里改样式,主题升级时会被整目录覆盖。所有定制都应通过 custom 配置或站点级文件完成。
排查
- 确认文件放在站点的
source/css/,不是主题的 - 确认
custom.css: [custom]已登记(不是字符串,是数组) - 执行过
hexo clean - 浏览器强制刷新(
Ctrl/Cmd + Shift + R)或开发者工具里勾选”禁用缓存” - 检查选择器优先级——主题有些规则带
[data-tier]前缀,优先级较高
说明脚本执行时主题运行时还没到位。两种解法:
1 | // 解法 1:等 DOM 就绪 |
1 | // 解法 2:轮询等待(更稳妥) |
通常不需要。自定义 CSS 在主题之后加载,同优先级即覆盖。若确实需要,说明你的选择器优先级低于主题(例如主题用了 html[data-tier="mobile"] .xxx),此时更好的做法是提升你的选择器具体度:
1 | /* 而不是 */ |
评论