自学内容网 自学内容网

vue一键换肤

1.CSS变量方案

优点:

  • 性能好,切换即时生效
  • 实现简单,维护方便
  • 支持动态计算(如色阶)
  • 浏览器原生支持

2. 动态切换 style 标

(1)首先进行变量配置,比如我现在有两个主题:

// 主题配置
export const themeConfig = {
  default: {
    '--primary-color': '#409eff',
    '--primary-bg': '#ffffff',
    '--text-color': '#303133',
    // ... 其他变量
  },
  dark: {
    '--primary-color': '#67c23a',
    '--primary-bg': '#1f1f1f',
    '--text-color': '#ffffff',
    // ... 其他变量
  },
  // ... 其他主题
}

// 切换主题方法
export const changeTheme = (themeName: string) => {
  const theme = themeConfig[themeName]
  if (!theme) return
  
  const root = document.documentElement
  Object.keys(theme).forEach(key => {
    root.style.setProperty(key, theme[key])
  })
  
  // 保存主题设置
  localStorage.setItem('theme', themeName)
}

(2)设置全局scss变量 

:root {
  --primary-color: #409eff;
  --primary-bg: #ffffff;
  --text-color: #303133;
  // ... 其他变量
}

2.动态切换style样式方案

export const changeTheme = async (themeName: string) => {
  // 移除已存在的主题样式
  const existingStyle = document.getElementById('theme-style')
  if (existingStyle) {
    existingStyle.remove()
  }

  // 动态加载新主题样式
  try {
    const style = document.createElement('style')
    style.id = 'theme-style'
    
    // 动态导入主题文件
    const themeModule = await import(`@/assets/themes/${themeName}.scss`)
    style.textContent = themeModule.default
    
    document.head.appendChild(style)
    localStorage.setItem('theme', themeName)
  } catch (error) {
    console.error('主题加载失败:', error)
  }
}

3.cssModule方案

跟2类似

<template>
  <div :class="[themeClass.theme]">
    <!-- 应用内容 -->
  </div>
</template>

<script setup lang="ts">
import { ref, computed } from 'vue'

const currentTheme = ref('blue')
const themeClass = computed(() => {
  return require(`@/themes/${currentTheme.value}.module.scss`)
})
</script>

4.


原文地址:https://blog.csdn.net/polarisya/article/details/137449829

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!