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获取height和width的方法说明
Jan 06 Javascript
js控制滚动条缓慢滚动到顶部实现代码
Mar 20 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
Apr 10 Javascript
JavaScript中使用Object.create()创建对象介绍
Dec 30 Javascript
javascript 数组操作详解
Jan 29 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
Sep 07 Javascript
Svg.js实例教程及使用手册详解(一)
May 16 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
Oct 18 Javascript
Angularjs修改密码的实例代码
May 26 Javascript
Ionic2开发环境搭建教程
Aug 20 Javascript
vue中如何使用ztree
Feb 06 Javascript
JavaScript从原型到原型链深入理解
Jun 03 Javascript
浅析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
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
Yii实现显示静态页的方法
2016/04/25 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
js使用栈来实现10进制转8进制与取除数及余数
2014/06/11 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
2017/04/13 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
js判断密码强度的方法
2020/03/18 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
Python实现全角半角转换的方法
2014/08/18 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
python多维数组切片方法
2018/04/13 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
python3.7添加dlib模块的方法
2020/07/01 Python
Python使用xpath实现图片爬取
2020/09/16 Python
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
教师求职简历自我评价
2015/03/10 职场文书
荒岛余生观后感
2015/06/09 职场文书
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers
浅析MySQL如何实现事务隔离
2021/06/26 MySQL