为了让眼睛好受点,以及让博客看起来高级一些
咱决定为博客添加一个深色模式
思路
实现的思路有几种,可以通过覆盖 CSS 样式的方式
还能通过 Media Query 来实现,这是大部分人选择的方式
咱碍于技术原因就使用更为简单的覆盖 CSS 方式了
因为懒以及抱着能用就行的态度,只实现了简单的开关以及根据系统模式进行切换,没有根据时间自动进行切换的功能
实现
既然是覆盖,那咱们就需要制作两套 CSS
关于深色模式的背景色,Google 推荐将深色表面和 100% 白色文字的对比度至少设置为为 15.8:1
以防止对比度过高让眼睛感受到疲劳
这里推荐使用 #252d38
是咱觉得比较舒服的背景色(从别的大佬那偷来的
想法就是点击开关后,根据当前使用的模式来进行 CSS 的添加、删除操作
并且可以覆盖系统模式储存的当前使用的模式值,保证下次网页加载时也是使用开关的值
同理,系统模式切换网站也要同步切换,并覆盖开关储存的值
- 对于不兼容的浏览器或操作系统,访客依然可以通过开关手动切换显示模式
- 对于兼容的浏览器或操作系统,系统模式能够实现在两种显示模式之间切换
- 在兼容的浏览器或操作系统上,用户还可以通过开关覆盖当前的显示模式
具体的代码实现可以看这里 darkmode
提示
说几个需要注意的地方:
系统的模式可以通过 matchMedia 获取到,封装一下就行了
const getModeFromSystem = () => {
window.matchMedia('(prefers-color-scheme: dark)').matches ? "dark" : "light";
}
监听系统模式的改变可以使用
matchMedia
配合 addEventListener 方法
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
if (event.matches) {
// dark
} else {
// light
}
});
使用 color-scheme 属性可以让受支持的浏览器用上深色模式滚动条
在样式表中添加:
/*
The page supports both dark and light color schemes,
and the page author prefers dark.
*/
/* light.css */
:root {
color-scheme: light;
}
/* dark.css */
:root {
color-scheme: dark;
}
也可以添加在 head
元素中
<!--
The page supports both dark and light color schemes,
and the page author prefers dark.
使用这种方式的话咱是使用 js 对 content 的内容进行修改
-->
<meta name="color-scheme" content="dark light">
如果你的评论系统是 Disqus
且支持了深色模式滚动条
需要在深色模式的 CSS 中添加:
iframe {
color-scheme: light;
}
不然就会出现下图中的玄学问题:

要是有大佬吐槽咱的代码,咱也只能弱弱的回一句:
能用就行(
部分引用至 Sukkaw 的 你好黑暗,我的老朋友 —— 为网站添加用户友好的深色模式支持