前段时间 Safari Technology Preview 中添加了对媒体查询 prefers-color-scheme
的支持,该特性可以帮助我们的网页自动切换到深色模式以适配 Mac 中的 Dark Mode(深色模式)。虽然目前 Mojave 10.14.3 版本的 Safari 中尚未添加该特性,但其将随着 Safari 12 在下个小版本(macOS 10.14.4, 10.13.6 and 10.12.6)更新中获得支持。目前最新版本的 Safari 及 Chrome 均已支持该特性。
prefers-color-scheme
可以检测到用户是否已请求操作系统使用浅色或深色主题,其有三个可选的选项:
no-preference
:未能检测到用户的选择light
:用户倾向于使用浅色的主题dark
:用户倾向于使用深色的主题,例如用户开启了 Mac 中的深色模式
所以,在这里我们可以使用 prefers-color-scheme: dark
来检测用户是否开启了 Dark Mode。
开始使用
prefers-color-scheme
的使用很简单,和普通的 Media Query 一样:
/* 操作系统及浏览器未支持或用户未开启 Dark Mode */
body {
background-color: white;
color: black;
}
@media (prefers-color-scheme: dark) {
/* 操作系统及浏览器支持且用户开启了 Dark Mode */
body {
background-color: black;
color: white;
}
}
这样,用户在平时看到的是白色背景,而开启了深色模式后,页面就会自动变为黑色背景。当然,夜间模式的适配需要做的工作还很多,需要你慢慢调整各元素的颜色等。
顺便说一下,目前版本中,如果使用 @supports (prefers-color-scheme: dark)
包裹上述 Media Query 代码,则可能不会生效,这个看上去应该是目前版本浏览器的 Bug。
通过 JavaScript 获取是否开启了深色模式 Dark Mode
很多网站已经有了夜间模式,使用 prefers-color-scheme
适配可能比较麻烦,那么可以使用 JS 获取用户是否开启了 Dark Mode (深色模式),然后按照旧的逻辑开启夜间模式。
这种模式有个缺点:无法像直接使用 Media Query 的情况一样,在用户开启深色模式的时候,已打开的浏览器页面会自动变为深色模式,只有刷新页面或新进入的用户才会使用深色模式,不过个人感觉体验上影响不大。
当然,JS Api 是没有的,这里只能通过迂回的方式通过 JS 获取。
评论区的大佬告诉我有
用过 matchMedia
方法可以直接判断浏览器当前是否倾向于使用深色模式:
let prefersDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
if (prefersDarkMode) {
// 搞事情
}
监听事件
通过监听 matchMedia
的 change
事件,可以在用户切换深色/浅色模式的时候,将浏览器中已打开的页面自动切换为系统对应的模式。
let media = window.matchMedia('(prefers-color-scheme: dark)');
let callback = (e) => {
let prefersDarkMode = e.matches;
if (prefersDarkMode) {
// 搞事情
}
};
if (typeof media.addEventListener === 'function') {
media.addEventListener('change', callback);
} else if (typeof media.addListener === 'function') {
media.addListener(callback);
}
我就想看看
通过 JavaScript 已经可以获取是否开启深色模式 Dark Mode 了
用 window.matchMedia("(perfers-color-schme:dark)").matches 来获取布尔变量
∠( ᐛ 」∠)_
window.matchMedia('(prefers-color-scheme: dark)').matches
老哥,你打错了
嘿嘿嘿,眼拙了,谢谢指正@(小乖)
感谢大佬,已经用上了,文章不知道还有没有机会更新@(吐舌)
用上了::quyin:1huaji::
更新了::quyin:1huaji::
我有个疑问,为啥要兼容ie啊,mac上有ie吗?即使有,真的会有人用吗::quyin:hematemesis::
mac上的ie不清楚,但win上的ie我觉得用的人还是挺多的,比如中国人民银行征信中心是必须要ie才能上去,真的麻烦,这是我被迫留住ie的愿意@(喷)
干得漂亮
可惜快活哥我没有MAC