博客园主题「星轨 Stellaris」:零依赖、三态切换与一套完整设计令牌
一套「拿来就能贴」的开源博客园主题:不用 npm、不用框架、不用本地构建,把三个文本粘进后台就能上线;视觉收进设计令牌,改一处即可换肤。
先看效果
不贴截图了,直接看线上更准:
- 本站即在线效果:https://www.cnblogs.com/home(首页、列表、侧栏、深浅三态都在这里)
- 文章页效果示例:https://www.cnblogs.com/home/p/23550137(正文、代码块、目录 TOC、复制按钮)
这两个地址都是真实在跑的博客,不是效果图。
为什么又做一套主题
博客园的美化有个绕不开的前提:DOM 骨架由平台皮肤给定,能动手的地方基本只有后台那三个输入框——「页面定制CSS代码」「页首HTML代码」「页脚HTML代码」。于是常见的做法是换一套配色、加一张头图、再堆几个插件脚本;配置和平台结构混在一起,换台博客往往就到处是写死的绝对路径和 404。社区里这类分享并不少,BNDong 的《关于本博客样式》、zouwangblog 的《博客园二次元主题——Sakura》都是常被翻到的参考,也把「主题要讲清怎么装、怎么改」这件事立住了。
「星轨」想补的是另一层:把平台不可改的 DOM 与主题自己注入的节点划清边界,颜色、字体、间距、圆角、描边、动效、层级、断点、布局全部收进一份设计令牌(tokens)作为唯一真源,语义层不出现任何色值字面量;运行时则是零依赖的原生 JS,构建脚本也只用 Node 内置模块。换句话说,它更像一套可以维护的主题工程,而不是一份配色清单。
设计取向
一句话概括品牌:深夜为底,轨道为线,光有温度,等宽为骨。
- dark-first:深色是设计基线与默认视觉形态(「默认」仅指设计层面;运行时
theme默认为"auto",跟随系统,并非恒为深色);浅色不是把深色反色,而是一套逐项平行推导的独立配色。比如渐变终点在深色用暖金#f0c987,到了白底就换成深琥珀#8f5210——因为亮金在白底上对比度不够,冷暖分工不能靠镜像糊过去。 - 三态:
auto跟随系统、dark常驻深色、light常驻浅色,切换状态可记忆。 - 冷暖分工:主色是冷蓝
#5fb2ff,管技术性的链接、强调与焦点;暖金#f0c987管人(品牌节点、标题渐变终点),等宽字体扛日期、阅读时长这类元信息。
特性与自检数字
对比度按每套主题下的四级背景底色(画布 / 抬升 / 表面 / 悬停)逐一复算并取最差值:
| 底色 | 正文 | 次要 | 弱文字 | 链接 | 暖色/渐变终点 | UI 边界 | 主按钮 |
|---|---|---|---|---|---|---|---|
| 深色 | 12.46:1 | 7.21:1 | 5.14:1 | 6.45:1 | — | 3.92:1 | 8.28:1 |
| 浅色 | 13.89:1 | 6.52:1 | 5.24:1 | 6.21:1 | 5.24:1 / 4.97:1 | 4.24:1 | 5.24:1 |
文字 ≥4.5:1、UI 边界 ≥3:1,两套配色都达标。代码块按 #0b1118 固定深色单独自检:前景 #dce6f2 15.03:1、#cdd9e8 13.26:1、复制成功色 #7ee0a6 11.83:1。
这些是主题自检算出来的对比度,不是任何排名或第三方评测,只代表「按 WCAG 门槛逐项核过」。
其余特性:
- 阅读增强:三态主题切换、阅读进度条、返回顶部、目录 TOC、代码块一键复制(含行号槽)、图片灯箱。
- 响应式:窄屏(≤640px)侧栏落到正文下方,不横向溢出。
- 零依赖:
build.js只用 Node 内置模块;页脚脚本是原生 JS,不引任何库。 - 三框粘贴:交付物就是三个可直接粘贴的文本,不要求使用者本地构建。
三步安装
前置(重要,漏了会表现为「样式没生效」)
- 博客园后台 →「设置」,把博客皮肤设为 SimpleMemory,并勾选 「禁用模板默认CSS」。
- 页脚要放
<script>,需先向博客园申请 JS 权限(未开通时脚本不会执行)。 - 打开
dist/下对应的.paste.*文件,整份复制。
| 步骤 | 后台输入框 | 粘贴文件 | 内容 |
|---|---|---|---|
| 1 | 页面定制CSS代码 | dist/custom.paste.css |
主题 CSS(已去前导空白) |
| 2 | 页首HTML代码 | dist/page-begin.paste.html |
内联 SVG favicon(data URI)+ loading spinner,无 JS |
| 3 | 页脚HTML代码 | dist/page-end.paste.html |
配置段(第 1 段)+ 可选资源条件注入器 + 增强主脚本 |
还有一种「精简版」装法:CSS 与页首两框完全不变,只把页脚换成
dist/page-end.cdn.paste.html(约 2 KB)——配置段和两个可选资源注入器仍内联,约 50 KB 的增强主脚本dist/stellaris.js改走 jsDelivr 外链。好处是改配置、升级增强脚本都不用重贴 44 KB 的大框;代价是依赖 CDN 可用性(挂了只影响 TOC、复制、灯箱等交互增强,视觉样式仍完整),也可随时切回上面的完整离线版。仓库 README 里两种装法并列,按自己的情况选一种,不要混贴。
两点容易踩:
- 只能用
dist/*.paste.*。后台 CodeMirror 开着自动缩进,直接贴带缩进的文本会逐行累积,*.paste.*已去掉每行前导空白,重复粘贴幂等。不要在框里原有内容末尾手工追加补丁,也不要用单行压缩版。 - CodeMirror 的「二次 Ctrl+A」陷阱。三个框下面都藏了一个真实
<textarea>,表单提交读的是它的值。每个框都按这个顺序做一遍:点进编辑器 →Ctrl+A全选 →Delete清空 →Ctrl+V粘贴 → 再按一次Ctrl+A→ 保存。漏掉第二次全选,存下来的可能只是选区片段。完整踩坑、保存后读回确认与 CDN 缓存戳的排查见仓库内docs/deployment.md。
配置:window.XM
改配置不用重贴主脚本、不用动另外两个框,只在「页脚HTML代码」框里编辑带注释的那一小段 window.XM 即可。下面这段即 dist/config.paste.html 的配置段(注释按中文重排):
<script>
window.XM = {
theme: "auto", // "auto" 跟随系统 | "dark" 常驻深色 | "light" 常驻浅色
accent: null, // 例:"#FF7A59",留 null 用默认冷蓝 #5fb2ff
logo: null, // 例:"https://.../avatar.png",留 null 用平台默认
analyticsId: null, // 百度统计 ID(32 位十六进制);留 null 完全不加载
cursorEffects: "https://blog-static.cnblogs.com/files/home/cursor-effects.js", // 原作者资源,换博客请替换或置 null
cursorUrl: null // 自定义光标 URL;留 null 用 CSS 默认
};
</script>
| 字段 | 默认 | 说明 |
|---|---|---|
theme |
"auto" |
三态主题 |
accent |
null |
覆盖主强调色,留 null 用默认冷蓝 #5fb2ff |
logo |
null |
头像;加载失败静默回退平台默认 |
analyticsId |
null |
百度统计 ID;默认关闭,只接受合法 32 位 ID,否则不创建脚本、不发请求 |
cursorEffects |
原作者博客路径 | 光标特效脚本;只接受合法 http(s):// |
cursorUrl |
null |
自定义光标;留 null 用 CSS 默认 |
非法值一律回落默认、不抛错,写错最多让该项回到默认,不会把整段脚本弄崩。需要更细的开关(features / selectors / debug)时,在 window.XM 里自行追加一行即可。
首次使用必读(换博客必改):
analyticsId默认null,意味着统计默认关闭,不加载脚本、不发任何请求;要开启请填自己的 32 位 ID,否则保持null。cursorEffects默认指向原作者博客/home/路径下的cursor-effects.js,把主题搬到自己的博客时必须换成自己的 URL,或置null关闭,否则会 404。这两项(连同cursorUrl)都集中在配置段,改这里就行,不用重贴 CSS / 页首。
另外 dist/config.paste.html 只是配置段的独立快照,供查看 / 单独复制用,不是第四个粘贴框——页脚框里已经包含这段。
源码与更新
- 仓库地址:https://github.com/guolunwei/cnblogs-theme-stellaris
- License:MIT
源码、文档与版本变更记录都在仓库里。
致谢
- 底座是博客园官方皮肤 SimpleMemory——主题只在它的 DOM 骨架上叠加样式与增强,不改动皮肤前提;也感谢 BNDong 等前辈在博客园主题美化上的分享与铺垫。
- 自定义光标
mouse.ico与cursor-effects.js(光标特效)是原博客的可选保留项,并非主题自带:它们和百度统计一起已抽成cursorUrl/cursorEffects/analyticsId三个配置项,去掉也不影响主题其余功能。
已知限制
如实写几条,免得被当成「装上就完美」:
- 真机移动端视觉与人工读屏(NVDA / VoiceOver)尚未验收;结构化、可自动化的检查全绿,不等于「已完成无障碍验收」。
- Safari / macOS 对 SVG favicon 支持有限,可能需要
rel="mask-icon"或一次性 PNG 兜底。 - 主流平台的
og:image抓取器不接受 data URI / SVG,通常要求 http(s) 绝对 URL 的位图;仓库里的封面 SVG 只是资产,社交预览图需自行上传 PNG。 - 代码块固定深色是刻意设计:浅色模式下代码区仍保持
#0b1118深色底,以保证语法高亮与复制按钮的对比度,不是漏改。
有问题或建议,欢迎到仓库提 issue。

浙公网安备 33010602011771号