百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

vue 一键换肤(vue一键换皮肤)

myzbx 2025-03-26 14:21 7 浏览

该一键换肤只是定义好几个颜色,并进行简单的切换。

  1. 在src下的assets文件下面定义一个css文件夹,在对应的文件里面定义_handle.scss和_themes.scss文件,如下:

image.png

2.在_themes.scss文件里面定义好需要用到的几个样式。如下:

/**
*   _themes.scss
*   当HTML的data-theme为blue时,样式引用blue
*   data-theme为其他值时,就采用对应的默认样式
*   这里我定义了5套主题方案,想要再多只需在`$themes`里加就行了
*   注意一点是,每套配色方案里的key可以自定义但必须一致,不然就会混乱
*   这是定义好的对应变量的颜色(需要什么都可以自行定义并引用):
*   字体: font_color1
*   背景: background_color1
*   边框: border_color1
**/

$themes: (
  blue: (
    font_color1: #0056cc,
    background_color1: #0056cc,
    border_color1: #0056cc,
  ),
  glup: (
    font_color1: #e426fd,
    background_color1: #e426fd,
    border_color1: #e426fd,
  ),
  red: (  
    font_color1: #fd5451,
    background_color1: #fd5451,
    border_color1: #fd5451,
  ),
  green: (  
    font_color1: #0dd78d,
    background_color1: #0dd78d,
    border_color1: #0dd78d,
  ),
  yellow: (  
    font_color1: #feae4d,
    background_color1: #feae4d,
    border_color1: #feae4d,
  ),
);

3.在 _handle.scss文件里面首先引入_themes.scss文件,在遍历主题并根据key,声明一个获取颜色的function,接着使用@mixin和@include获取字体颜色。如下:

/**
*   在_themes.scss里面定义好自己需要的东西在该文件夹下面进行遍历和定义
**/
@import "./_themes.scss";

//遍历主题map
@mixin themeify {
  @each $theme-name, $theme-map in $themes {
    //!global 把局部变量强升为全局变量
    $theme-map: $theme-map !global;
    //判断html的data-theme的属性值  #{}是sass的插值表达式
    //& sass嵌套里的父容器标识   @content是混合器插槽,像vue的slot
    [data-theme="#{$theme-name}"] & {
      @content;
    }
  }
}

//声明一个根据Key获取颜色的function
@function themed($key) {
  @return map-get($theme-map, $key);
}

//获取background-color背景颜色
@mixin background_color($color) {
  @include themeify {
    background-color: themed($color)!important;
  }
}

//获取字体颜色
@mixin font_color($color) {
  @include themeify {
    color: themed($color)!important;
  }
}

//获取边框颜色
@mixin border_color($color) {
  @include themeify {
    border-color: themed($color)!important;
  }
}

//获取左边框颜色
@mixin border_colorLeft($color) {
  @include themeify {
    border-left-color: themed($color)!important;
  }
}

4.因为需要更换颜色的.vue文件比较多,需要在全局中引入对应的_handle.scss文件。(引入方式请参考对应的链接内容:
https://www.jianshu.com/p/6db9d1872e9e


5.定义一个.vue文件,在里面进行对应一键换肤的功能操作。如下:



<script>
export default {
  methods: {
    // 点击对应的颜色块进行意见换肤
    theme(type){
      // 将对应的数据存储到sessionStorage,方便后续使用
      sessionStorage.setItem('type',type)
      // 全局添加样式名称:data-theme,并在sessionStorage获取对应的样式名称的值。
      window.document.documentElement.setAttribute( "data-theme", sessionStorage.getItem('type'));
    }
  },
}
</script>


6.在需要换颜色的地方添加对应的样式。如下:

//  字体颜色
@include font_color("font_color1");
//  边框颜色
@include border_color("border_color1");
//  背景颜色
@include background_color("background_color1");

7.但还存在一个问题,就是刷新页面的时候对应一键换肤之后的颜色会丢失,所以需要在App.vue中进行一些操作。如下:

<script>
export default {
  name: 'App',
  created(){
    //  获取sessionStorage中存进去的type
    console.log(sessionStorage.getItem('type'))
    /**  
    *  判断 sessionStorage 中的 type 是否为空,如果为空的话,就给默认的颜色(页面初始化的颜色),如
    *  果不为空的话就将对应获取到的值给到 data-theme
    **/
    if(sessionStorage.getItem('type') != null){
      window.document.documentElement.setAttribute( "data-theme", sessionStorage.getItem('type'));
    }else{
      window.document.documentElement.setAttribute( "data-theme", 'red');
    }
  },
}
</script>

8.还有最重要的几点:

  • 如果一键换肤之后,只有在本机对应的当前浏览器页面上有用,如果换个浏览器进行登录或者在其他电脑上进行登录,那么一键换肤后的效果并不会体现在页面上,页面默认展示的样式是最开始的。
  • 如果需要一键换肤之后在不同的电脑或浏览器上体现一键换肤之后的效果需要与后端配合,至于怎么配合相信大家应该都知道,我就不多说了。
    9.最后贴一下一键换肤的效果图。如下:
    111.gif


作者:席小丽
链接:
https://www.jianshu.com/p/1faf4977b825

来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐

06Ni9DR容器板,06Ni9DR钢板切割,06Ni9DR钢板规格尺寸

06Ni9DR容器板,06Ni9DR钢板切割,06Ni9DR钢板规格尺寸06Ni9DR是低温容器钢板,含有9%Ni的钢板,06Ni9DR因为钢板Ni含量在百分之0.9左右又被叫作9镍钢或9Ni钢,06...

TOS5系统命令行部署Docker版网心云

  Docker版网心云也就官主叫做容器魔方,由网心云推出的一款docker容器镜像软件,目前支持:铁威马TOS、koolshare、群晖、树莓派等支持docker的设备(arm32、aarch64、...

诞生比航母还早,能造的国家屈指可数

蒸汽弹射器是航空母舰上的飞机起飞装置,用于舰载机蒸汽弹射起飞,使用一个平的甲板作为飞机跑道。起飞时一个蒸汽驱动的弹射装置带动飞机在两秒钟内达到起飞速度。蒸气弹射器是一个非常复杂的系统工程,是由起飞系统...

S550QL high strength steel plate、S550QL相当于国内什么材质

S550QLhighstrengthsteelplate、S550QL相当于国内什么材质S550QLhighstrengthsteelplate调质高屈服强度结构钢。S550QL相当于...

特别关注|中垂变形对VLCC油轮载货量的影响

VLCC油轮营运过程中,在船抵达装运港之前,船长需要计算和申报本航次的最大装货量,影响货物最大装货量的各相关因素主要有:●该轮在装货港所允许的最大吃水;●货舱舱容和油品密度;●VLCC航线通常...

南海车改装音响奥迪S5升级弗莱德FP-6A功放—永日汽车音响

奥迪S5的原车音响效果也比较普通的,其实跟其他日产国产车好不了多少,整体表现含糊不清;所以很难满足今天来的奥迪车主聆听需求,为了享受到更好的音乐,为爱车进行音响升级。奥迪S5音响升级配置:前声场:弗莱...

奥迪S5轿跑:354马力+3.0T奥迪进口车,落地近70万,选它还是A7?

前几天我们介绍了奥迪S5,今天我们拿到的是奥迪的S5,可谓是A5的性能版本,往上还有RS5,S5落地近70万,和4缸的奥迪A7同一价位,相当于2台进口A5低配的价格,而这个价位,可供选择的余地太多了...

S5定时器与IEC定时器差异巨大,资料分散难入门,你真的懂了吗?

你有没有想过,小小的定时器,在工业自动化里竟然扮演着如此重要的角色?它就像一位精准的指挥家,掌控着生产线的节奏。今天,我们就来聊聊PLC编程里两种常见的定时器:S5定时器和IEC定时器。它们看起来差不...

LOL英雄联盟S5新赛季季前赛野区入门手册

本文摘要:随着S5季前赛的到来,LOL各个方面都做了不小的改动,而其中改动最明显的莫过于野区,现在从各方面来带大家认识一下改版后的野区。首先是野怪的伤害有了非常大的提升并且惩戒的CD时间被提高到了一分...

六个重点 搞懂全新Audi A5 Coupe改在哪

由于Audi正式进入新一世代后的车款各个都有著令人印象深刻的亮眼表现,品牌旗下的双门轿跑车系A5Coupe的改款同样让人期待不已,也就在2016年6月3日,全新一代AudiA5以及S5终于正式的与...

入门级视频拍摄设备该如何选?(拍视频设备推荐性价比)

如今的年轻人都很热衷于视频制作,B站各种领域的up主层出不穷,而短视频领域,大家也开始倾向于使用专业的设备去拍摄。对于很多想要开启自己视频拍摄生涯的小伙伴来说,如何选择一台入门级的视频拍摄设备很关键,...

pb管规格及用途这么多,你知道多少?

导语:谈到PB管,估计大家都只知其一不知其二,pb管在生活中到底扮演着什么样的角色呢?它给我们的生活带来了那些便利呢?下面让小编带领大家来一块了解pb管的奥秘!pb管的材料是聚丁烯(PB)树脂,开始工...

Bcup S5今日开赛,Life又复出了(b05赛制)

由知名电竞解说BBC(直播间抖音搜索:BBC张宏圣)主办的Bcup魔兽争霸赛S5将于2024年1月3日20点正式开战。目前,S5分组已经全部出炉,下面让我们一起看下。S5最大的亮点莫过于前职业选手Li...

无主之地2:仍然可用的SHiFT代码(2023年1月15日)

兑换方式需要首先注册SHiFT账号,可以在SHiFT网站注册,也可以在游戏中注册。SHiFT网址:https://shift.gearboxsoftware.com游戏中注册:主菜单>...

三年LOL资深玩家,教你在S5玩转VN

做为一个资深的LOL玩家,我已经玩了有几年了,从12年那会就已经开始玩了。在LOL当中我最喜欢的adc就是薇恩没有之一。每次玩LOL,最后一盘必定是薇恩。在这说说个人玩VN的经验跟大家一起分享下,不认...