利用less实现多主题切换(配合天气现象)

1. 先看效果:效果图
2. 话不多说直接撸吧:

  • 原理:先给body元素添加style,再根据天气现象动态更改style
    在这里插入图片描述

  • 开撸:

  • 创建src/assets/style/variables.less 使用 @XXX:var(–XXX,‘style’) 声明系列变量,之后添加其他变量直接增加即可(由于之后要配置颜色,默认值可以先给" ")
    也可以声明一下常用的class,方便全局使用(这里已.backgroundCard 为例)

// 默认的主题颜色
@backgroundImg: var(--backgroundImg, ''); //背景
@backgroundCard: var(--backgroundCard, ''); //卡片背景
@backgroundTab: var(--backgroundTab, ''); //底部tab背景
@backgroundDeep: var(--backgroundDeep, ''); //小时累计背景
@backgroundDeepTextColor: var(--backgroundDeepTextColor, ''); //小时累计字体颜色
@textColorStyle: var(--textColorStyle, ''); //卡片内的(包括不限于温度,降水,风)值得颜色
@textColorStyleBottom: var(--textColorStyleBottom, ''); //卡片内的(包括不限于温度,降水,风)值下面的描述颜色
@backgroundCardLine: var(--backgroundCardLine, ''); //卡片标题下面的线条
@colorStopsOffset1: var(--colorStopsOffset1, ''); //echarts折线图渐变色0%处
@colorStopsOffset2: var(--colorStopsOffset2, ''); //echarts折线图渐变色100%处
@lineStyleClor: var(--lineStyleClor, ''); echarts折线颜色
@backgroundPrecipitation: var(--backgroundPrecipitation, ''); //降水按钮背景
@r: 25rem;
//首页卡片
.backgroundCard {position: relative;padding: 14 / @r;border-radius: 14 / @r;background-color: @backgroundCard;text-align: center;font-size: 13 / @r;color: #fff;margin-bottom: 14 / @r;
}
  • 创建src/config/model.ts 声明所有类型主题themes
//定义主题使用条件及强制使用时间
export const weatherType: any = [{ typeNames: ['默认底部tabber'], theme: 'defaultTabbar', mandatoryUsageTime: [] },{ typeNames: ['晴'], theme: 'default', mandatoryUsageTime: [] },{typeNames: ['雨','阴','阵雨',//...],theme: 'rain',mandatoryUsageTime: []},{ typeNames: ['夜晚'], theme: 'dark', mandatoryUsageTime: ['22:00:00', '7:00:00'] }
]
// 定义主题色变量值
// 默认使用default(蓝色);  '雾'使用rain(灰色);
// 在mandatoryUsageTime[开始时间,第二天结束时间]之间使用dark
export const themes: any = {defaultTabbar: {backgroundCard: 'rgba(35,115,191,0.8)',backgroundTab: 'rgba(35,115,191,0.8)',textColorStyle: '#FFDE3D'},default: {backgroundImg: 'url(/images/weatherBg/img-qinbtian.png)',backgroundCard: 'rgba(35, 115, 191, 0.80)',backgroundTab: '#2373BF',backgroundDeep: '#1C6CB7',backgroundDeepTextColor: '#00A4FF',backgroundPrecipitation: 'rgba(35, 115, 191, 0.80)',textColorStyle: '#FFDE3D',backgroundCardLine: 'rgba(255,255,255,.2)',textColorStyleBottom: '#95bde3',colorStopsOffset1: 'rgba(110, 186, 255,1)',colorStopsOffset2: 'rgba(255,255,255,0)',lineStyleClor: '#00A4FF'},dark: {backgroundImg: 'url(/images/weatherBg/img-wanshang.png)',backgroundCard: 'rgba(16, 4, 77, 0.80)',backgroundTab: '#10044D',backgroundDeep: '#281A72',backgroundDeepTextColor: '#D9D9D9',backgroundPrecipitation: 'rgba(16, 4, 77, 0.80)',textColorStyle: '#EB6ECC',backgroundCardLine: 'rgba(255,255,255,.2)',textColorStyleBottom: '#918ca9',colorStopsOffset1: 'rgba(235, 110, 204,1)',colorStopsOffset2: 'rgba(255,255,255,0)',lineStyleClor: '#EB6ECC'},rain: {backgroundImg: 'url(/images/weatherBg/img-yingtian.png)',backgroundCard: 'rgba(82, 102, 126, 0.80)',backgroundTab: '#52667E',backgroundDeep: '#4D617B',backgroundDeepTextColor: '#B5B5B5',backgroundPrecipitation: 'rgba(82, 102, 126, 0.8)',textColorStyle: '#64D2FE',backgroundCardLine: 'rgba(255,255,255,.2)',textColorStyleBottom: '#adb7c4',colorStopsOffset1: 'rgba(110, 186, 255,1)',colorStopsOffset2: 'rgba(255,255,255,0)',lineStyleClor: '#00A4FF'}
}
  • 创建src/config/weatherTheme.ts 进行逻辑处理
import { themes, weatherType} from './model'
import { store, pinia } from '@src/store'
import { ref } from 'vue'
import dayjs from 'dayjs'
import * as webStorage from '@src/utils/web-storage'/*** 传入天气现象名称更改主题* @param typeName 天气现象名称*/
export function changeTheme(typeName) {const day = dayjs().format('YYYY-MM-DD')const dayAdd1 = dayjs().add(1, 'days').format('YYYY-MM-DD')const nowTime_ = new Date().getTime()let theme = 'default'for (let i = 0; i < weatherType.length; i++) {const ele = weatherType[i]store.system.useThemeStore(pinia).changeIsDark(false)//有强制使用时间先使用强制时间 ['21:00:00', '10:00:00']if (ele.mandatoryUsageTime.length && typeName != '默认底部tabber') {const sTime = `${day} ${ele.mandatoryUsageTime[1]}` //2023-08-09 22:00:00const eTime = `${day} ${ele.mandatoryUsageTime[0]}` //2023-08-10 10:00:00const sTime_ = dayjs(sTime).valueOf() //2023-08-09 09:44:00const eTime_ = dayjs(eTime).valueOf()if (nowTime_ >= sTime_ && nowTime_ <= eTime_) {} else { //使用夜晚风格setTheme(ele.theme)store.system.useThemeStore(pinia).changeIsDark(true)return}} else {if (ele.typeNames.includes(typeName)) theme = ele.theme}}setTheme(theme)
}// 修改页面中的样式变量值
const changeStyle = (obj: any, themeName: string) => {//存入主题类型store.system.useThemeStore(pinia).changeThemeType(themeName)for (const key in obj) {document.getElementsByTagName('body')[0].style.setProperty(`--${key}`, obj[key])//存入主题色store.system.useThemeStore(pinia).changeWeatherThemeObj(`--${key}`)}
}
// 改变主题的方法
export const setTheme = (themeName: any) => {const themeConfig = themes[themeName]changeStyle(themeConfig, themeName)
}
  • 使用:再需要改变主题的页面或者逻辑中使用changeTheme()方法即可(这里已首次进入的.vue文件为例)
//首先使用上次的主题
const weatherThemeName = webStorage.getLocalStorage(`weatherThemeName`)
changeTheme(weatherThemeName || '晴'
)
//我业务的逻辑是动态获取天气现象,根据天气现象的不同使用不同的主题,这里可以改成自己的逻辑(方法有筛检)
const getWeatherInfo = async (time, posInfo) => {await api.windRain.weatherLiveBypoint() //自己的方法.then(res => {if (!res.code && res.data) {const data = res.data//只有再首页“风雨”模块使用,防止底部切换过快if (router.value.meta.title == pageStore.defaultname) {//每次将天气现象存到storage里,下次进来直接取webStorage.setLocalStorage('weatherThemeName', data.wpName)changeTheme(data.wpName || '晴')}}emit('getWeatherInfoData', weatherInfoData)})
}getWeatherInfo()
//css使用,这里只是一部分,在相应的class后直接使用之前定义的方法即可
<style lang="less" scoped>
.page-wind-rain {width: 100%;height: 100%;background-image: @backgroundImg;background-size: 100% 100%;background-color: @backgroundCard;	
}
</style>
  • vite.config.ts配置
    最后将我们定义的variable.less在css预处理器中配置
    在这里插入图片描述

  • 大功告成!!!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/125573.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单臂路由实验:通过Trunk和子接口实现VLAN互通

文章目录 一、实验背景与目的二、实验拓扑三、实验需求四、实验解法1. PC 配置 IP 地址2. PC3 属于 Vlan10&#xff0c;PC4 属于 Vlan20&#xff0c;配置单臂路由实现 Vlan10 和 Vlan20 三层互通3. 测试在 PC3 上 Ping PC4 &#xff0c;可以 Ping 通 PC4 摘要&#xff1a; 本文…

任意文件读取及漏洞复现

文章目录 渗透测试漏洞原理任意文件读取1. 任意文件读取概述1.1 漏洞成因1.2 漏洞危害1.3 漏洞分类1.4 任意文件读取1.4.1 文件读取1.4.2 任意文件读取1.4.3 权限问题 1.5 任意文件下载1.5.1 一般情况1.5.2 PHP实现1.5.3 任意文件下载 2. 任意文件读取攻防2.1 路径过滤2.1.1 过…

引爆用户参与:消息重弹,让您的推送不再被忽略

在当前各大APP拉新促活成本居高不下的大背景下&#xff0c;如何稳定存量用户、提升用户粘性就显得尤为关键。从促销活动到个性化推荐&#xff0c;从互动通知到功能提醒&#xff0c;消息推送已成为各大APP连接存量用户和目标市场之间的桥梁&#xff0c;通过点击推送&#xff0c;…

springboot初试elasticsearch

引入依赖 elasticsearch的依赖版本与你elasticsearch要一致 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency> 索引库的操作 创建索引库 impo…

Visual Studio 2019下使用C++与Python进行混合编程——环境配置与C++调用Python API接口

前言 在vs2019下使用C与Python进行混合编程,在根源上讲&#xff0c;Python 本身就是一个C库&#xff0c;那么这里使用其中最简单的一种方法是把Python的C API来嵌入C项目中&#xff0c;来实现混合编程。当前的环境是&#xff0c;win10,IDE是vs2019,python版本是3.9&#xff0c…

LeetCode 刷题记录——从零开始记录自己一些不会的

1. 最多可以摧毁的敌人城堡数目 题意 思路 两层循环&#xff0c;太low了 用一个变量记录前一个位置 代码 class Solution { public:int captureForts(vector<int>& forts) {int ans 0, pre -1;for (int i 0; i < forts.size(); i) {if (forts[i] 1 || forts…

04、javascript 修改对象中原有的属性值、修改对象中原有属性的名字(两种方式)、添加对象中新属性等的操作

1、修改对象中原有的属性值 其一、代码为&#xff1a; // 想将 obj 中的 flag 值&#xff0c;根据不同的值来变化(即&#xff1a;修改对象中原有的属性值)&#xff1b; let obj {"port": "port_0","desc": "desc_0","flag&quo…

IP应用场景查询API:深入了解网络用户行为的利器

前言 随着数字时代的不断发展&#xff0c;互联网已经成为人们生活的重要组成部分。而随着越来越多的业务和社交活动迁移到在线平台上&#xff0c;了解和理解网络用户行为变得至关重要。为了满足这个需求&#xff0c;IP 应用场景查询 API 崭露头角&#xff0c;成为深入了解网络…

安卓绘制原理概览

绘制原理 Android 程序员都知道 Android 的绘制流程分为 Measure、Layout、Draw 三步骤&#xff0c;其中 Measure 负责测量 View 的大小Layout 负责确定 View 的位置Draw 负责将 View 画在屏幕上 由 ViewRootImpl 实现的 performTraversal 方法是 Measure、layout、draw 的真正…

Linux创建新文件的几种方式

第一种是 vi 文件名&#xff0c;然后进入vi编辑&#xff0c;完了之后保存退出&#xff1b;然后ls看一下&#xff0c;文件有了&#xff1b; 在终端输入 cat > 文件名&#xff0c;这没用过&#xff1b;输入以后回车&#xff0c;不会退出命令&#xff1b;输入一行文字&#xff…

TLA+学习记录1——hello world

0x01 TLA是个好工具 编程人员一个好习惯是凡事都想偷懒&#xff0c;当然是指要科学地偷懒&#xff0c;而不是真的偷懒。一直想找到一种能检验写出的代码&#xff0c;做出的设计是否真的完全正确&#xff0c;而不是靠经验检视、代码Review、反复测试去检验。因为上述方法不管怎…

学习心得07:C#

之前也没有看过C#的书&#xff0c;C#的程序倒是搞了一些。好在项目不大&#xff0c;我又会套路。 C#很象是JAVA。好像就是JAVA出来之后&#xff0c;微软抄的。好东西就要学习&#xff0c;这不丢脸。 我倒是想&#xff0c;有没有办法把JAVA和C#进行映射&#xff0c;然后直接编译…

Unity入门教程||创建项目(上)

一、介绍 目的&#xff1a;通过尝试制作一款使用玩家角色把小球弹飞的简单小游戏&#xff0c;熟悉使用Unity进行游戏开发的基本流程。 软件环境&#xff1a;Unity 2017.3.0f3&#xff0c;Visual Studio 2013 二、创建新项目 1&#xff0c;启动Unity后将出现一个并列显示Pro…

Springboot 实践(14)spring config 配置与运用--手动刷新

前文讲解Spring Cloud zuul 实现了SpringbootAction-One和SpringbootAction-two两个项目的路由切换&#xff0c;正确访问到项目中的资源。这两个项目各自拥有一份application.yml项目配置文件&#xff0c;配置文件中有一部分相同的配置参数&#xff0c;如果涉及到修改&#xf…

【C++】模拟实现二叉搜索树的增删查改功能

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;C仓库 个人专栏&#xff1a;C专栏 文章目录 一、二叉搜索树的Insert操作&#xff08;非递归&#xff09;分析过程代码求解 二、二叉搜索树的Erase操作&#xff08;非递归&#xff09;分析过程代码求解…

激光焊接汽车尼龙塑料配件透光率测试仪

激光塑性成型技术是近年来塑性加工界出现的一种新技术。通常塑料主要是通过加热加压依赖模具成型。这对于单品种、大批量生产是有效的&#xff1b;而对于各种不同形状的塑料制件则需要昂贵的模具‚装置也较庞大。 高度聚焦的激光束垂直照射在待变形的板料上‚由于塑料直接吸收激…

Zstack 安装 黑群晖未找到硬盘:解决方法

错误原因&#xff1a; 发生错误的原因&#xff0c;黑群晖要求硬盘为Sata格式&#xff0c;而默认创建的硬盘格式为Virtio&#xff0c;我们要做的就是修改挂载的虚拟硬盘改为Sata格式 解决方法&#xff1a; 1、进入 ZStack&#xff0c;找到黑群晖的主机&#xff0c;查看 UUID …

TSINGSEE青犀视频AI算法助力构建城市市容·街面秩序管理解决方案

随着城市化进程加快&#xff0c;未经合理规划设置自然形成的马路市场越来越多&#xff0c;这不仅存在交通安全隐患&#xff0c;也造成了市容秩序混乱&#xff0c;严重影响城市市容面貌。 TSINGSEE青犀AI智能分析网关V3内部部署了几十种算法&#xff0c;包括人脸、人体、车辆、…

Jmeter系列-环境部署、详细介绍、安装目录介绍(1)

环境部署 官网下载Jmeter http://jmeter.apache.org/下载最新版本的 JMeter&#xff0c;解压文件到任意目录 安装JDK&#xff0c;配置Java环境 1、下载&#xff08;注意选择操作系统对应的位数32/64&#xff09; 官网 &#xff1a;http://www.oracle.com 2、安装&#xff0…

实战SpringMVC之CRUD

目录 一、前期准备 1.1 编写页面跳转控制类 二、实现CRUD 2.1 相关依赖 2.2 配置文件 2.3 逆向生成 2.4 后台代码完善 2.4.1 编写切面类 2.4.2 编写工具类 2.4.3 编写biz层 2.4.4 配置mapper.xml 2.4.5 编写相应接口类&#xff08;MusicMapper&#xff09; 2.4.6 处…