当前位置:首页 > VUE

vue暗黑模式实现

2026-01-16 21:50:44VUE

暗黑模式基础实现

在Vue项目中实现暗黑模式通常涉及CSS变量、状态管理和动态样式切换。以下是常见方法:

定义CSS变量 在全局CSS或根组件中定义两套颜色变量:

:root {
  --bg-color: #ffffff;
  --text-color: #333333;
  --primary-color: #409eff;
}

[data-theme="dark"] {
  --bg-color: #1a1a1a;
  --text-color: #f0f0f0;
  --primary-color: #5a9cf8;
}

使用Vue状态管理 通过Vuex或Pinia存储当前主题状态:

// store/modules/theme.js
export default {
  state: () => ({
    darkMode: false
  }),
  mutations: {
    toggleDarkMode(state) {
      state.darkMode = !state.darkMode
    }
  }
}

动态切换主题

组件内切换逻辑 在组件中添加切换按钮和方法:

vue暗黑模式实现

<template>
  <button @click="toggleTheme">切换主题</button>
</template>

<script>
export default {
  methods: {
    toggleTheme() {
      this.$store.commit('toggleDarkMode')
      document.documentElement.setAttribute(
        'data-theme',
        this.$store.state.theme.darkMode ? 'dark' : 'light'
      )
    }
  }
}
</script>

持久化存储 使用localStorage保存用户选择:

// App.vue
export default {
  mounted() {
    const savedTheme = localStorage.getItem('theme')
    if (savedTheme) {
      this.$store.commit('setDarkMode', savedTheme === 'dark')
      document.documentElement.setAttribute('data-theme', savedTheme)
    }
  }
}

进阶实现方案

CSS预处理器支持 在Sass/Less中使用变量:

vue暗黑模式实现

$themes: (
  light: (
    bgColor: white,
    textColor: black
  ),
  dark: (
    bgColor: #1a1a1a,
    textColor: white
  )
);

@mixin theme($property, $key) {
  @each $theme-name, $theme-colors in $themes {
    .theme-#{$theme-name} & {
      #{$property}: map-get($theme-colors, $key)
    }
  }
}

Element UI集成 针对Element UI组件库的暗黑模式:

import Element from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import './assets/dark-theme.css' // 自定义暗色样式

// 根据状态切换主题
function setElementTheme(isDark) {
  if (isDark) {
    document.body.classList.add('dark-theme')
  } else {
    document.body.classList.remove('dark-theme')
  }
}

系统偏好检测

自动匹配系统主题 通过媒体查询检测系统偏好:

// 检测系统颜色方案
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)')

// 初始设置
if (prefersDark.matches) {
  store.commit('setDarkMode', true)
}

// 监听系统主题变化
prefersDark.addListener((e) => {
  store.commit('setDarkMode', e.matches)
})

过渡动画优化 添加平滑的主题切换过渡效果:

* {
  transition: background-color 0.3s ease, color 0.2s ease;
}

标签: 模式vue
分享给朋友:

相关文章

用vue实现滑动输入条

用vue实现滑动输入条

使用 Vue 实现滑动输入条 使用原生 HTML5 input range 实现 在 Vue 模板中直接使用 <input type="range">,通过 v-model 绑定数据:…

vue实现pie

vue实现pie

Vue 实现饼图 在 Vue 中实现饼图通常可以通过第三方图表库(如 ECharts、Chart.js 或 Highcharts)来完成。以下是使用 ECharts 和 Chart.js 的两种常见方…

vue实现toggle

vue实现toggle

Vue 实现 Toggle 功能 在 Vue 中实现 toggle(切换)功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 和 v-on 通过 v-model 绑定数据,结合…

vue实现treeselect

vue实现treeselect

Vue TreeSelect 实现方法 使用 Vue 实现 TreeSelect 组件可以通过以下几种方式完成,包括使用现成的第三方库或自行封装组件。 使用第三方库 推荐使用成熟的第三方 TreeS…

proxy实现vue

proxy实现vue

使用 Proxy 实现 Vue 响应式系统 Vue 3 的响应式系统基于 JavaScript 的 Proxy API,通过代理对象实现对属性的拦截和依赖追踪。以下是实现的核心逻辑: 创建响…

vue 实现单点登录

vue 实现单点登录

单点登录(SSO)实现原理 单点登录允许用户通过一次身份验证访问多个系统。核心原理是用户首次登录后,认证中心颁发令牌(如Token),其他系统通过验证令牌实现免登录。 Vue中实现SSO的方案 基于…