没想到连傲娇不羁的微信,都已经屈服于 Apple 爸爸的霸权,开始支持Dark Mode
。
识别 dark
在 html 页面中,识别 Dark Mode
的方式很多,比如
picture
和 source
标签,用来设置不通的图片
1 | <picture> |
媒介查询可以支持:
1 | @media (prefers-color-scheme: dark) { |
js 中也可以获取:
1 | var darkMedia = window.matchMedia('(prefers-color-scheme: dark)') |
浏览器 dark
虽然页面中识别了 dark 模式,但是浏览器本身可能也有 dark 的机制。所以,你可以在 html 中使用 meta
和 css
通知浏览器,告诉他你支持哪些模式,用来触发浏览器的 dark 机制(具体的机制要看了浏览器了)。
meta 中可以支持:
1 | <meta name="color-scheme" content="light dark"> |
css 中可以支持:
1 | :root { |
实际应用
我在博客中加了个 switch 按钮,用来切换 dark mode
。
写的时候突然脑洞大开,利用mix-blend-mode
,做了一个反色的背景版。如果整体配色合适的话,用mix-blend-mode
也许能够刚刚好配合出一个新的主题呢。甚至可以利用mix-blend-mode
来做一些特效,比如 可以写个动画,由小圆扩散为全屏幕、由左扩散到右的反色滤镜,很多网站都有这样的设计。
当然,也一定要小心谨慎,因为mix-blend-mode
会覆盖当前层级的所有展示,也许会影响你文中的图片展示。
回到主题,在知道如何判定dark模式之后,只需要根据不通模式,区分一下样式即可。
比如可以利用 @media (prefers-color-scheme: dark)
来区分dark模式,修改需要改动的样式或者 css 变量。
但是由于是使用 media 来自动切换,如果需要支持手动修改主题,也就变得更麻烦。所以如果要支持手动切换主题的话,更适合使用动态修改标签类名等功能(如 body、body.dark等 )来进行切换。
我在博客中使用了 media 来区分 dark 模式下的变量,使用 matchMedia 监听系统本身的主题,使用 localStorage 来存储用户已经选择的主题。
1 | <!-- 有点无聊,用 checkbox 和 css变量 组合了一下 ,写了个 switch 来切换主题。 --> |
我使用@media (prefers-color-scheme: dark)
来确定无缓存的默认情况下是否启用 dark 模式的样式,使用了动态的body:not(.dark)
和body.dark
来增加缓存下来的样式的优先级,防止被 media 中的样式覆盖。
1 | :root { |