本站添加夜间模式

肉松 生活 2022-03-10

看到很多网站有日间模式和夜间模式的切换,于是本站也尝试做了一个。博主不懂网站制作,所以只能到处剽窃,emmm...下文中的代码都是 Ctrl+C-V 来的。

功夫不负有心人,终于找了一个使用了笨方法,使用CSS将整站显示色调反转。

css代码如下:

html, img {
    filter: invert(1) hue-rotate(.5turn);
}
img {
    opacity: .75;    
}

解释:整体将页面色调反转,将图片再次反转(负负得正),然后给图片加一层透明度75%的蒙版,在黑色模式下,使图片暗一些,不然可能会刺眼。

在<head>中加入引用CSS文件代码

<link disabled id="dark-mode-theme" rel="stylesheet" href="dark.css">

在<header>加入切换按钮

<button id="dark-mode-toggle" style="float:right;margin-left:5px;top:5px;position:relative;line-height:30px;background:0;">◑</button>

在</body>后加入脚本代码

<script>
var toggle = document.getElementById("dark-mode-toggle");
var darkTheme = document.getElementById("dark-mode-theme");

var systemDefault = null
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
    systemDefault = "dark";
} else {
    systemDefault = "light";
}

var savedTheme = localStorage.getItem("dark-mode-storage") || systemDefault;
setTheme(savedTheme);

toggle.addEventListener("click", () => {
    if (toggle.innerText === "◑" ) {
        setTheme("dark");
    } else if (toggle.innerText === "☀" ) {
        setTheme("light");
    }

});

function setTheme(mode) {
    localStorage.setItem("dark-mode-storage", mode);

    if (mode === "dark") {
        darkTheme.disabled = false;
        toggle.innerText = "☀";
    } else if (mode === "light") {
        darkTheme.disabled = true;
        toggle.innerText = "◑";
    }
} 
  </script>

完工,现在已经实现了夜间模式。

bug:1.在夜间模式下切换页面会闪过一片白,这是下一步需要思考改进的地方。(路过的大佬给一点友情指导)
2.emoji表情的色调也反被反转了,看起来有点怪。
3.手机浏览器状态栏不同步匹配黑色。


一天后更新:

1.解决切换页面会闪过一片白。有所改善,还不完善。
Initial主题有全站pjax加载方式,切换到pjax后切换页面一闪白基本消失,但使用F5刷新页面或者新开页面依旧会闪过一片白。

另外,切换到pjax后,页面顶部也多了个好看的页面加载进度条,很有高级感。但是又双叒叕遇到到新的问题:

  • 页面加载进度条经常卡很久不会结束,经过F12下的多方查找,是使用的评论框特效JS文件,貌似是语法不规范导致的报错一堆,严重拖慢了页面加载。把评论框特效干掉之后页面加载进度条恢复正常。
  • 统计代码报错也依旧严重,pjax不兼容站长统计,更换百度统计,F12下报错依旧很严重。
  • CommentFilter评论过滤器,把我自己的评论当作机器人评论。

2.代码调整
把</body>后加入的<script>脚本代码块,打包成JS文件,单独维护和引用。

3.整体效果。
目测整体效果还不错,有些地方不是很清晰。纯文字文章和图片文章没有问题,有问题2点:①emoji表情被翻转,②转载哔哩哔哩的视频界面被翻转。鉴于本站图文文章占主流,对本文实现的夜间模式总体体验良好。


参考(剽窃)来源💕💕:
https://radu-matei.com/blog/dark-mode/.
https://www.zhangxinxu.com/wordpress/2020/11/css-mix-blend-mode-filter-dark-theme/
https://bgm.tv/group/topic/366677


本文适用于Initial主题,在2024年1月本站更换主题后已不在适用。

PREV
第一时间升级了Initial主题
NEXT
减肥日记之三—放纵的一天

评论(6)

发布评论
  1. 你只在前端处理就肯定闪动,而且一个夜间模式没有必要使用localStorage,目前主题开发的主流方案都是 Cookie 来实现夜间模式,在渲染时就可以使用PHP获取 Cookie 判断了,列如<body class="<?php echo($_COOKIE['night'] == '1' ? 'night' : ''); ?>">。我的也会闪,不过是没法改的,因为我的不是服务端渲染哈哈,可以看看这个文章(https://xptt.com/653884.html),typecho一样能用。

    1. 感谢大佬的指导,不过我对PHP和CSS一窍不通,可能需要很长的时间去琢磨这个方法。

  2. 直接反色,在很多地方可见性是有问题的。我是根据 prefers-color-scheme 在每一处涉及颜色的,都做了两套。

    1. 对于我等小白来说这是最好的方法了。😂😂

      1. 暗色模式你的评论框已经看不清了。