前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在 Nuxt.js 中配合 windicss 实现暗黑模式适配

在 Nuxt.js 中配合 windicss 实现暗黑模式适配

作者头像
戴兜
发布于 2023-03-11 01:27:04
发布于 2023-03-11 01:27:04
1.6K00
代码可运行
举报
文章被收录于专栏:daidrdaidr
运行总次数:0
代码可运行

在 windicss 中,提供了媒体查询和 class 两种方式实现暗黑模式适配。而且比较省心的是——其提供的 dark 变体会自动根据选择的适配模式,生成对应的代码,可以有效避免写出一堆没用的css,看起来也比较清晰。

为了方便控制,我们选择使用 class 的方式来切换暗黑模式(即给根元素赋予类名 dark 来切换到暗黑模式)

基础样式

首先,需要一些全局 css 来解决 windicss 无法覆盖的样式。

滚动条颜色改变

正常情况下,你可能会想用 -webkit-scrollbar 伪类,但是,其实有更优雅的写法。浏览器提供了一个 color-scheme css 属性,将其设置为dark,浏览器便会自动将页面内所有浏览器自带的元素渲染成暗色风格

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
html.dark {
    color-scheme: dark;
}

图片亮度降低

也很简单,应用一个 filter 就好了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
html.dark img {
    filter: brightness(0.8);
}

自动检测

接下来就是重头戏了,如何判断并给html元素加上dark类名,毕竟windicss可不会帮我们自动处理。

我们会在前端为用户提供一个下拉框,用户可以选择自动适应、保持暗黑模式、保持明亮模式

为了避免页面初载入时样式切换导致的闪屏,最终决定将该配置储存到cookie而非localstorage中,这样能够发挥ssr的作用,当用户强制暗黑/明亮时,服务端就能将类名写入html标签中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function readDarkModeInStorage() {
  const darkMode = useCookie('darkMode')
  const possibleValues = ['auto', 'dark', 'light']
  if (darkMode.value && possibleValues.includes(darkMode.value)) {
    return darkMode.value
  } else {
    return 'auto'
  }
}

上面是一个辅助函数,用于从储存中读出暗黑模式配置(服务端/客户端均可用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function setModeClass(isDark: boolean): void {
  if (isDark) {
    useHead({
      htmlAttrs: { class: 'dark' },
      meta: [{ name: 'theme-color', content: '#121212' }],
    })
  } else {
    useHead({
      htmlAttrs: { class: '' },
      meta: [{ name: 'theme-color', content: '#ffffff' }],
    })
  }
}

一个用于设置暗黑模式样式的工具函数,当传入布尔值时,会同时设置 html 的类名和 theme-color 的 meta 标签(ssr/csr均可用)

使用了来自 VueUse 的 useHead 方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const currentMode = ref(readDarkModeInStorage())
const preferredDark = usePreferredDark()

watchEffect(() => {
  if (currentMode.value === 'auto') {
    if (preferredDark.value) {
      setModeClass(true)
    } else {
      setModeClass(false)
    }
  } else if (currentMode.value === 'dark') {
    setModeClass(true)
  } else if (currentMode.value === 'light') {
    setModeClass(false)
  }

  useCookie('darkMode').value = currentMode.value
})

这里便是关键,首先,读入配置并初始化到 currentMode 变量,接着,使用 VueUse 提供的 usePreferredDark 来获取当前浏览器的颜色模式。

使用一个监听副作用的函数,当上面两个值发生改变时,调用 setModeClass 工具函数去完成最终的类名修改,并将配置写入 cookie。

code{background: #f5f2f0;}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一步到位:三行CSS代码轻松实现全网站暗黑模式
在另一篇博文中,Mads Stoumann详细介绍了如何使用SVG和CSS重新创建Apple的暗黑模式图标。这证明了他在此领域的深厚技术和创新能力。
前端小智@大迁世界
2023/05/23
1.9K0
一步到位:三行CSS代码轻松实现全网站暗黑模式
Nuxt3在使用Tailwindcss情况下,如何优雅实现深色模式切换?
随着前端更新,网站设计中,深色模式也成为了一种备受欢迎的设计趋势。可以帮助用户减少眼睛的负担,同时也更加适合在光线较暗的环境下使用。
Mintimate
2023/07/31
2.1K0
Nuxt3在使用Tailwindcss情况下,如何优雅实现深色模式切换?
【vite+vue3+Ts+element-plus】肩并肩带你写后台管理之scss的使用和自定义主题、暗黑模式
scss的安装、全局设置及一些常规用法 css变量的一些用法 element-plus自定义主题的两种实现方法 暗黑模式的视线
十里青山
2023/04/28
4.9K1
【vite+vue3+Ts+element-plus】肩并肩带你写后台管理之scss的使用和自定义主题、暗黑模式
DarkMode(2):深色模式解决方案——css颜色变量实现Dark Mode
暗黑模式实现,最初的设计,就是参考之前的主题模式。所谓多套主题/配色/皮肤,就是我们很常见的换肤功能。换肤简单的实现就是更换 css实现不同样式呈现不同肤色。
周陆军
2020/12/11
3.6K0
H5 项目如何适配暗黑模式
如果系统设置了深色模式,H5页面不做相应的处理,会出现背景色冲突、深色文字显示异常,深色图标显示异常等一些显示上的问题。
@超人
2021/07/05
2.7K0
深色模式适配指南
随着 iOS 13 的发布,深色模式(Dark Mode)越来越多地出现在大众的视野中,支持深色模式已经成为现代移动应用和网站的一个潮流,前段时间更是因为微信的适配再度引起热议。深色模式不仅可以大幅减少电量的消耗,减弱强光对比,还能提供更好的可视性和沉浸感。
政采云前端团队
2020/08/18
2.9K0
深色模式适配指南
前端主题切换方案详解
现在我们经常可以看到一些网站会有类似暗黑模式/白天模式的主题切换功能,效果也是十分炫酷,在平时的开发场景中也有越来越多这样的需求,这里大致罗列一些常见的主题切换方案并分析其优劣,大家可根据需求综合分析得出一套适用的方案。
前端老道
2023/09/01
8540
前端主题切换方案详解
BuildAdmin18:网站一键切换暗黑模式,到底是如何实现的
之前的菜单栏想按照BuildAdmin的模式,来实现一个 Terminal 终端。
叫我阿柒啊
2024/09/09
3180
BuildAdmin18:网站一键切换暗黑模式,到底是如何实现的
Meta 暗色模式适配
Meta 暗色模式适配是指在网页或应用中实现与 Meta 平台(如 Facebook、Instagram 等)一致的暗色主题风格,提供更舒适的夜间浏览体验。
西里网
2025/05/15
490
用tailwindcss适配暗黑模式竟如此简单
接着上面一篇《从Nuxt文档里发现色彩的配搭诀窍》的内容,本文是我继续对 Nuxt/Content 的探索。当我研究它的色彩系统的时候,我还发现它还提供了暗黑模式,这也算是色彩系统的一种吧,毕竟也是和色彩搭配有关。经过一番学习折腾之后发现它的暗黑模式实现非常简单,甚至不需要你对这个模式有多么深刻的理解,只需要设置几个选项就能完成,并且搭配了 tailwindcss 的 color 系统灵活性也非常的好。
秋风的笔记
2021/12/02
1.8K0
用tailwindcss适配暗黑模式竟如此简单
如何在 Vue 3 + Element Plus 项目中实现动态设置主题色以及深色模式切换
在现代 Web 应用中,主题切换功能尤其是深色模式和自定义主题色的动态切换,已经成为提升用户体验的关键要素之一。它不仅能够根据用户的喜好自动调整界面风格,还能够为不同的场景提供更好的视觉效果,特别是在夜间使用时,深色模式可以减轻眼睛的疲劳。
空白诗
2024/09/17
1.6K0
如何在 Vue 3 + Element Plus 项目中实现动态设置主题色以及深色模式切换
使用 PostCSS 插件让你的网站支持暗黑模式
最近公司需要给多个 webapp(大概20+)加上多皮肤的功能,原先默认是白色皮肤,我们先从暗黑模式入手,从而逐渐实现多皮肤功能。本篇记录下实现思路。
狂奔滴小马
2021/11/15
8800
使用 PostCSS 插件让你的网站支持暗黑模式
Next.js 实战 (三):优雅的实现暗黑主题模式
在 Next.js 中要实现暗黑模式,需要用到一个库:next-themes,它可以帮助我们很轻易地实现暗黑模式切换。
白雾茫茫丶
2024/12/10
1710
Next.js 实战 (三):优雅的实现暗黑主题模式
在Vite中接入现代化的CSS 工程化方案
对初学者来说,谈到开发前端的样式,首先想到的便是直接写原生 CSS。但时间一长,难免会发现原生 CSS 开发的各种问题。那么,如果我们不用任何 CSS 工程方案,又会出现哪些问题呢?
江拥羡橙
2023/11/12
1.7K0
在Vite中接入现代化的CSS 工程化方案
5分钟为你的站点加上暗黑模式
前面我们介绍了很多的建站工具,比如Docsify、Docute、MkDocs等等。虽然Docsify建站快速,使用简单方便,但是它有个缺陷就是没有暗黑模式。今天我在逛Github的时候,发现了一个非常简单,开箱即用的暗黑模式库,它就是darken。
Python研究所
2022/09/19
4400
5分钟为你的站点加上暗黑模式
网页主题自动适配:网页跟随系统自动切换主题
方式3:使用类名切换,通过对顶层节点设置不同的类名,然后定义不同类名的CSS样式,切换主题时修改类名即可
老K博客
2024/06/20
2780
CSS变量实现暗黑模式,我的小铺页面已经支持
最近微信被苹果逼的开发了暗黑模式,越来越多的网站和应用开始支持了暗黑模式,许多人也喜欢为网站选择暗模式,也许他们更喜欢这样的外观,或者他们想让自己的眼睛免受疲劳。这篇文章将告诉你如何实现一个自动的 CSS 暗模式,根据你的访客的主题来改变。
张张
2020/03/17
1.7K0
CSS变量实现暗黑模式,我的小铺页面已经支持
我常用的几个 VueUse 最佳组合,推荐给你们!
Vueuse拥有大量出色的组合。但是量太大,要把它们全部看完可能会让人抓不到重点。下面来介绍一些有用到的组合,它们如下:
前端小智@大迁世界
2022/09/09
2.7K0
我常用的几个 VueUse 最佳组合,推荐给你们!
我用了十行代码,实现了微言码道网站的暗黑模式
现在无论是做一个网站,或是一个App,基本上你都需要考虑暗黑模式。支持暗黑模式已经成为时下的一种标准了。
御剑
2022/11/18
3930
我用了十行代码,实现了微言码道网站的暗黑模式
WordPress添加暗黑模式并集成到主题教程
之前用darkmode.js给主题适配了一个暗黑模式,操作很简单,但体验感不是很好,于是用了几天就干掉了。
楚客追梦
2022/11/11
1.1K0
WordPress添加暗黑模式并集成到主题教程
推荐阅读
相关推荐
一步到位:三行CSS代码轻松实现全网站暗黑模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验