Nuxt3 实战 (八):优雅的实现暗黑主题模式

简介: 这篇文章介绍了在Nuxt3中实现暗黑模式的过程。首先推荐使用color-mode库来轻易实现暗黑模式切换,并通过pnpm命令安装@nuxtjs/color-mode依赖。然后在nuxt.config.ts配置文件中注入依赖,并根据项目实际情况自定义配置。接着通过toggleDark函数实现切换动画,并在需要的地方加载组件<ColorMode/>,从而达到最终效果。

前言

Nuxt3 中要实现暗黑模式,需要用到一个库:color-mode,它可以帮助我们很轻易地实现暗黑模式切换。

具体使用

  1. 安装 @nuxtjs/color-mode 依赖:
    pnpm add @nuxtjs/color-mode -D
    
  2. 打开 nuxt.config.ts 配置文件注入依赖:
    export default defineNuxtConfig({
         
    modules: ['@nuxtjs/color-mode']
    })
    
  3. 你也可以根据项目实际情况自定义配置,以下是一些默认配置:

    import {
          defineNuxtConfig } from 'nuxt'
    
    export default defineNuxtConfig({
         
    modules: ['@nuxtjs/color-mode'],
    colorMode: {
         
     preference: 'system', // default value of $colorMode.preference
     fallback: 'light', // fallback value if not system preference found
     hid: 'nuxt-color-mode-script',
     globalName: '__NUXT_COLOR_MODE__',
     componentName: 'ColorScheme',
     classPrefix: '',
     classSuffix: '-mode',
     storageKey: 'nuxt-color-mode'
    }
    })
    

    具体的使用文档:NuxtColorMode

按钮模式

  1. src/components 中新建 ColorMode/index.vue 文件:

    <script setup lang="ts">
    const colorMode = useColorMode()
    
    // 切换模式
    const setColorMode = () => {
          
    colorMode.value = colorMode.value === 'dark' ? 'light' : 'dark'
    }
    
    // 判断是否支持 startViewTransition API
    const enableTransitions = () =>
    'startViewTransition' in document &&
    window.matchMedia('(prefers-reduced-motion: no-preference)').matches
    
    // 切换动画
    async function toggleDark({
           clientX: x, clientY: y }: MouseEvent) {
          
    const isDark = colorMode.value === 'dark'
    
    if (!enableTransitions()) {
          
      setColorMode()
      return
    }
    
    const clipPath = [
      `circle(0px at ${
            x}px ${
            y}px)`,
      `circle(${
            Math.hypot(
        Math.max(x, innerWidth - x),
        Math.max(y, innerHeight - y)
      )}px at ${
            x}px ${
            y}px)`
    ]
    
    await document.startViewTransition(async () => {
          
      setColorMode()
      await nextTick()
    }).ready
    
    document.documentElement.animate(
      {
           clipPath: !isDark ? clipPath.reverse() : clipPath },
      {
          
        duration: 300,
        easing: 'ease-in',
        pseudoElement: `::view-transition-${
            !isDark ? 'old' : 'new'}(root)`
      }
    )
    }
    </script>
    
    <template>
    <el-tooltip
      :content="`切换${$colorMode.value === 'dark' ? '白天' : '黑夜'}模式`"
      placement="bottom"
    >
      <el-button
        circle
        text
        @click="toggleDark"
      >
        <Icon
          :name="$colorMode.value === 'dark' ? 'i-heroicons-moon-solid' : 'i-heroicons-sun-solid'"
          class="h-5 w-5"
        />
      </el-button>
    </el-tooltip>
    </template>
    
    <style>
    ::view-transition-old(root),
    ::view-transition-new(root) {
          
    animation: none;
    mix-blend-mode: normal;
    }
    
    ::view-transition-old(root),
    .dark::view-transition-new(root) {
          
    z-index: 1;
    }
    
    ::view-transition-new(root),
    .dark::view-transition-old(root) {
          
    z-index: 9999;
    }
    </style>
    
  2. 在需要的地方加载组件:

    <ColorMode />
    

最终效果

vxjpdgxguk0k29ahw69soprb0g31v85x.gif

相关文章
mix-blend-mode 利用混合模式让文字智能适配背景颜色
这篇文章介绍了CSS3属性mix-blend-mode的使用方法,该属性能够实现文字智能适配背景颜色的效果,其中包括文字镂空效果。文章详细解释了该属性的混合模式计算方式以及各种属性值的效果。
289 0
mix-blend-mode 利用混合模式让文字智能适配背景颜色
vite环境引入web worker方法
在 vite 环境中使用 web worker 时,如果遇到生产环境中 worker.js 文件的 MIME 类型被识别为 text/html,导致报错无法运行的情况时,可以参考以下两种方法,原理都是避免编译时产出单独的 worker.js 文件。方法一worker文件不需要包装,引入时后缀增加 ?worker&inline,使用时直接 new ImportedWorker();self.
1668 1
|
移动开发 缓存 JavaScript
2021最新阿里代码规范(前端篇)
2021最新阿里代码规范(前端篇)
56155 11
2021最新阿里代码规范(前端篇)
|
前端开发 应用服务中间件 网络安全
【Nuxt】Nuxt做官网要求适配PC&Mobile,我的解决方案
前言 项目终于进入了尾声,这段时间主要在忙公司官网的开发,前段时间我在忙另外一个项目的时候,官网这个项目就启动了,团队里的另外一个小伙伴居然用Vue-cli构建了一个项目去做官网,导致我很难李姐,所以我提出重构项目,由我主导开发,写篇文章记录一下项目信息以及部分关键点。
2171 0
|
存储 应用服务中间件 nginx
nuxt3:我们开始吧-开发-配置-部署(三)
nuxt3:我们开始吧-开发-配置-部署(三)
1781 0
|
存储 JavaScript 中间件
Nuxt3 实战 (一):初始化项目
这篇文章介绍了Nuxt框架的基本信息,包括什么是Nuxt以及Nuxt3的优点。文章还介绍了Nuxt3的一些特点,如服务端渲染和静态站点生成、模块化、文件系统路由等。此外,文章还提供了项目安装的步骤和目录结构。最后,文章提到了下一步计划,即配置 Eslint、Prettier、Husky、lint-staged、commitlit项目提交规范的过程。
372 3
Nuxt3 实战 (一):初始化项目
|
JavaScript
Nuxt3 实战 (四):安装 Nuxt UI 和配置 Typescript 类型检查
这篇文章介绍了在项目中安装和配置Nuxt UI以及TypeScript的步骤。作者在前言中提到考虑了AntDesignVue和Element-Plus,但最终选择了NuxtUI,因为它更适合年轻化的项目,并且与Nuxt兼容。安装Nuxt UI需要执行一系列命令,同时会自动安装一些相关模块。然后,可以在Nuxt应用中使用Nuxt UI的所有组件和可组合函数。此外,还介绍了如何添加图标库和配置TypeScript。
463 0
Nuxt3 实战 (四):安装 Nuxt UI 和配置 Typescript 类型检查
|
前端开发 JavaScript API
Nuxt3 实战 (十一):添加路由 Transition 过渡效果和 Loading 动画
这篇文章介绍了Nuxt3框架中页面和布局的过渡效果设置方法,以及首屏加载动画的添加。通过配置nuxt.config.ts文件和添加CSS样式,可以实现页面过渡效果。同时,文章也提到了在页面中设置不同的过渡效果和为布局和页面同时设置过渡效果的方法。最后,文章以一个Github仓库链接和一个线上预览地址作为总结,表示遵循官方文档操作即可完成相关设置。
346 0
Nuxt3 实战 (十一):添加路由 Transition 过渡效果和 Loading 动画
|
数据采集 搜索推荐 开发者
Nuxt3 实战 (十二):SEO 搜索引擎优化指南
这篇文章介绍了如何为Nuxt.js项目添加favicon图标和TDK(标题、描述、关键词),安装@nuxtjs/seo模块,以及如何设置Robots、Sitemap、OG Image、Schema.org、Experiments等。文章还提到了添加Google Analytics、Microsoft Clarity和Umami统计代码的方法。文章最后总结称,Nuxt.js 3集成了很多SEOModules,使开发者能够更加高效便捷地做好搜索引擎方面的优化。
677 0
Nuxt3 实战 (十二):SEO 搜索引擎优化指南
|
安全 Java API
Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档
这篇文章介绍了Swagger,它是一组开源工具,围绕OpenAPI规范帮助设计、构建、记录和使用RESTAPI。文章主要讨论了Swagger的主要工具,包括SwaggerEditor、SwaggerUI、SwaggerCodegen等。然后介绍了如何在Nest框架中集成Swagger,展示了安装依赖、定义DTO和控制器等步骤,以及如何使用Swagger装饰器。文章最后总结说,集成Swagger文档可以自动生成和维护API文档,规范API标准化和一致性,但会增加开发者工作量,需要保持注释和装饰器的准确性。
434 0
Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档