Vue + Scss 动态切换主题颜色实现换肤的示例代码


Posted in Javascript onApril 27, 2020

根据预设的配色方案,在前端实现动态切换系统主题颜色。

大概的思路就是给html根标签设置一个data-theme属性,然后通过js切换data-theme的属性值,Scss根据此属性来判断使用对应主题变量。这里可以选择持久化Vux或接口来保存用户选择的主题。

一、首先需要给项目下载配置Scss

1.安装依赖

npm install node-sass sass-loader --save-dev

2.找到build中webpack.base.conf.js,在rules中添加scss规则

{
test: /\.scss$/,
loaders: ['style', 'css', 'sass'v]
}

3.在vue文件中使用

<style lang='scss' scoped>
</style>

二、在vue项目全局中引入scss

1.安装 sass-resources-loader

npm install sass-resources-loader --save-dev

2.然后修改build中的utils.js

scss: generateLoaders('sass')

修改为:

scss: generateLoaders('sass').concat(
{
loader: 'sass-resources-loader',
options: {
//你自己的scss全局文件的路径
resources: path.resolve(__dirname, '../src/style/_common.scss')
}
}
)

三、准备工作已经做完准备开干

1.新建一个Scss文件_themes.scss,里面可以配置不同的主题配色方案

//当HTML的data-theme为dark时,样式引用dark
//data-theme为其他值时,就采用组件库的默认样式
//这里我只定义了两套主题方案,想要再多只需在`$themes`里加就行了
//注意一点是,每套配色方案里的key可以自定义但必须一致,不然就会混乱

$themes: (

light: (
//字体
font_color1: #414141,
font_color2: white,

//背景
background_color1: #fff,
background_color2: #f0f2f5,
background_color3: red,
background_color4: #2674e7,

//边框
border_color1: #3d414a,

),

dark: (
//字体
font_color1: #a7a7a7,
font_color2: white,

//背景
background_color1: #1b2531,
background_color2: #283142,
background_color3: #1e6ceb,
background_color4: #323e4e,

//边框
border_color1: #3d414a,

)
);

这里定义了一个map--$themes,分别存放对应主题的颜色变量集合。

注意,scss文件名建议用下划线开头,如_themes.scss,防止执行时被编译成单独的css文件。

2.定义另外一个sass文件_handle.scss来操作1中的$theme变量(当然两个文件可以合并,分开写是想把配置和操作解耦),上代码:

@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);
}

//获取背景颜色
@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;
}
}

themeify方法用于获取HTML的data-theme值。

themed方法用于根据HTML的data-theme值及调用者传过来的key去_themes.scss里获取相应的颜色。
上面可以根据自己的使用场景自定义混入器,上面只定义了三个常用的背景&边框&字体的颜色。

3.具体在vue中使用,直接引入对应混入器就好,取哪个颜色,传哪个key,就这么简单

<style lang="scss" scoped>
 @import "@/style/_handle.scss";

 .common-util {
  font-size: 18px;
  @include font_color("font_color1");
  @include background_color("background_color1");
  @include border_color("border_color1");
 }
</style>

3.使用js动态切换HTML的属性data-theme的值

html

<DropdownMenu slot="list">
 <DropdownItem @click.native="theme('iview')">默认</DropdownItem>
 <DropdownItem @click.native="theme('light')">浅色</DropdownItem>
 <DropdownItem @click.native="theme('dark')">深色</DropdownItem>
</DropdownMenu>

js

//换主题
theme(type) {
this.$store.commit('upDate', {themeType: type});
window.document.documentElement.setAttribute( "data-theme", type );
}
切换后会发现你的css选择器前面多了一些东西[data-theme="dark"]
[data-theme="dark"] .ivu-layout-sider,
[data-theme="dark"] .ivu-menu-light,
[data-theme="dark"] .ivu-layout-header {
background-color: #283142!important;
}

到此这篇关于Vue + Scss 动态切换主题颜色实现换肤的示例代码的文章就介绍到这了,更多相关Vue Scss 换肤内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JS遮罩层效果 兼容ie firefox jQuery遮罩层
Jul 26 Javascript
使用ExtJS技术实现的拖动树结点
Aug 05 Javascript
js读取cookie方法总结
Oct 31 Javascript
JS中如何比较两个Json对象是否相等实例代码
Jul 13 Javascript
jquery对Json的各种遍历方法总结(必看篇)
Sep 29 Javascript
Bootstrap CSS组件之大屏幕展播
Dec 17 Javascript
VUE开发一个图片轮播的组件示例代码
Mar 06 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
May 02 Javascript
微信小程序分享海报生成的实现方法
Dec 10 Javascript
JS中的函数与对象的创建方式
May 12 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
Aug 14 Javascript
jQuery treeview树形结构应用
Mar 24 jQuery
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
Apr 27 #Javascript
react组件基本用法示例小结
Apr 27 #Javascript
react基本安装与测试示例
Apr 27 #Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
Apr 27 #Javascript
JS浏览器BOM常见操作实例详解
Apr 27 #Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
Apr 27 #Javascript
js HTML DOM EventListener功能与用法实例分析
Apr 27 #Javascript
You might like
PHP5 安装方法
2007/01/15 PHP
PHP实现生成唯一会员卡号
2015/08/24 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
javascript里的条件判断
2007/02/27 Javascript
javascript 面向对象继承
2009/11/26 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
基于react组件之间的参数传递(详解)
2017/09/05 Javascript
js判断节假日实例代码
2017/12/27 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
Vue 组件注册实例详解
2019/02/23 Javascript
[42:32]Secret vs Optic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
详解python中字典的循环遍历的两种方式
2017/02/07 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
潘多拉珠宝英国官方网上商店:PANDORA英国
2018/06/12 全球购物
泰国时尚电商:POMELO Fashion
2020/03/11 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
学生检讨书如何写
2014/10/30 职场文书
大学生个人学习总结
2015/02/15 职场文书
工作态度不好检讨书
2015/05/06 职场文书
上课迟到检讨书
2015/05/06 职场文书
党员转正介绍人意见
2015/06/03 职场文书
宣传委员竞选稿
2015/11/19 职场文书