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

相关文章
|
JavaScript 前端开发
umi + antd 动态主题色
这篇文章讲解的是动态主题色的变化,也就是,页面可能会有10种,或者20种颜色需要切换,不知道到底有多少种颜色;同时,文档也考虑到多人协助开发,开发人员只需要按照约定方式去编写样式、主题文件名、目录等命名规范即可。
1710 0
umi + antd 动态主题色
|
10天前
Next.js 实战 (三):优雅的实现暗黑主题模式
这篇文章介绍了在Next.js中实现暗黑模式的具体步骤。首先,需要安装next-themes库。然后,在/components/ThemeProvider/index.tsx文件中新增ThemeProvider组件,并在/app/layout.tsx文件中注入该组件。如果想要加入过渡动画,可以修改代码实现主题切换时的动画效果。最后,需要在需要的位置引入ThemeModeButton组件,实现暗黑模式的切换。
|
3天前
|
前端开发 搜索推荐 C++
Marp 教程:如何在 VSCode 中引入自定义样式和主题
本文介绍了如何在 Marp 中引入自定义样式和主题,使你的幻灯片更加个性化和独特。首先,你需要安装 VSCode 和 Marp 插件,了解 Marp 的基本结构。接着,通过创建自定义 CSS 文件并在 Markdown 文件中引入,实现样式定制。此外,还可以创建和使用自定义主题,以及进行高级自定义,如调整布局、引入自定义字体和定义复杂动画。最后,使用 Marp 的预览功能实时查看效果。
12 0
|
4月前
|
JavaScript 前端开发 Shell
实现在vue中自定义主题色彩切换
实现在vue中自定义主题色彩切换
64 0
|
5月前
|
前端开发 JavaScript
vue 一键换肤(切换主题样式)
vue 一键换肤(切换主题样式)
326 0
|
7月前
|
前端开发 搜索推荐 开发者
【Flutter前端技术开发专栏】Flutter中的自定义主题与暗黑模式
【4月更文挑战第30天】本文介绍了如何在Flutter中自定义主题和实现暗黑模式。通过`ThemeData`类定义应用的外观,包括颜色、字体和样式。示例展示了如何设置主色、强调色及文本、按钮主题。暗黑模式可通过`darkTheme`属性启用,结合`ThemeData.dark()`方法定制。利用`MediaQuery`监听系统亮度变化,动态调整暗黑模式状态。Flutter的这些特性有助于开发者创建独特且用户友好的界面。
300 0
【Flutter前端技术开发专栏】Flutter中的自定义主题与暗黑模式
|
JavaScript
ElementUI: 自定义主题
ElementUI: 自定义主题
135 0
|
7月前
|
前端开发
自定义elementUI皮肤、色系、主题、主色调
自定义elementUI皮肤、色系、主题、主色调
|
7月前
|
JavaScript
Vuetify 设置主题
Vuetify 设置主题
116 0
|
前端开发
Concis组件库 | 暗黑模式设计
Concis已开工半年时间,开源免费,欢迎大家体验、一起折腾。你可以通过以下方式来支持作者。
116 1
Concis组件库 | 暗黑模式设计