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

相关文章
|
关系型数据库 Linux 数据库连接
CentOS7下部署开源IT资产管理软件GLPI+FusionInventory
CentOS7下部署开源IT资产管理软件GLPI+FusionInventory
3110 0
CentOS7下部署开源IT资产管理软件GLPI+FusionInventory
|
12月前
|
JavaScript 安全 Java
基于springboot的大学生兼职系统
本课题针对大学生兼职信息不对称、权益难保障等问题,研究基于Spring Boot、Vue、MySQL等技术的兼职系统,旨在构建安全、高效、功能完善的平台,提升大学生就业竞争力与兼职质量。
|
人工智能 编解码
ReCamMaster:视频运镜AI革命!单镜头秒变多机位,AI重渲染颠覆创作
ReCamMaster 是由浙江大学与快手科技联合推出的视频重渲染框架,能够根据用户指定的相机轨迹重新生成视频内容,广泛应用于视频创作、后期制作、教育等领域,提升创作自由度和质量。
1257 0
|
缓存 前端开发 JavaScript
基于 Next.js 的今日热门榜单平台
**今日热榜**是一款基于Next.js构建的热点聚合平台,实时整合17+主流平台热门内容,提供明暗主题切换、响应式适配、SSR极速加载等特性,支持Vercel一键部署,助你轻松掌握全网热点。
1580 0
基于 Next.js 的今日热门榜单平台
|
JavaScript 前端开发 搜索推荐
Nuxt4.0初体验:一个简约、精美、现代化的个人站点导航!
这篇文章介绍了作者使用Nuxt 4.0重构个性化站点导航网站的经历,阐述了Nuxt 4.0的新特性和优势,如更清晰的项目结构、更好的TypeScript体验、更快的CLI和开发速度等,并且分享了重构过程中的体验和项目完成效果。同时,作者还对比了Nuxt.js与Next.js两个框架的优劣,表达了自己对Nuxt.js的偏好。
890 0
Nuxt4.0初体验:一个简约、精美、现代化的个人站点导航!
|
数据采集 搜索推荐 开发者
Nuxt3 实战 (十二):SEO 搜索引擎优化指南
这篇文章介绍了如何为Nuxt.js项目添加favicon图标和TDK(标题、描述、关键词),安装@nuxtjs/seo模块,以及如何设置Robots、Sitemap、OG Image、Schema.org、Experiments等。文章还提到了添加Google Analytics、Microsoft Clarity和Umami统计代码的方法。文章最后总结称,Nuxt.js 3集成了很多SEOModules,使开发者能够更加高效便捷地做好搜索引擎方面的优化。
1325 0
Nuxt3 实战 (十二):SEO 搜索引擎优化指南
|
机器学习/深度学习 监控 安全
10分钟轻松实现人脸精准识别
本文将具体介绍如何利用云服务部署深度学习模型,快速接入人脸比对服务。
|
资源调度 关系型数据库 MySQL
docker制作compose
本文介绍了Docker Compose的基本使用,包括安装、创建`docker-compose.yml`文件定义服务,以及如何使用环境变量和卷来配置多容器应用的步骤。
841 1
docker制作compose

热门文章

最新文章