使用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 相关文章推荐
在JavaScript中操作数组之map()方法的使用
Jun 09 Javascript
jQuery对象与DOM对象转换方法详解
May 10 Javascript
JavaScript对Json的增删改属性详解
Jun 02 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
Jul 24 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
Apr 13 Javascript
jquery Ajax实现Select动态添加数据
Jun 08 jQuery
微信小程序 input输入及动态设置按钮的实现
Oct 27 Javascript
vue2.0.js的多级联动选择器实现方法
Feb 09 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
Dec 11 Javascript
微信小程序按钮点击动画效果的实现
Sep 04 Javascript
layui表格设计以及数据初始化详解
Oct 26 Javascript
js实现简单的打印表格
Jan 15 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中使用Oracle数据库(4)
2006/10/09 PHP
PHP 批量删除 sql语句
2009/06/05 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
javascript使用eval或者new Function进行语法检查
2010/10/16 Javascript
来自国外的页面JavaScript文件优化
2010/12/08 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
bootstrap-Treeview实现级联勾选
2017/11/23 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
Python实现的弹球小游戏示例
2017/08/01 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
python eventlet绿化和patch原理
2020/11/21 Python
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
什么是索引指示器
2012/08/20 面试题
天猫活动策划方案
2014/08/21 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
工作保证书
2015/01/17 职场文书
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP
一文解答什么是MySQL的回表
2022/08/05 MySQL