整体流程
夜间模式开关按钮:用来手动切换夜间模式的,会存储cookie。
自动夜间模式:当cookie为空时,浏览器时间大于22点小于6点时会自动进入夜间模式,并存储cookie。
后端配合:php判断是否有cookie,有的话直接输出夜间css,避免切换页面时网页闪烁。
具体操作
引入黑夜 css
<link href="dark.css" rel="alternate stylesheet" type="text/css" title="dark">
有title
熟悉rel属性值同时包含alternate stylesheet
的<link>
作为备选样式CSS文件加载,默认不渲染。
切换夜间模式的 js 函数
function switchNightMode(){
var night = document.cookie.replace(/(?:(?:^|.*;\s*)night\s*\=\s*([^;]*).*$)|^.*$/, "$1") || '0';
if(night == '0'){
document.querySelector('link[title="dark"]').disabled = true;
document.querySelector('link[title="dark"]').disabled = false;
document.cookie = "night=1;path=/"
console.log('夜间模式开启');
}else{
document.querySelector('link[title="dark"]').disabled = true;
document.cookie = "night=0;path=/"
console.log('夜间模式关闭');
}
}
指定时间进入夜间模式
(function(){
if(document.cookie.replace(/(?:(?:^|.*;\s*)night\s*\=\s*([^;]*).*$)|^.*$/, "$1") === ''){
if(new Date().getHours() > 22 || new Date().getHours() < 6){
document.querySelector('link[title="dark"]').disabled = true;
document.querySelector('link[title="dark"]').disabled = false;
document.cookie = "night=1;path=/"
console.log('夜间模式开启');
}else{
document.cookie = "night=0;path=/"
console.log('夜间模式关闭');
}
}else{
var night = document.cookie.replace(/(?:(?:^|.*;\s*)night\s*\=\s*([^;]*).*$)|^.*$/, "$1") || '0';
if(night == '0'){
document.querySelector('link[title="dark"]').disabled = true;
console.log('夜间模式关闭');
}else if(night == '1'){
document.querySelector('link[title="dark"]').disabled = true;
document.querySelector('link[title="dark"]').disabled = false;
console.log('夜间模式开启');
}
}
})();
php 后端判断 cookie 进行加载 css
<link href="dark.css" rel="<?php if($_COOKIE['night'] != '1'){echo 'alternate ';} ?>stylesheet" type="text/css" title="dark">
适配 Mac 的 Dark Mode
纯js判断设备是否进入了夜间模式,感谢simplify
提供代码
if (
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches
) {
alert('进入夜间模式');
}
旧版适配 Mac 的 Dark Mode的方案
需要插入段css然后用js判断css的变化,来监控是否进入夜间模式
插入 css
html {
content: "";
}
/* Light mode */
@media (prefers-color-scheme: light) {
html {
content: "light";
}
}
/* Dark mode */
@media (prefers-color-scheme: dark) {
html {
content: "dark";
}
}
前端使用 JS 检查
const mode = getComputedStyle(document.documentElement).getPropertyValue('content');
if(mode == '"dark"'){alert('进入夜间模式');}
最后
在dark.css
里重写一些元素的背景色文字色等等。
参考
1,link rel=alternate网站换肤功能最佳实现
2,给博客添加夜间模式
3,prefers-color-scheme: CSS Media Query
版权属于:泽泽社长
本文链接:https://blog.zezeshe.com/archives/night-mode-of-website.html
本站未注明转载的文章均为原创,并采用
CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!
正准备加这个功能 来参考参考
我用的这个~
也挺好,不如用纯js判断当地时间,用php国外就不准了吧
都是国内的 哈哈 就设定 PRC 中国时区
国外的ip断上次我封了 也不让访问 哈哈
最后适配mac的那个判断代码不起作用,应该用这个:
if (
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches
) {
// dark mode do something
}
我测试了起作用,不过还是你的方法好,这就更新上去,感谢!
在安卓上已经不起作用了,我的手机是ColorOS7. 开启暗色模式后, 这语句打印出的是normal
你可以访问这个试下http://beta.qqdie.com/ 打开导航栏里面有夜间模式
开启了暗色模式后,上面3条语句分别输出 false false """"
在手机上识别不出暗色模式 , win10 1909正常 , 你博客和beta那个域名也是,手机上没反应.
刚刚是我搞错了 , 我远程调试的时候关了暗色模式 , 不过问题还在 , 开启了暗色模式,但是css样式并没有生效,你的博客和beta域名那个洞一样,被强制转为黑色
手机上暗色模式的判断我没试过,我手机安卓7不存在暗色模式,哈哈
这个方法WP上可以用不?谢谢
通用的前端代码
技术有限,没弄成功!能整个WP的教程吗?
虽然有插件,但还是喜欢你这样的代码实现方法!
谢谢!
请问 PHP 后端代码抛出大量警告应该如何解决呢?
if(@$_COOKIE['night']
类似这样在if
的开头加个艾特麻烦问下!要是静态博客的判断 cookie如何判断
都一样啊@(尴尬)
对不起,在麻烦问下为啥,每次自动黑,白转换的时候都要清理缓存才能转换!
不需要清理缓存啊,就是js根据时间让css生效
我大胆推测,可以在html里写content: "light";然后直接写 Dark mode 从而省掉Light mode的几行代码。
正在找自动切换的办法,研究研究
博主大人 请问你的评论添加表情是怎么弄的,麻烦告知一下
基于这个项目改的 https://github.com/DIYgod/OwO