使用vue + less 实现简单换肤功能的示例


Posted in Javascript onFebruary 21, 2018

做的换肤效果比较简单,只是顶部导航背景色的改变。下面是效果图。

使用vue + less 实现简单换肤功能的示例 

首先,先说一下我最初的思路。

我最初的想法是使用less定义变量,然后通过js来切换变量,通过切换的变量来达到换肤的效果。

我先新建了一个 theme.less文件,代码如下:

@theme:@themea;
 @themea:pink;
 @themeb:blue;
 @themec:gray;

如我最开始的想法,应该是通过点击事件来改变变量 @theme 的值。

我用了element-ui这个框架,所以我的下拉菜单的代码也不复杂:

<el-dropdown class="colorBtn " trigger="click" @command="changeColor">
 <span class="el-dropdown-link " >换肤</span>
 <el-dropdown-menu slot="dropdown">
 <el-dropdown-item command="a" @click="change_type(a)">梦幻粉</el-dropdown-item>
 <el-dropdown-item command="b" @click="change_type(b)">天空蓝</el-dropdown-item>
 <el-dropdown-item command="c" @click="change_type(c)">雾霾灰</el-dropdown-item>
 </el-dropdown-menu>
</el-dropdown>

点击事件的回调事件绑定在command事件,我定义了一个changeColor的方法

changeColor(command){
  console.log(command);//能获取到当前点击的元素的command
 }

于是,问题来了,我怎么通过点击事件来改变@theme的值呢?我陷入了沉(搜)思(索)……

终于找到了一个迂回解决问题的方法,其实一开始的想法也没有问题,但是需要再包装一层。怎么包装呢?我们虽然暂时控制不了变量值,但是我们可以控制元素的类名。

我们可以将换肤的部分抽出来用less函数来表示,将theme.less代码改成下面代码

其中 @backcolor是背景色,@fcolor是字体颜色

.theme(@backcolor:#EEA2AD,@fcolor:#fff) {
 .header {
 color: @fcolor;
 background: @backcolor;
 width: 100%;
 height: 2rem;
 position: relative;

 h4 {
  width: 100%;
  text-align: center;
  line-height: 2rem;
  font-size: 1rem;
 }
 .go-back {
  width: 2rem;
  height: 2rem;
  text-align: center;
  color: #fff;
  font-size: 0.8rem;
  float: left;
  line-height: 2rem;
  margin-left: 1rem;
  position: absolute;
  left: 0;
  top: 0;
 }
 .header-cont {
  width: 100%;
  text-align: center;
  line-height: 2rem;
  font-size: 1rem;
  color: #fff;
 }
 .colorBtn {
  width: 2rem;
  height: 2rem;
  text-align: center;
  color: #fff;
  font-size: 0.8rem;
  line-height: 2rem;
  margin-right: 1rem;
  position: absolute;
  top: 0;
  right: 0;
 }
 }
}

新建一个color.less,设置几种不同的皮肤样式。这里不同的皮肤样式,我用themea,themeb,themec….来表示,对应组件中的command值。当我点击粉色的时候,调用相应的函数给元素添加相对应的类名。不要忘记引用 theme.less

@import url('./theme.less');
  .themea{
   .theme();//默认的样式
  }
  .themeb{
   .theme(blue,#fff);
  }
  .themec{
   .theme(#111,#999);
  }

当点击换肤的下拉菜单时,调用的changeColor方法需要给元素添加不同的类名,当然color.less文件记得引用。

changeColor(command){
  console.log(command);
  document.getElementById('app').className ='theme'+command ;
 }

在这一块的时候,刚开始我也遇到一个问题,就是我刚开始只将这个页面的样式单独抽了出来,所以其他组件的头部样式并没有改变。我的第一个想法竟然是使用cookie,额,后来想着既然是单页面,那我将样式绑定在比较顶层的元素上,是不是可以?

结果,显而易见!!!

如果要记住上一次换的皮肤,我使用的是localStorage,将每次点击换肤的主题记录下来,然后再页面渲染之前判断是否有这个主题就可以了。效果如下

使用vue + less 实现简单换肤功能的示例 

以上这篇使用vue + less 实现简单换肤功能的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js有序数组的连接问题
Oct 01 Javascript
javascript匿名函数实例分析
Nov 18 Javascript
Javascript基础教程之数组 array
Jan 18 Javascript
Javascript实现的Map集合工具类完整实例
Jul 31 Javascript
freemarker判断对象是否为空的方法
Aug 13 Javascript
基于Jquery和html5的7款个性化地图插件
Nov 17 Javascript
详解Javascript中prototype属性(推荐)
Sep 03 Javascript
JavaScript正则表达式实例详解
Oct 16 Javascript
如何理解Vue的render函数的具体用法
Aug 30 Javascript
vue 移动端适配方案详解
Nov 15 Javascript
JS大坑之19位数的Number型精度丢失问题详解
Apr 22 Javascript
用js实现放大镜效果
Oct 28 Javascript
利用angular、react和vue实现相同的面试题组件
Feb 19 #Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
Feb 18 #jQuery
Angular实现的进度条功能示例
Feb 18 #Javascript
Angular2.0实现modal对话框的方法示例
Feb 18 #Javascript
JS实现运动缓冲效果的封装函数示例
Feb 18 #Javascript
Vue底层实现原理总结
Feb 17 #Javascript
js实现控制文件拖拽并获取拖拽内容功能
Feb 17 #Javascript
You might like
PHP的开发框架的现状和展望
2007/03/16 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
Three.JS实现三维场景
2018/12/30 Javascript
js的对象与函数详解
2019/01/21 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
python列表与元组详解实例
2013/11/01 Python
wxpython实现图书管理系统
2018/03/12 Python
python之pandas用法大全
2018/03/13 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
用python绘制樱花树
2020/10/09 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
澳大利亚工具仓库:Tools Warehouse
2018/10/15 全球购物
企业安全生产承诺书
2014/05/22 职场文书
美术学专业求职信
2014/07/23 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
《观察物体》教学反思
2016/02/17 职场文书
JS封装cavans多种滤镜组件
2022/02/15 Javascript