当前位置: 首页 > news >正文

前端(Vue框架)实现主题切换

场景:

web项目或其他项目中难免有切换主题的需求,现在写一个较统一的方法

实现:

本篇文章记录的是:定义好需要的样式,切换主题时将其设置为 html 的自定义属性,从而达到样式替换的效果

还有一种方案:将不同的样式文件使用<link>标签关联到根文件的 html 文件头部,切换主题时,设置 link 标签 的 href 属性即可

1、hook函数:hooks/useTheme

import {watchEffect, ref} from 'vue'const LOCAL_KEY = "__theme__"export default function useTheme() {// 1. 主题列表(支持的主题及对应颜色)const themeColors = ref([{color: '#409eff', themeKey: 'classicBlue', themeName: "经典蓝色"},{color: '#312e6c', themeKey: 'deepPurple', themeName: "深邃紫"},]);const DEFAULT_THEME = themeColors.value[0].themeKey; // 默认主题const storedTheme = localStorage.getItem(LOCAL_KEY);const theme = ref(storedTheme ? JSON.parse(storedTheme).themeKey : DEFAULT_THEME);// 3. 监听主题变化:同步到DOM和本地存储watchEffect(() => {// 设置html的data-theme属性(用于CSS选择器)document.documentElement.dataset.theme = theme.value;// 保存到本地存储(持久化)let find = themeColors.value.find(it => it.themeKey === theme.value);localStorage.setItem(LOCAL_KEY, JSON.stringify(find));});// 主题切换方法(对外暴露)const setTheme = (newTheme) => {// 验证新主题是否在支持的列表中(可选,增强健壮性)const isValid = themeColors.value.some(item => item.themeKey === newTheme) || newTheme === 'light';if (isValid) {theme.value = newTheme;}};// 获取当前主题function getTheme() {return theme.value;}// 获取主题对应的背景色function getThemeColorStyle(color) {return {background: color};}// 获取存储键function getLocalKey() {return LOCAL_KEY;}// 获取默认的主题function getDefaultTheme() {return DEFAULT_THEME;}return {theme,getTheme,setTheme,getLocalKey,getThemeColorStyle,themeColors,getDefaultTheme}
}

2、组件使用处:

<el-dropdown-item command="theme" class="skin-dropitem">{{ $t('homePage.switchTheme') }}<!--    主题列表--><div class="skin-btns"><div class="themeColors_box"><div v-for="(item, index) in themeColors" :key="index"@click="setTheme(item.themeKey)">{{item.themeName}}</div></div></div></el-dropdown-item>// jsimport useTheme from "@/utils/hooks/useTheme";
const { themeColors, setTheme} = useTheme()

3、定义主题颜色(theme.scss)

// 经典蓝色
html[data-theme="classicBlue"] {--currentMessage-bg-color: #409eff; // 消息页面分类按钮背景--sidebar-bg-color: #409eff; // 主页面导肮栏背景--sidebar-is-active-bg-color: #245a8d; // 主页面导肮栏激活的背景--sidebar-hover-bg-color: #3278bf; // 主页面导肮栏鼠标滑过的背景--el-button--primary: #409eff; // element-plus 样式--el-color-primary-light-9: #93c6fa; // 鼠标滑过.el-button背景色
}// 深邃紫
html[data-theme="deepPurple"] {--currentMessage-bg-color: #312e6c;--sidebar-bg-color: #312e6c;--sidebar-hover-bg-color: #4a449d;--sidebar-is-active-bg-color: #181837;--el-button--primary: #312e6c;--el-color-primary-light-9: #938fff;
}

4、将主题颜色引入到入口文件(main.ts)进行挂载

import "../../styles/theme.scss"; // 主题颜色

http://www.dtcms.com/a/565492.html

相关文章:

  • 国外代理网站wordpress需要多少内存
  • 投资手机网站源码如何利用源代码做网站
  • Redisson在Spring Boot中的高并发应用解析
  • NOFX AI量化交易系统 - 完整使用手册
  • 别人把我做的网站_我自己现在想把网站背景改掉_我要怎么改wordpress 翻译不起作用
  • 网站建设要咨询哪些店铺推广是如何收费的
  • 智能建站网业车怎么打车
  • 玩转Rust高级应用 如何进行面向对象设计模式的实现,实现状态模式
  • B2B中药饮片电商平台是什么?其主要特征和价值是什么?
  • 无锡公司网站制作深圳5区发布通知
  • lamp做网站的论文微平台网站开发
  • 【Linux网络编程】初识网络,理解TCP/IP五层模型
  • 如何分析linux相关的系统日志
  • 网页设计作业--接口文档的撰写
  • 第一次找人做网站微信运营专员是什么工作
  • vue2中的.native修饰符和$listeners组件属性
  • 网站建设情况报告范文wordpress首页怎么控制
  • 家政小程序拓展分析:从工具型产品到全链路服务生态的技术落地与商业破局
  • 中国十大门户网站排行定远建设小学投诉网站
  • 外贸网站制作哪家快wordpress删除站点
  • 检查部门网站建设网站建设的主题
  • 网站尾部一般怎么做室内设计公司排名榜
  • Spring Boot 集成 MQTT 实现消息发布与订阅
  • 【Linux系统编程】进程概念(二)进程的概念和基本操作
  • 建收费网站营销型网站建设风格设定包括哪些方面?
  • 【深度强化学习】#6 Soft Actor-Critic:最大熵与重参数化技巧
  • 教务管理系统源码
  • Demis Hassabis带领DeepMind告别纯科研时代:当AI4S成为新叙事,伦理考验仍在继续
  • 顺德网站建设域名网站的规划与建设_按时间顺序可以分为哪等五个阶段
  • 基于Python与Streamlit的救援物资调度双层规划模型实现方案