利用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.hqwc.cn/news/102463.html

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

相关文章

微服务01-基本介绍+注册中心EureKa

基本介绍 服务集群&#xff1a;一个请求由多个服务完成&#xff0c;服务接口暴露&#xff0c;以便于相互调用&#xff1b; 注册中心&#xff1a;每个服务的状态&#xff0c;需要进行维护&#xff0c;我们可以在注册中心进行监控维护服务&#xff1b; 配置中心&#xff1a;这些…

自动化测试开发 —— 如何封装自动化测试框架?

封装自动化测试框架&#xff0c;测试人员不用关注框架的底层实现&#xff0c;根据指定的规则进行测试用例的创建、执行即可&#xff0c;这样就降低了自动化测试门槛&#xff0c;能解放出更多的人力去做更深入的测试工作。本篇文章就来介绍下&#xff0c;如何封装自动化测试框架…

Wireshark抓包常用指令

1.常用过滤规则 指定源地址&#xff1a; ip.src 10.0.1.123ip.src 10.0.1.123 && udphttp数据链路层&#xff1a;筛选mac地址为04:f9:38:ad:13:26的数据包----eth.src 04:f9:38:ad:13:26筛选源mac地址为04:f9:38:ad:13:26的数据包----eth.src 04:f9:38:ad:13:26网…

图片怎么转换成pdf格式?好方法必须分享

图片怎么转换成pdf格式&#xff1f;也许一些朋友会问&#xff0c;为什么要将图片转换成PDF文件呢&#xff1f;众所周知&#xff0c;PDF文件格式具有较高的安全性和兼容性&#xff0c;并且不容易编辑。因此&#xff0c;在打印时&#xff0c;将图片转换成PDF格式后再进行打印可以…

postgis数据库导出csv表再导入postgis

1、导出csv表 from settings_Address import * from sqlalchemy import create_engine, MetaData import pandas as pd def create_conn(Postgis_user,Postgis_password,Postgis_host,Postgis_port,dbname_PG):# return create_engine(PostgispyPostgis://{}:{}{}:{}/{}.forma…

云端AI:释放企业创新力,打造智慧企业

文章目录 1. 云端AI的基本概念1.1 云计算1.2 人工智能1.3 云端AI 2. 云端AI的重要性2.1 成本效益2.2 弹性扩展2.3 无缝整合2.4 实时更新 3. 云端AI的应用领域3.1 智能客服3.2 预测分析3.3 自动化生产 4. 云端AI的未来趋势4.1 边缘计算与云端AI的融合4.2 可解释性AI4.3 隐私和安…

android studio 的 adb配置

首先在 Android Studio 中 打开 File -> Settings: 下载 “Google USB Driver” 这个插件 (真机调试的时候要用到), 并且记一下上面的SDK路径: 右键桌面上的 “我的电脑”, 点击 “高级系统设置”, 配置计算机的高级属性, 有两步: 添加一个新的环境变量 ANDROID_HOME, 变量…

2023年数学建模国赛A 定日镜场的优化设计思路分析

构建以新能源为主体的新型电力系统&#xff0c;是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。定日镜是塔式太阳能光热发电站&#xff08;以下简称塔式电站&#xff09;收集太阳能的基本组件&#xff0c;其底座由…

解决windows下git操作提示用户名密码错误的问题

当代码从一个平台切换到另一个平台的时候&#xff0c;需要做两步操作&#xff0c;第一步就是更新git的仓库地址&#xff0c;在项目的.git/config文件里面修改&#xff0c;这一步做完之后&#xff0c;就可以推送代码到新的仓库了&#xff0c;这里就是重点来了。 一般第一次推动代…

手机无人直播软件在苹果iOS系统中能使用吗?

在现代社交媒体的时代&#xff0c;直播带货已经成为了一种热门的销售途径。通过直播&#xff0c;人们可以远程分享自己的商品&#xff0c;与观众进行互动&#xff0c;增强沟通和参与感。而如今&#xff0c;手机无人直播软件更是成为了直播带货领域的一项火爆的技术。那么&#…

【HTML专栏1】语法规范、基础结构标签

本文属于HTML/CSS专栏文章&#xff0c;适合WEB前端开发入门学习&#xff0c;详细介绍HTML/CSS如果使用&#xff0c;如果对你有所帮助请一键三连支持&#xff0c;对博主系列文章感兴趣点击下方专栏了解详细。 博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;HTML/CS…