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

vue + less 实现动态主题换肤功能

文章目录

  • 前言
  • 一、前提条件
    • 1. 初始化vue项目
    • 2. 安装插件
  • 二、新建文件夹主题theme
    • 1.style.less文件
    • 2.model.js文件
    • 3.theme.js文件
    • theme文件夹最终效果
  • 三、修改vue.config.js文件
  • 四、页面上的具体使用
    • 1. index.vue 页面
    • 2. index.vue 页面注意点说明
    • 3. index.vue 效果
  • 五、在js中使用定义的颜色变量
    • 1. 代码
    • 2. 代码说明
    • 3. 打印themsColor
  • 六、关于定义颜色的变量不是十六进制的原因


前言

在vue项目中(我的是2.6.11版本的)使用less做到切换主题肤色。话不多说,直接开始。

一、前提条件

1. 初始化vue项目

我这里的项目是2.6.11版本的

"vue": "^2.6.11",

2. 安装插件

安装一些less的插件

npm install less --save // less插件
npm install less-loader@5.0.0 --save // less-loader作用就是将less代码转译为浏览器可以识别的CSS代码。
npm install style-resources-loader -D // 在样式引入时,对于变量的引入,需要在每个文件里都要引入一遍,为了避免每次使用时都需要单独引入一遍的问题,采用了 style-resources-loader

二、新建文件夹主题theme

路径: src > assets > style > theme
翻译:theme 的中文就是主题
注意点:考虑到切换样式也是样式中的,所以放在style里面,当然,你可以放在任意位置,只要你后面的路径同一改了就好。

1.style.less文件

// 默认的主题颜色(白低黑字)
@baseColor: var(--baseColor, rgba(25,121,255));
@pageBgColor: var(--pageBgColor, rgba(255,255,255));
@scrollBgColor: var(--scrollBgColor, rgba(0, 0, 0));
@resultBgColor: var(--resultBgColor, rgba(255,192,203));
@resultBorderColor: var(--resultBorderColor, rgba(255,255,0));
@resultTextColor: var(--resultTextColor, rgba(0,0,0, 0.9));// 导出变量 (如果在 src/assets/style/theme/model文件中配置了,就直接导出里面的字体使用)
:export {name: "less";baseColor: @baseColor;pageBgColor: @pageBgColor;scrollBgColor: @scrollBgColor;resultBgColor: @resultBgColor;resultBorderColor: @resultBorderColor;resultTextColor: @resultTextColor;
}

2.model.js文件

// 一套默认主题以及一套暗黑主题
export const themes = {default: {baseColor: `${25}, ${121},${255}`, // 基色(无变化) pageBgColor: `${255}, ${255},${255}`, // 页面的背景色scrollBgColor: `${0}, ${0},${0}`, // 滚动条的背景色resultBgColor: `${255}, ${192},${203}`, // 结果背景色resultBorderColor: `${255}, ${255},${0}`, // 结果区背景色resultTextColor: `${0}, ${0},${0}, 0.9`, // 结果文字},dark: {baseColor: `${25}, ${121},${255}`, // 基色(无变化) pageBgColor: `${0}, ${0},${0}`, // 页面的背景色scrollBgColor: `${255}, ${255},${255}`, // 滚动条的背景色resultBgColor: `${135}, ${206},${235}`, // 结果背景色resultBorderColor: `${0}, ${128},${0}`, // 结果区背景色resultTextColor: `${255}, ${255},${255}, 0.9`, // 结果文字},
};

3.theme.js文件

import { themes } from "./model";
// 修改页面中的样式变量值
const changeStyle = (obj) => {for (let key in obj) {document.getElementsByTagName("body")[0].style.setProperty(`--${key}`, obj[key]);}
};
// 改变主题的方法
export const setTheme = (themeName) => {localStorage.setItem("theme", themeName); // 保存主题到本地,下次进入使用该主题const themeConfig = themes[themeName] ? themes[themeName] : themes['default'];changeStyle(themeConfig);
};

theme文件夹最终效果

在这里插入图片描述

三、修改vue.config.js文件

const path = require('path');
module.exports = {pluginOptions: {"style-resources-loader": {preProcessor: "less",patterns: [// 这个是加上自己的路径,不能使用(如下:alias)中配置的别名路径path.resolve(__dirname, "./src/assets/style/theme/style.less"),],},},
};

注意: 修改vue.config.js文件 记得重新启动项目。

四、页面上的具体使用

1. index.vue 页面

<template><div class="index"><button class="btn" @click="themeDefault">默认</button><button class="btn" @click="themeDark">暗黑</button><div class="content">这是一个可以切换主题的盒子</div>  </div>  
</template><script>
import { setTheme } from "../assets/style/theme/theme"; // 引入切换主题方法
export default {data() {return {}},methods: {// 默认主题方案(白底黑字)themeDefault() {document.documentElement.removeAttribute('theme-mode'); // 重置为浅色模式this.themeChange = true;setTheme("default"); // 初始化未默认主题},// 暗黑主题(黑底白字)themeDark() {document.documentElement.setAttribute('theme-mode', 'dark'); // 重置为深色模式this.themeChange = false;setTheme("dark");},},mounted: function() {this.themeDefault(); // 进入页面默认渲染默认主题方案}
}
</script><style lang="less" scoped>
@import '../assets/style/theme/style.less'; // 引入主题样式文件.index{width: 100%;height: 100%;.btn {width: 50px;height: 30px;background-color: green;}.content {width: 100px;height: 100px;color: rgba(@resultTextColor, 1);background-color: rgba(@resultBgColor, 1);border: 10px solid  rgba(@resultBorderColor, 1);}
}
</style>

2. index.vue 页面注意点说明

在这里插入图片描述

3. index.vue 效果

(1)默认效果
在这里插入图片描述
(2)暗黑效果
在这里插入图片描述

其他校验修改主题成功的方法
在审查元素的body上有你所定义的数据就是了
在这里插入图片描述

五、在js中使用定义的颜色变量

1. 代码

import themsColor from '../assets/style/theme/style.less'; // 引入主题样式文件
export default {data() {return {themsColor,}},mounted: function() {console.log('themsColor', themsColor);}
}

2. 代码说明

在这里插入图片描述

3. 打印themsColor

在这里插入图片描述

六、关于定义颜色的变量不是十六进制的原因

如果你在modes.js中使用 #ffffff #333333 类似这样的颜色,其实也是可以的,而且在页面中可以直接使用 color: @resultTextColor,看过去似乎简单了很多,那为什么要改用rgb的方式呢?
相信有仔细注意代码的人可能注意到了这个颜色的值${255}, ${255},${255}, 0.9, 是的,透明度。
如果直接写死的十六进制的话,没有可以操作的空间。包括我实际项目最开始用的也是十六进制,后面才改成的rgb的方式。不仅仅是文字,包括颜色中也会有禁用等需要直接修改透明度的方法,不用因此再添加一个类似的变量考虑才使用的rgba的方法。当然,这也仅仅是一种思路。如果你有更好的方法可以忽略。
注意点:有透明度的就和颜色一样,加在后面就好了,没有透明度的话,就在后面加上1,不然可能没效果

相关文章:

vue + less 实现动态主题换肤功能

文章目录 前言一、前提条件1. 初始化vue项目2. 安装插件 二、新建文件夹主题theme1.style.less文件2.model.js文件3.theme.js文件theme文件夹最终效果 三、修改vue.config.js文件四、页面上的具体使用1. index.vue 页面2. index.vue 页面注意点说明3. index.vue 效果 五、在js中…...

matlab使用教程(15)—图论基础

1.有向图和无向图 1.1什么是图&#xff1f; 图是表示各种关系的节点和边的集合&#xff1a; • 节点 是与对象对应的顶点。 • 边 是对象之间的连接。 • 图的边有时会有权重 &#xff0c;表示节点之间的每个连接的强度&#xff08;或一些其他属性&#xff09;。 这些定…...

【量化课程】02_4.数理统计的基本概念

2.4_数理统计的基本概念 数理统计思维导图 更多详细内容见notebook 1.基本概念 总体&#xff1a;研究对象的全体&#xff0c;它是一个随机变量&#xff0c;用 X X X表示。 个体&#xff1a;组成总体的每个基本元素。 简单随机样本&#xff1a;来自总体 X X X的 n n n个相互…...

【计算机视觉|生成对抗】改进的生成对抗网络(GANs)训练技术

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Improved Techniques for Training GANs 链接&#xff1a;[1606.03498v1] Improved Techniques for Training GANs (arxiv.org) 摘要 本文介绍了一系列应用于生成对抗网络&#xff08;G…...

SQLyog中导入CSV文件入库到MySQL中

1.在数据库中新建一个表&#xff0c;设置列名&#xff08;与待导入文件一致&#xff09;&#xff0c;字段可以多出几个都可以 2.右键表名&#xff0c;导入- - >导入使用本地加载的CSV数据 选择使用加载本地CVS数据 3.指定好转义字符&#xff0c;将终止设置为,号(英文状态下…...

Spring Security6 最新版配置该怎么写,该如何实现动态权限管理

Spring Security 在最近几个版本中配置的写法都有一些变化&#xff0c;很多常见的方法都废弃了&#xff0c;并且将在未来的 Spring Security7 中移除&#xff0c;因此又补充了一些新的内容&#xff0c;重新发一下&#xff0c;供各位使用 Spring Security 的小伙伴们参考。 接下…...

CommandLineRunner 和 ApplicationRunner 用于Spring Boot 应用启动后执行特定逻辑

CommandLineRunner 和 ApplicationRunner 都是 Spring Boot 中用于在应用启动后执行特定逻辑的接口。它们的主要区别在于传递的参数类型和执行顺序。下面我将为您详细解释它们的用途、使用案例以及执行顺序。 CommandLineRunner CommandLineRunner 是一个接口&#xff0c;它有…...

一、Dubbo 简介与架构

一、Dubbo 简介与架构 1.1 应用架构演进过程 单体应用&#xff1a;JEE、MVC分布式应用&#xff1a;SOA、微服务化 1.2 Dubbo 简介一种分布式 RPC 框架&#xff0c;对专业知识&#xff08;序列化/反序列化、网络、多线程、设计模式、性能优化等&#xff09;进行了更高层的抽象和…...

软考:中级软件设计师:文件管理,索引文件结构,树型文件结构,位示图,数据传输方式,微内核

软考&#xff1a;中级软件设计师: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1…...

实践-CNN卷积层

实践-CNN卷积层 1 卷积层构造2 整体流程3 BatchNormalization效果4 参数对比5 测试效果 1 卷积层构造 2 整体流程 根据网络结构来写就可以了。 池化 拉平 训练一个网络需要2-3天的时间。用经典网络来&#xff0c;一些细节没有必要去扣。 损失函数&#xff1a; fit模型&…...

【设计模式】MVC 模式

MVC 模式代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式。这种模式用于应用程序的分层开发。 Model&#xff08;模型&#xff09; - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑&#xff0c;在数据变化时更新控制器。View&#xff…...

看康师傅金桔柠檬X国漫IP跨界出圈,打开IP合作新思路

Z世代年轻群体已经成为消费主力&#xff0c;其喜好和消费观念也呈现出全新态势。抓住年轻人的心&#xff0c;就是抓住了品牌未来的战场。 那么到底什么样的营销动作才能真正撬动年轻人&#xff1f; 对于互联网时代成长起来的Z世代年轻人来说&#xff0c;人气二次元IP无疑是能最…...

ElementUI的MessageBox的按钮置灰且不可点击

// this.$confirmthis.$alert(这是一段内容, 标题名称, {confirmButtonText: 确定,confirmButtonCLass: confirmButton,beforeClose: (action,instance,done) > {if (action confirm) {return false} else {done()}});}.confirmButton {background: #ccc !important;cursor…...

pc端与flutter通信失效, Method not found

报错情况描述&#xff1a;pc端与flutter通信&#xff0c;ios端能实现通信&#xff0c;安卓端通信报错 报错通信代码&#xff1a; //app消息通知window.callbackName function (res) {window?.jsBridge && window.jsBridge?.postMessage(JSON.stringify(res), "…...

linux 防火墙经常使用的命令

# 开启防火墙服务 systemctl start firewalld # 关闭防火墙服务 systemctl stop firewalld # 重启防火墙服务 systemctl restart firewalld # 开发端口 firewall-cmd --zonepublic --add-port8080/tcp --permanent # 移除端口 firewall-cmd --zonepublic --remove-port8080/tc…...

Docker desktop安装mysql

首先本地已经有 docker 环境存在&#xff0c;然后可以拉取 MySQL 镜像。 相关 mysql 仓库地址&#xff1a; https://hub.docker.com/_/mysql/ # 镜像拉取 docker pull mysql:8.0.26docker pull mysql:latest# 查看镜像列表docker image ls等待镜像完成之后就可以启动 mysql 了…...

Java SpringBoot Vue ERP系统

系统介绍 该ERP系统基于SpringBoot框架和SaaS模式&#xff0c;支持多租户&#xff0c;专注进销存财务生产功能。主要模块有零售管理、采购管理、销售管理、仓库管理、财务管理、报表查询、系统管理等。支持预付款、收入支出、仓库调拨、组装拆卸、订单等特色功能。拥有商品库存…...

什么是CSS中的渐变(gradient)?如何使用CSS创建线性渐变和径向渐变?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 渐变&#xff08;Gradient&#xff09;在CSS中的应用⭐ 线性渐变&#xff08;Linear Gradient&#xff09;语法&#xff1a;示例&#xff1a; ⭐ 径向渐变&#xff08;Radial Gradient&#xff09;语法&#xff1a;示例&#xff1a; ⭐ 写…...

【深度学习】PyTorch快速入门

【深度学习】学习PyTorch基础 介绍PyTorch 深度学习框架是一种软件工具&#xff0c;旨在简化和加速构建、训练和部署深度学习模型的过程。深度学习框架提供了一系列的函数、类和工具&#xff0c;用于定义、优化和执行各种深度神经网络模型。这些框架帮助研究人员和开发人员专注…...

学习Vue:组件通信

组件化开发在现代前端开发中是一种关键的方法&#xff0c;它能够将复杂的应用程序拆分为更小、更可管理的独立组件。在Vue.js中&#xff0c;父子组件通信是组件化开发中的重要概念&#xff0c;同时我们还会讨论其他组件间通信的方式。 父子组件通信&#xff1a;Props 和 Events…...

告别坐标点击!用Poco精准定位UI控件,让你的Airtest安卓自动化脚本更稳定

告别坐标点击&#xff01;用Poco精准定位UI控件&#xff0c;让你的Airtest安卓自动化脚本更稳定每次UI微调就导致脚本大面积失效&#xff1f;分辨率变化让精心编写的自动化测试瞬间崩溃&#xff1f;作为从坐标点击转型到控件识别的实践者&#xff0c;我深刻理解这种挫败感。三年…...

Taotoken用量看板功能详解,助你洞察团队AI资源消耗模式

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken用量看板功能详解&#xff0c;助你洞察团队AI资源消耗模式 对于技术管理者或项目负责人而言&#xff0c;清晰了解团队的AI…...

如何利用开源工具Unlock-Music解决音乐平台加密格式兼容问题

如何利用开源工具Unlock-Music解决音乐平台加密格式兼容问题 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://gi…...

8款网盘直链下载助手:彻底告别限速烦恼,实现高速下载自由

8款网盘直链下载助手&#xff1a;彻底告别限速烦恼&#xff0c;实现高速下载自由 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移…...

MPC Video Renderer终极指南:如何在Windows上实现专业级视频渲染体验

MPC Video Renderer终极指南&#xff1a;如何在Windows上实现专业级视频渲染体验 【免费下载链接】VideoRenderer Внешний видео-рендерер 项目地址: https://gitcode.com/gh_mirrors/vi/VideoRenderer MPC Video Renderer是一款专为Windows平台设计…...

从Figma设计到Python GUI:Tkinter-Designer如何重塑可视化开发范式

从Figma设计到Python GUI&#xff1a;Tkinter-Designer如何重塑可视化开发范式 【免费下载链接】Tkinter-Designer An easy and fast way to create a Python GUI &#x1f40d; 项目地址: https://gitcode.com/gh_mirrors/tk/Tkinter-Designer 在Python GUI开发领域&am…...

专业构建现代化英雄联盟智能助手:基于LCU API的完整实战指南

专业构建现代化英雄联盟智能助手&#xff1a;基于LCU API的完整实战指南 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine Seraphine是一款基于英雄联盟官方LCU API开发的开源智能助手&#xff0c;专为英雄联盟…...

别再乱用Bool和Enum了!用UE5的Gameplay Tags重构你的角色状态机(GAS避坑指南)

别再乱用Bool和Enum了&#xff01;用UE5的Gameplay Tags重构你的角色状态机&#xff08;GAS避坑指南&#xff09;当你的ARPG角色同时陷入眩晕、灼烧和减速状态时&#xff0c;传统状态机往往会暴露出致命缺陷——布尔值互相覆盖、枚举组合爆炸、条件判断嵌套成灾。而UE5的Gamepl…...

机器学习赋能分子模拟:从数据驱动CV到自适应采样破解采样瓶颈

1. 项目概述与核心价值在分子模拟的世界里&#xff0c;我们常常面临一个根本性的困境&#xff1a;我们想理解一个复杂系统&#xff08;比如一个蛋白质如何折叠&#xff0c;或者一个催化剂表面如何发生反应&#xff09;的微观机理&#xff0c;但系统的相空间维度高得吓人——动辄…...

深度解析Atmosphere系统:为Nintendo Switch带来的完整自定义固件解决方案

深度解析Atmosphere系统&#xff1a;为Nintendo Switch带来的完整自定义固件解决方案 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 你是否曾为Switch游戏价格高昂而烦恼&#xff1f;是否…...