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

Vue—— Vue3 + Node.js 后台管理系统 之 【主题系统动态应用】

背景问题

现代应用需要支持主题切换,包括浅色、深色等多种主题,需要动态调整样式。

方案思考

  • 如何使用CSS变量实现主题切换
  • 如何持久化主题设置
  • 如何优化主题切换性能

具体实现

CSS变量主题:

// style/theme.scss - 主题样式系统 // 默认主题样式 :root { --primary-color: #409eff; --primary-light-1: #53a8ff; --primary-light-2: #66b1ff; --primary-light-3: #79bbff; --primary-light-4: #8cc5ff; --primary-light-5: #a0d2ff; --primary-light-6: #b3dffb; --primary-light-7: #c6e7ff; --primary-light-8: #d9f0ff; --primary-light-9: #ecf7ff; --bg-color: #ffffff; --text-color: #303133; --border-color: #dcdfe6; } // 深色主题样式 html.dark { --primary-color: #337ecc; --primary-light-1: #428bda; --primary-light-2: #519ce8; --primary-light-3: #60aef6; --primary-light-4: #70c2ff; --primary-light-5: #8ed0ff; --primary-light-6: #abe0ff; --primary-light-7: #c9eeff; --primary-light-8: #e6f8ff; --primary-light-9: #f2fbff; --bg-color: #1d1e1f; --text-color: #e4e7ed; --border-color: #4c4d4f; } // 使用主题变量的组件样式 .app-container { background-color: var(--bg-color); color: var(--text-color); border: 1px solid var(--border-color); .primary-button { background-color: var(--primary-color); color: white; &:hover { background-color: var(--primary-light-1); } } }

动态主题应用:

// utils/dynamicTheme.ts - 动态主题应用import{ref,watchEffect}from'vue';// 主题配置interfaceThemeConfig{primaryColor:string;backgroundColor:string;textColor:string;borderColor:string;borderRadius:string;}// 预设主题constpresetThemes:Record<string,ThemeConfig>={light:{primaryColor:'#409eff',backgroundColor:'#ffffff',textColor:'#303133',borderColor:'#dcdfe6',borderRadius:'4px'},dark:{primaryColor:'#337ecc',backgroundColor:'#1d1e1f',textColor:'#e4e7ed',borderColor:'#4c4d4f',borderRadius:'4px'},blue:{primaryColor:'#1890ff',backgroundColor:'#f0f8ff',textColor:'#001529',borderColor:'#91d5ff',borderRadius:'6px'}};// 动态主题应用exportfunctionuseDynamicTheme(){constcurrentTheme=ref('light');// 应用主题constapplyTheme=(themeName:string)=>{consttheme=presetThemes[themeName];if(!theme)return;constroot=document.documentElement;Object.entries(theme).forEach(([key,value])=>{root.style.setProperty(`--${key}`,value);});// 添加主题类名root.className=root.className.replace(/\btheme-\w+\b/g,'');root.classList.add(`theme-${themeName}`);};// 监听主题变化watchEffect(()=>{applyTheme(currentTheme.value);});// 切换主题constswitchTheme=(themeName:string)=>{currentTheme.value=themeName;localStorage.setItem('theme',themeName);};// 获取当前主题constgetCurrentTheme=()=>{returncurrentTheme.value;};// 初始化主题constinitTheme=()=>{constsavedTheme=localStorage.getItem('theme');if(savedTheme&&presetThemes[savedTheme]){currentTheme.value=savedTheme;}};return{currentTheme,switchTheme,getCurrentTheme,initTheme};}

效果验证

通过CSS变量和JavaScript结合,可以实现流畅的主题切换效果。

经验总结

主题系统不仅要考虑视觉效果,还要考虑性能和用户体验,特别是在主题切换过程中的过渡效果。

http://www.jsqmd.com/news/328341/

相关文章:

  • 2026年热门的扭矩测试仪/平板测试仪行业内口碑厂家排行榜
  • 2026年长沙厨房燃料液蜡实力厂家推荐与采购指南
  • 笔记本散热优化指南:如何通过智能风扇调节提升ThinkPad使用体验
  • 3阶段优化法:从卡顿到电竞级体验
  • 2026年质量好的自动化检测设备钣金加工/净水设备钣金加工厂家推荐及选购参考榜
  • 如何高效备份抖音直播内容?直播回放管理工具实战指南
  • 2026年耐用的48V 电动车电池/电动车电池高评价厂家推荐
  • 解决游戏控制器识别难题的ViGEmBus虚拟设备驱动
  • 2026年1月长沙厨房燃料白油供应厂家综合评测与选型指南
  • 2026年初专业的长沙厨房燃料液蜡供应商选哪家
  • 3步解锁AI游戏助手:让2048突破10000分的秘密武器
  • 城通网盘下载速度受限问题的技术解决方案与性能优化实践
  • 想保存无水印视频却不会技术?这款免费工具3步轻松搞定!
  • 2026年评价高的粘玉米碴加工成套设备/玉米碴加工成套设备用户好评厂家排行
  • 忘记QQ号不用愁!手机号查QQ工具使用指南
  • 文献管理效率提升:Ethereal Style插件的问题诊断与优化策略
  • 2026年知名的玉米磨面机/燕麦磨面机厂家最新热销排行
  • tts-vue语音合成工具配置指南:4步打造专业离线语音解决方案
  • Windows自定义光标:打造高清视觉体验的个性化指针方案
  • PMI CSPM PRINCE IPMA
  • 无水印社交媒体视频批量下载工具测评:高效保存直播回放与多平台内容的全方案
  • douyin-downloader高效获取指南:从零基础到专家级管理
  • 2026年质量好的护颈凝胶枕/舒适凝胶枕用户口碑最好的厂家榜
  • 2026年质量好的机制砂选粉机/铝灰选粉机品牌厂家排行榜
  • WarcraftHelper完美适配指南:彻底解决魔兽争霸III现代系统兼容性难题
  • 2026年质量好的专业AB枕芯/AB枕芯最新TOP厂家排名
  • 安卓设备修复工具使用指南:零基础也能掌握的系统救砖与设备解锁教程
  • 零代码制作电子书:三步完成专业级EPUB的3个秘诀
  • WorkshopDL 2024全新指南:高效获取Steam创意工坊资源的完整方案
  • 3大维度解决魔兽争霸3卡顿与鼠标异常问题:从诊断到优化的完整技术指南