修改思路
- 抽离夜间样式
- 增加 CSS 文件优先级
- 网页添加主题按钮
1)抽离夜间样式
- 前提 1:原主题配置文件控制昼夜是通过
style.darkmode: false # auto / always / false
来控制 stylus 生成整个网站main.css;
- 前提 2:主题样式代码中
if hexo-config('style.darkmode') == 'always'
包裹的就是夜间主题代码;
- 结论:我们把它抽离出一个单独的
ZYDark.css
文件。
2)增加 CSS 文件优先级
- 通过给 html 标签一个 ID 来取得优先级, 抽离的
ZYDark.css
都赋予这个 ID.
比如:root{--site-bg: #1c1e21;}
变成#ZYDark:root{--site-bg: #1c1e21;}
3)网页添加主题按钮
想了很多种方案都达不到主题样式一致原则.
最后发现 stellar 左下角页脚部分有 7 个位置。
就拿他来当切换按钮吧!
4)储存与功能实现
用户变量就扔到localStorage
储存,反正不清空浏览器缓存就是永久储存.
功能实现函数操作全都是一个 JS 执行, 包括给 html 标签一个 ID.
5)黑夜闪白优化
因为一些渲染顺序原因这个 js 只能放到网页靠末尾地方, 可能不是控制主题功能我还有其它功能方法, 所以结果是黑暗模式下刷新有点闪白色.
解决办法是在 head 引入一个提前 js,即判断localStorage
是黑暗就马上给 html 加黑色 ID, 后续渲染就没问题了!!!
代码
样式
复制以下代码并重命名为 ZYDark.css,放至本地路径/blog/source/custom/css 下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| --site-bg: --card: --block: --block-border: --block-hover: --text-p0: --text-p1: --text-p2: --text-p3: --text-p4: --text-meta: --text-code: } @media screen and (max-width: 667px) { --site-bg: } }
--blur-bg: rgba(0,0,0,0.5); }
--blur-bg: rgba(0,0,0,0.4); }
--theme: --theme-bg1: --theme-bg2: --theme-border: --text-p0: --text-p1: --text-p2: }
--theme: --theme-bg1: --theme-bg2: --theme-border: --text-p0: --text-p1: --text-p2: }
--theme: --theme-bg1: --theme-bg2: --theme-border: --text-p0: --text-p1: --text-p2: }
--theme: --theme-bg1: --theme-bg2: --theme-border: --text-p0: --text-p1: --text-p2: }
--theme: --theme-bg1: --theme-bg2: --theme-border: --text-p0: --text-p1: --text-p2: }
--theme: --theme-bg1: --theme-bg2: --theme-border: --text-p0: --text-p1: --text-p2: }
--theme: --theme-bg1: --theme-bg2: --theme-border: --text-p0: --text-p1: --text-p2: }
--theme: --theme-bg1: --theme-bg2: --theme-border: --text-p0: --text-p1: --text-p2: }
--theme-border: --theme-bg1: --theme-bg2: --text-p0: --text-p1: --text-p2: --text-p3: --text-code: }
--theme-border: --theme-bg1: --theme-bg2: --text-p0: --text-p1: --text-p2: --text-p3: --text-code: }
--text-p0: --text-p1: --text-p2: --text-p3: --text-code: }
box-shadow: none; }
/* waline评论样式 */
padding: .375em; font-weight: bold; font-size: 1.25em; color: }
--waline-white: --waline-light-grey: --waline-dark-grey: /* 布局颜色 */
--waline-color: --waline-bgcolor: var(--block); --waline-bgcolor-light: --waline-border-color: --waline-disable-bgcolor: --waline-disable-color: /* 特殊颜色 */ --waline-bq-color: /* 其他颜色 */ --waline-info-bgcolor: --waline-info-color: }
|
函数
复制以下代码并重命名为 ZYDark.js,放至本地路径/blog/source/custom/js 下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| /** * 监听系统主题 * @type {MediaQueryList} */ var OSTheme = window.matchMedia('(prefers-color-scheme: dark)'); OSTheme.addListener(e => { if (window.localStorage.getItem('ZYI_Theme_Mode') === 'Moss') { ThemeChange('Moss'); } }) /** * 修改博客主题 * @param theme 亮为light,暗为dark,自动为auto * @constructor */ const ThemeChange = (theme) => { if (theme === 'light' || (theme === 'Moss' && !OSTheme.matches)) { document.querySelector("html").id = "ZYLight"; document.querySelector("#start > aside > footer > div > a:nth-child(6)").style.filter= 'grayscale(0%)'; document.querySelector("#start > aside > footer > div > a:nth-child(5)").style.filter= 'grayscale(100%)'; } else { document.querySelector("html").id = "ZYDark"; document.querySelector("#start > aside > footer > div > a:nth-child(5)").style.filter= 'grayscale(0%)'; document.querySelector("#start > aside > footer > div > a:nth-child(6)").style.filter= 'grayscale(100%)'; } if (theme==='Moss'){document.querySelector("#start > aside > footer > div > a:nth-child(7)").style.filter= 'grayscale(0%)';} else {document.querySelector("#start > aside > footer > div > a:nth-child(7)").style.filter= 'grayscale(100%)';} window.localStorage.setItem('ZYI_Theme_Mode', theme); } /** * 初始化博客主题 */ switch (window.localStorage.getItem('ZYI_Theme_Mode')) { case 'light': ThemeChange('light'); break; case 'dark': ThemeChange('dark'); break; default: ThemeChange('Moss'); } /** * 切换主题模式 */ document.querySelector("#start > aside > footer > div > a:nth-child(5)").onclick = () => { ThemeChange('dark'); } document.querySelector("#start > aside > footer > div > a:nth-child(6)").onclick = () => { ThemeChange('light'); } document.querySelector("#start > aside > footer > div > a:nth-child(7)").onclick = () => { ThemeChange('Moss'); }
|
提前量
根目录/_config.yml
1 2 3 4 5 6 7 8 9 10
| inject: head: - | <script> if (window.localStorage.getItem('ZYI_Theme_Mode')==='dark' || (window.localStorage.getItem('ZYI_Theme_Mode')==='Moss' && window.matchMedia('(prefers-color-scheme: dark)').matches)){ document.querySelector("html").id = "ZYDark"; } </script>
|
引入样式与函数
博客目录/_config.yml
1 2 3 4 5 6
| inject: head: - <link rel="stylesheet" href="/custom/css/ZYDark.css"> script: - <script type="text/javascript" src="/custom/js/ZYDark.js"></script>
|
自定义博主配置
darkmode
用false
意味对主题而言保持永远白昼(才有了我们的操作空间)
- 然后
footer.social
这部分我对应是 567, 懒得改 JS 的可以前面也加四个社交按钮.
- 博客目录/_config.stellar.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| style: darkmode: false
footer: social: github: icon: '<img src="https://upyun.thatcdn.cn/public/img/icon/github-logo2.png"/>' url: https://github.com/ThatCoders music: icon: '<img src="https://upyun.thatcdn.cn/public/img/icon/neteasemusic-icon.png"/>' url: https://music.163.com/ bili: icon: '<img src="https://upyun.thatcdn.cn/public/img/icon/bilibili-icon.png"/>' url: https://space.bilibili.com/1664687779 card: icon: '<img src="https://upyun.thatcdn.cn/public/img/icon/weChat.png"/>' url: https://muselink.cc/naive Moon: icon: '<img id="ThemeM" src="https://upyun.thatcdn.cn/public/img/icon/Moon.png"/>' url: javaScript:void('永夜'); Sun: icon: '<img id="ThemeL" src="https://upyun.thatcdn.cn/public/img/icon/Sun.png"/>' url: javaScript:void('永昼'); AI: icon: '<img id="ThemeAI" src="https://upyun.thatcdn.cn/public/img/icon/AI.png"/>' url: javaScript:void('跟随系统');
|
感谢
本文参考钟意的博客。此文用于记录。在此感谢原作者。