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

news2025/1/21 12:12:40

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:00
      const eTime = `${day} ${ele.mandatoryUsageTime[0]}` //2023-08-10 10:00:00
      const sTime_ = dayjs(sTime).valueOf() //2023-08-09 09:44:00
      const 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.coloradmin.cn/o/991173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis如何保证接口的幂等性

背景 如何防止接口中同样的数据提交&#xff0c;以及如何保证消息不被重复消费&#xff0c;这些都是shigen在学习的过程中遇到的问题。今天&#xff0c;趁着在学习redis的间隙&#xff0c;我写了一篇文章进行简单的实现。 注意&#xff1a;仅使用于单机的场景&#xff0c;对于…

春秋云镜 CVE-2017-1000480

春秋云镜 CVE-2017-1000480 Smarty < 3.1.32 PHP代码执行漏洞 靶标介绍 3.1.32 之前的 Smarty 3 在未清理模板名称的自定义资源上调用 fetch() 或 display() 函数时容易受到 PHP 代码注入的影响。 启动场景 漏洞利用 poc /index.php?eval*/phpinfo();/*/index.php?ev…

原生JavaScript+PHP多图上传实现

摘要 很多场景下需要选择多张图片上传&#xff0c;或者是批量上传以提高效率&#xff0c;多图上传的需求自然就比较多了&#xff0c;本文使用最简单的XMLHttpRequest异步上传图片。 界面 上传示例 代码 index.html <!DOCTYPE html> <html><head><titl…

node.js下载安装环境配置以及快速使用

目录 一、下载 二、安装 三、测试安装是否成功 四、配置环境 五、测试配置环境是否成功 六、安装淘宝镜像 七、快速上手 1、建立一个自己的工作目录 2、下载工作代码 八、各种配置文件匹配问题入坑 九、总结 一、下载 Node.js 中文网 想选择其他版本或者其他系统使用…

【Chrome】chrome浏览器未连接到互联网

问题描述 电脑上安装了一个联想电脑管家&#xff0c;进行了一下清理&#xff0c;并优化了一下启动项&#xff0c;Chrome浏览器突然什么网站都无法访问了。以为更新坏了&#xff0c;但相同的网站放到火狐浏览器上&#xff0c;竟然可以打开&#xff0c;怎么回事呢&#xff1f;怎…

使用EMgu检测人脸

1,安装EMgu 在NuGet中,查找并安装EMgu 2,做人脸检测 首先,声明几个重要的类 //Thread.Sleep(3000);matImg = new Mat();capture.Retrieve(matImg, 0); frame=new Image<Bgr, byte>(matImg.Bitmap); 当,frame != null时,检测到人脸 3,给人脸画框 i…

MySQL主从分离读写复制

在高负载的生产环境里&#xff0c;把数据库进行读写分离&#xff0c;能显著提高系统的性能。下面对MySQL的进行读写分离。 试验环境 A机&#xff1a;IP:192.168.0.1 mysql版本&#xff1a;mysql-5.6.4,主数据服务器&#xff08;只写操作&#xff09; B机&#xff1a;IP:192.…

SpringMVC_执行流程

四、SpringMVC执行流程 1.SpringMVC 常用组件 DispatcherServlet&#xff1a;前端控制器&#xff0c;用于对请求和响应进行统一处理HandlerMapping&#xff1a;处理器映射器&#xff0c;根据 url/method可以去找到具体的 Handler(Controller)Handler:具体处理器&#xff08;程…

SpringMVC实现增删改查

文章目录 一、配置文件1.1 导入相关pom依赖1.2 jdbc.properties&#xff1a;配置文件1.3 generatorConfig.xml&#xff1a;代码生成器1.4 spring-mybatis.xml &#xff1a;spring与mybatis整合的配置文件1.5 spring-context.xml &#xff1a;上下文配置文件1.6 spring-mvc-xml:…

uni-app 之 获取网络列表数据

uni-app 之 获取网络列表数据 image.png <template><!-- vue2的<template>里必须要有一个盒子&#xff0c;不能有两个&#xff0c;这里的盒子就是 view--><view>--- uni.request 网络请求API接口 ---<view v-for"(item) in caturl" :key&…

学信息系统项目管理师第4版系列05_组织通用管理

1. 流程管理 1.1. 流程是组织运行体系的框架基础&#xff0c;流程框架的质量影响和决定了整个组织运行体系的质量 1.2. 流程是指工作活动流转的过程 1.2.1. 流程可以是跨部门、跨岗位工作活动流转的过程 1.3. 业务流程是一组将输入转化为输出的相互关联或相互作用的活动 1…

NPM 常用命令(六)

1、npm explain 1.1 命令使用 npm explain <package-spec>别名: why 1.2 描述 此命令将打印导致在当前项目被其他引用包的依赖链。 如果提供了一个或多个包规范&#xff0c;则只有与其中一个说明符匹配的包才会解释它们的关系。 包规范还可以引用 ./node_modules 中…

Typescript技术分享

1、初识TypeScript TypeScript是什么&#xff1f; TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集。TypeScript 在 JavaScript 的基础上添加了可选的静态类型和基于类的面向对象编程。 2、TS类型 2.1 布尔类型(boolean) boolean类型只有两个取…

重建与发展:数字资产借贷行业朝着可持续发展迈进!

纵观历史&#xff0c;贷款和货币一样古老&#xff0c;无论哪种形式的货币都需要有其借贷市场。现在&#xff0c;比特币以其分散和透明的性质&#xff0c;在加密领域占据龙头地位。 就像之前的货币一样&#xff0c;比特币要真正蓬勃发展&#xff0c;也需要一个强大的借贷市场。然…

2023计算机毕业设计题目 毕设选题大全

文章目录 0 前言1 java web 管理系统 毕设选题2 java web 平台/业务系统 毕设选题3 游戏设计、动画设计类 毕设选题 (适合数媒的同学)4 算法开发5 数据挖掘 毕设选题6 大数据处理、云计算、区块链 毕设选题7 网络安全 毕设选题8 通信类/网络工程 毕设选题9 嵌入式 毕设选题10 开…

数据中心的未来是什么?

数据中心作为数字化经济的基础设施&#xff0c;在未来的发展中将会呈现出以下几个趋势和变化&#xff1a;多云环境的普及&#xff1a;未来的数据中心将会逐渐实现多云环境的兼容和协同&#xff0c;支持从公共云、私有云到混合云的多重部署模式。多云化环境将提供更多的选择和灵…

Matlab图像处理-最大类间方差阈值选择法(Otsu)

基本思想 最大类间方差阈值选择法又称为Otsu 算法&#xff0c;该算法是在灰度直方图的基础上用最小二乘法原理推导出来的&#xff0c;具有统计意义上的最佳分割阈值。它的基本原理是以最佳阈值将图像的灰度直方图分割成两部分&#xff0c;使两部分之间的方差取得最大值&#x…

全球城市汇总【最新】

文章目录 案例图国家城市大洲 数据 全球城市、国家、介绍汇总。包含 .csv .sql .xml 格式数据。 案例图 国家 城市 大洲 数据 获取上图资源绑定 https://blog.csdn.net/qq_40374604/category_12435042.html 如找不到在合集中查找。

【web开发】3、Bootstrap基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Bootstrap是什么&#xff1f;二、使用步骤1.引入Bootstrap2.Bootstrap常用全局 CSS 样式介绍与示例布局容器栅格系统排版代码表格表单按钮图片辅助类3.Bootstra…

JUC P8 ThreadLocal 基础+代码

JUC P8 ThreadLocal 基础代码 教程&#xff1a;https://www.bilibili.com/video/BV1ar4y1x727?p100 引出问题 ThreadLocal 和 TreadLocalMap 数据结构关系&#xff1f; ThreadLocal 中的 key 是弱引用&#xff0c;为什么&#xff1f; ThreadLocal 内存泄漏问题是什么&#x…