记录--前端换肤方案 - element+less无感换肤(无需页面刷新)

这篇具有很好参考价值的文章主要介绍了记录--前端换肤方案 - element+less无感换肤(无需页面刷新)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

记录--前端换肤方案 - element+less无感换肤(无需页面刷新)

前端换肤方案 - element+less无感换肤(无需页面刷新)

前言

前不久在改造一个迭代了一年多的项目时,增加了一个换肤功能。通过自己的探索,总结出了一套比较合适的改造方案供大家参考,如有更好的方案欢迎评论区踊跃评论😄

先上效果:

记录--前端换肤方案 - element+less无感换肤(无需页面刷新)

聊聊现有方案

在查阅现有方案时,总结了目前使用的几种方案:

1、定义多套样式

首先定义一套或多套样式变量,包括浅色和深色两种主题。在scss或less中使用变量,通过js改变root节点的class或属性来达到样式覆盖。 这种方式实现的前端换肤方案,可能会导致样式不易管理,查找样式复杂,每一套皮肤需要写一个css文件,造成多个css代码冗余。

$dark-fill-1: #222;  
$dark-color-text: #fff;   
$dark-color-text-1: rgba(255,255,255,0.3);   
$dark-color-text-2: $color-brand1;

[data-theme="dark"] {   
  body { background: $dark-fill-1; }   
  .item .name { color: $dark-color-text; }   
  .item .desc { color: $dark-color-text-1; }   
  .header .text { color: $dark-color-text-2; }   
}

 

2、使用less传参

通过less或scss的传参属性,同样的只要改变根节点class或属性即可以改变页面样式,与第一点的优点是不需要写多份css文件,缺点是通过方法传入,当样式过多时,参数过多,需要改变某一个颜色成本高,容易造成问题。

.theme(
    @mainPageBG: #f4f6ff,
    @fColor: #1b1e29,
    @vanBgColor: rgb(198, 183, 140),
    @vanColor: #fff
) {
    .home {
        background: @mainPageBG;
        color: @fColor;
    }
}

.themeWhite {
    .theme(#fff, #1b1e29, rgb(198, 183, 140), #fff);
}
.themeBlack {
    .theme(#090c14, #fff, rgb(198, 183, 140), #fff);
}

3、VueUse+css变量快速切换

使用外部库VueUse的useDark快速切换黑暗和明亮模式。

<script setup lang="ts">
import { useToggle } from '@vueuse/shared'
import { isDark } from '../../.vitepress/theme/composables/dark'

// const isDark = useDark()
const toggleDark = useToggle(isDark)
</script>

<template>
  <button @click="toggleDark()">
    <i inline-block align-middle i="dark:carbon-moon carbon-sun" />

    <span class="ml-2">{{ isDark ? 'Dark' : 'Light' }}</span>
  </button>
</template>

最终解决方案

接触了解了上述几个方案后,结合项目本身架构(less+element+echarts+map),最终采用了以下使用方案。

less变量处理

1、定义不同肤色的css变量

.themeDark {
    --theme-color: #141414;
    --header-primary-color: #1a3750;
    --bg-content-default: #1a3750;
    --bg-theme-default: #13293b;
    --bg-left-color: #27415a;
}

.themeLight {
    --theme-color: #f4f4f4;
    --header-primary-color: #2670ff;
    --bg-content-default: #fff;
    --bg-theme-default: #f3f5f9;
    --bg-left-color: #eff3f4;
}

2、引入css变量,并通过定义less变量使用,解决了通过方法传参,参数过多的问题。

//换肤相关
@import './dark.less';
@import './light.less';

@theme-color: var(--theme-color-te);
@header-primary-color: var(--header-primary-color);
@bg-content-default: var(--bg-content-default);
@bg-left-color: var(--bg-left-color);
@bg-theme-default: var(--bg-theme-default);
@font-default-color: var(--font-default-color);

element 主题切换

1、可以在element官网定制和下载不同主题的style文件,将css文件更名为less,在最外层增加自定义的类。

.themeDark{
    //下载的css文件
    ...
}

2、为了开发中不用每次去编译这个较大的less文件,再通过less命令,将less转为css

lessc + 空格 + less文件名

最终效果:

@charset "UTF-8";
.themeDark .fade-in-linear-enter-active,
.themeDark .fade-in-linear-leave-active {
  -webkit-transition: opacity 0.2s linear;
  transition: opacity 0.2s linear;
}
...

3、main.js中引入

echarts

因为项目中使用了大量的echarts,在动态切换肤色时echarts需要重新加载才能改变,因此,需要通过监听全局变量,当改变皮肤时重新渲染echarts。将当前主题存放到vuex中

watch:{
        '$store.state.myTheme'() {
            this.getAllData();
        }
}

map

项目中使用到了腾讯地图,所以也需要更改在不同主题下不同的地图主题。在使用地图时我们知道,在引入地图时需要去引入地图的入口文件,入口文件中包含着需要加载的地图资源,所以我们只需要在腾讯地图官网定义不同的主题颜色,将其style.json保留下来,修改入口文件中的配置。

...
styleSrc: theme == 'themeDark' ? '/static/style.json' : 'https://xxxx/static/cdn/style{id}/style.json',
style3DSrc:  theme == 'themeDark'  ? '/static/style.json' : 'https://xxxx/static/cdn/style{id}/style.json',
...

js改变主题

做好以上准备工作,在main.js中在改变html的上的属性以及vuex来实现不用刷新更换不同主题。

将需要设置的主题存放到Storage中,以保证刷新后主题颜色不变,为了兼容UI框架(比如dialog会将dom渲染到body外),所以将class置于最顶层html上,改变主题的时候改变html上的class,这样下层所有的less变量将会使用该class下的颜色主题。修改vuex的值,用于触发echarts的刷新。

/**
* 切换肤色
*/
changeColor(type) {
    this.themeClass = type;
    window.sessionStorage.setItem('themeClass', this.themeClass);
    //动态修改html class,为了兼容UI框架,将class置于最顶层
    const themeArr = ['themeDark', 'themeLight'];
    let tempArr = document.querySelector('html').classList;
    tempArr.forEach((item) => {
        if (themeArr.includes(item)) {
            document.querySelector('html').classList.remove(item);
        }
    });
    document.querySelector('html').classList.add(this.themeClass);

    //修改echarts的颜色
    if (type == 'themeLight') {
        Vue.prototype.$themeChartColor = '#333';
    } else {
        Vue.prototype.$themeChartColor = '#fff';
    }
    //修改store的值,可用于触发相操作
    this.$store.commit('setMyTheme', type);
},

结语

以上便是本次换肤分享,由于该项目刚开发时并没有考虑到后续需要换肤的方案,在本次开发时也遇到很多细节问题,比如之前开发时主题色、各种状态颜色标准使用不一致,改造时我尽量去将一些相近的颜色做到统一,保持系统整体一致性。本次迭代也用了较短的时间实现了这个换肤功能,总体效率上来说这种方案和体验是比较好的。

本文转载于:

https://juejin.cn/post/7282290326068641847

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 记录--前端换肤方案 - element+less无感换肤(无需页面刷新)文章来源地址https://www.toymoban.com/news/detail-710532.html

到了这里,关于记录--前端换肤方案 - element+less无感换肤(无需页面刷新)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华硕天选笔记本频繁IRQL_NOT_LESS_OR_EQUAL蓝屏个人解决方案记录

    首先叠个甲,笔记本为华硕天选R7-4800H,RTX2060版本 认证型号 FA506 符合以下条件的可以试一下 自己手动重装过系统 更改过电源模式为高性能 蓝屏代码多为IRQL_NOT_LESS_OR_EQUAL,提示文件为ntoskrnl.exe 尝试过更换内存条,硬盘等硬件均会复现 仅使用电池时未复现 接通电源长时间不

    2024年02月03日
    浏览(135)
  • 数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏: 数据分析系统化教学,零基础到进阶实战 景天的主页: 景天科技苑 Streamlit是一个免费的开源框架,用于快速构建和共享漂亮的数据科学Web应用程序。它是一个基于Python的库,专为机器学

    2024年03月14日
    浏览(38)
  • Vue + Element UI 前端篇(十三):页面权限控制

    既然是后台权限管理系统,当然少不了权限控制啦,至于权限控制,前端方面当然就是对页面资源的访问和操作控制啦。 前端资源权限主要又分为两个部分,即导航菜单的查看权限和页面增删改操作按钮的操作权限。 我们的设计把页面导航菜单和页面操作按钮统一存储在菜

    2024年01月25日
    浏览(39)
  • 记录--Vue3自定义一个Hooks,实现一键换肤

    使用CSS变量, 准备两套CSS颜色 , 一套是在 light模式下的颜色,一套是在dark模式下的颜色 dark模式下的 CSS 权重要比 light 模式下的权重高 , 不然当我们给html添加自定义属性 [data-theme=\\\'dark\\\'] 的时候, dark模式权重比light低,会一直不起效果 当我们点击 dark 模式的时候, 给 html 设置自定义

    2024年02月07日
    浏览(27)
  • Vue2 +Element-ui实现前端页面

    以一个简单的前端页面为例。主要是利用vue和element-ui实现。 里面涉及的主要包括:新建vue项目、一行多个输入框、页面实现等。   ①首先安装nodejs,这部分在此就不讲啦。 ②然后安装vue-cli: 查看是否安装成功: 安装成功之后就输出vue的版本 ③在cmd窗口新建一个vue2脚手架

    2024年02月16日
    浏览(35)
  • vue 前端页面开发经验记录

    本博文记录了在vue项目开发中的一些经验,具体包含:class动态绑定、子页面刷新、注入函数到子页面、数据加载效果、单击后编辑、文件上传、数据分页、表单提交等的使用记录。 1、class动态绑定 根据变量的值绑定不同的class样式,这里ftype的值可为full_label、zero_label、ha

    2024年02月14日
    浏览(30)
  • 【Vue+Element-plus】记录后台首页多echart图静态页面

     Index.vue  DataComparison.vue DateTime.vue HealPatient.vue PeopleNumber.vur TrackPatients.vue VisitsNumber.vue

    2024年02月13日
    浏览(30)
  • 【车载 Android】应用换肤方案(一) - Runtime Resource Overlay

    手机应用的动态换肤功能目前已经使用的比较广泛了,也有许多文章分析了其中的原理,使用方式也大同小异,基本都需要在应用内集成一个三方的框架,或独立开发一个换肤框架。此类换肤方式需要长期维护一套换肤框架,对原始应用存在一定的侵入性,开发的复杂度、工

    2024年02月06日
    浏览(29)
  • 记录--极致舒适的Vue页面保活方案

    为了让页面保活更加稳定,你们是怎么做的? 我用一行配置实现了 Vue页面保活是指在用户离开当前页面后,可以在返回时恢复上一次浏览页面的状态。这种技术可以让用户享受更加流畅自然的浏览体验,而不会被繁琐的操作打扰。 页面保活可以提高用户的体验感。例如,当

    2024年02月03日
    浏览(23)
  • 菜鸟级:Vue Element-UI 前端 + Flask 后端 的登录页面验证码

    这里记录登录页面验证码的做法,采取的是前后端分离的做法,前端用Vue,后端用Flask 首先是GIF效果图: 后端返回的数据结构(base64字符串,response.data.img):   1、Vue前端页面基本采用Ruoyi Ui里面的登录页面代码,里面的一些方法进行重写; 首先是单个vue文件里网页内容

    2023年04月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包