想必已经有不少小伙伴在学习vue3或在项目中使用了;vue3的文档结构友好,且一直以来对中文文档的支持都很棒 那么对于官方的文档,我们除了学习vue3的语法和使用之外,还有什么文档之外的东西能够学习的呢? 有,深色模式!尤大大对于深色模式的适配让我又学了几招。深色模式 深色模式的切换并不神秘,vue3文档对其的实现其实很简单,来看看关键代码。 vue3文档使用了vuejstheme主题,该主题提供关于深色模式的实现逻辑。 首先是大量使用了css变量:根元素实则颜色变量:root{vtcwhite:ffffff;vtcwhitesoft:f9f9f9;vtcwhitemute:f1f1f1;vtcblack:1a1a1a;vtcblackpure:000000;vtcblacksoft:242424;vtcblackmute:2f2f2f;。。。} 然后又添加了一个。dark类:用于浅色的颜色变量:root{vtcbg:var(vtcwhite);vtcbgsoft:var(vtcwhitesoft);vtcbgmute:var(vtcwhitemute);。。。}用于深色的颜色变量。dark{vtcbg:var(vtcblack);vtcbgsoft:var(vtcblacksoft);vtcbgmute:var(vtcblackmute);。。。} 后面在页面开发中关于颜色的css都会使用这些颜色变量。 接着就是用户交互的控制逻辑:先获取到html元素的class列表:constclassListdocument。documentElement。classList切换显示模式class的函数:constsetClass(dark:boolean)classList〔dark?add:remove〕(dark)用户点击时调用函数:setClass((isDark!isDark)) 以上是切换显示模式的最简实现代码。 在编写css时,文档还给颜色的切换添加了过渡效果,让切换体验更加丝滑。。description{color:var(vtctext2);transition:color0。5s;}自动跟随系统外观 这里有一点值得注意的是,深色模式的切换是通过用户手动触发的,为什么我们在切换系统外观的时候,网页会检测到当前系统的显示模式,自动进行同步呢? 文档默认是浅色模式,但也支持跟随系统,这主要是通过媒体查询来实现的。 以下代码中的query是一个用来判定Document是否匹配特定媒体查询的对象,在这里的preferscolorscheme:dark用于检测用户是否有将系统的主题色设置为暗色。constquerywindow。matchMedia((preferscolorscheme:dark))letisDarkuserPreferenceauto?query。matches:userPreferencedark 当用户将外观改变为深色的时候,query。matches的值为true,vue3文档就会给html元素添加。dark来使用深色模式。 vue3文档注入了一个自执行的匿名函数来检测系统外观的变化。;((){constsavedlocalStorage。getItem(vuethemeappearance)if(savedauto?window。matchMedia((preferscolorscheme:dark))。matches:saveddark){document。documentElement。classList。add(dark)}})() 打开控制台可以看到这段编译后的代码: 关键代码 vue3文档在做深色模式时,整个过程考虑的很充分,用户切换的交互关键逻辑代码如下:functionuseAppearance(){letuserPreferencelocalStorage。getItem(storageKey)autoconstquerywindow。matchMedia((preferscolorscheme:dark))constclassListdocument。documentElement。classListletisDarkuserPreferenceauto?query。matches:userPreferencedarkconstsetClass(dark:boolean)classList〔dark?add:remove〕(dark)query。onchange(e){if(userPreferenceauto){setClass((isDarke。matches))}}consttoggle(){setClass((isDark!isDark))localStorage。setItem(storageKey,(userPreferenceisDark?query。matches?auto:dark:query。matches?light:auto))}returntoggle} 而在新版本的代码中,则使用了vueusecore来简化代码:import{UseDarkOptions,useDark,useToggle}fromvueusecoreexporttypeUseAppearanceOptionsUseDarkOptionsexportfunctionuseAppearance(options:UseAppearanceOptions{}){constisDarkuseDark({storageKey:vuethemeappearance,。。。options})consttoggleuseToggle(isDark)return{isDark,toggle}}总结 最后来总结一下,vue3文档是如何实现深色模式的:给根元素(:root)添加css颜色变量;创建一个深色模式的。darkclass颜色变量;利用document。documentElement。classList来切换class;用localStorage来持久化用户的选择;用preferscolorscheme:dark监测用户的系统外观用自执行的函数来同步系统外观; 一个完整而又全面的深色模式的实现示例,你学会了吗?不妨也在你的项目或博客上试试吧欢迎关注我的个人公众号JSHub:提供最新的开发信息速报,优质的技术干货推荐。 或是查看我的个人博客:Devcursor。 点赞:如果有收获和帮助,请点个赞支持一下! 收藏:欢迎收藏文章,随时查看! 评论:欢迎评论交流学习,共同进步!