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代码
Jul 01 Javascript
jQuery 常见操作实现方式和常用函数方法总结
May 06 Javascript
JavaScript中的eval()函数详解
Aug 22 Javascript
JS截取字符串常用方法整理及使用示例
Oct 18 Javascript
JS父页面与子页面相互传值方法
Mar 05 Javascript
Angularjs 实现移动端在线测评效果(推荐)
Apr 05 Javascript
用js实现before和after伪类的样式修改的示例代码
Sep 07 Javascript
JS实现的简单折叠展开动画效果示例
Apr 28 Javascript
用Angular实现一个扫雷的游戏示例
May 15 Javascript
vue 图片裁剪上传组件的实现
Nov 12 Javascript
TS 类型收窄教程示例详解
Sep 23 Javascript
javascript中Set、Map、WeakSet、WeakMap区别
Dec 24 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
星际实力自我测试
2020/03/04 星际争霸
php获取post中的json数据的实现方法
2011/06/08 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
php集成环境xampp中apache无法启动问题解决方案
2014/11/18 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
BootStrapValidator校验方式
2016/12/19 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
python字符串的方法与操作大全
2018/01/30 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
酒店管理专业学生求职信
2013/09/27 职场文书
应届生服务员求职信
2013/10/31 职场文书
学风建设演讲稿
2014/09/12 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
大学军训口号大全
2015/12/24 职场文书
python实现简单聊天功能
2021/07/07 Python