使用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 全选与全取消功能的实现代码
Dec 23 Javascript
js对象与打印对象分析比较
Apr 23 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
Jun 23 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
Jan 23 Javascript
JavaScript 中 avalon绑定属性总结
Oct 19 Javascript
原生JS简单实现ajax的方法示例
Nov 29 Javascript
jQuery Ajax请求后台数据并在前台接收
Dec 10 Javascript
vue axios 表单提交上传图片的实例
Mar 16 Javascript
ES6与CommonJS中的模块处理的区别
Jun 13 Javascript
微信小程序时间选择插件使用详解
Dec 28 Javascript
详解async/await 异步应用的常用场景
May 13 Javascript
OpenLayers3实现测量功能
Sep 25 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
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
js闭包学习心得总结
2018/04/17 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
2020/05/12 Javascript
谈谈node.js中的模块系统
2020/09/01 Javascript
python实现电子词典
2020/04/23 Python
django框架自定义用户表操作示例
2018/08/07 Python
python 处理string到hex脚本的方法
2018/10/26 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
医学类个人求职信范文
2014/02/05 职场文书
关于安全的演讲稿
2014/05/09 职场文书
环保建议书200字
2014/05/14 职场文书
小学捐书活动总结
2014/07/05 职场文书
国企干部对照检查材料
2014/08/22 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
干部年终考核评语
2015/01/04 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server
Hive常用日期格式转换语法
2022/06/25 数据库