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 相关文章推荐
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
Jul 24 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
Oct 17 Javascript
禁止页面刷新让F5快捷键及右键都无效
Jan 22 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
jQuery使用height()获取高度需要注意的地方
Dec 13 Javascript
js网页滚动条滚动事件实例分析
May 05 Javascript
JavaScript性能优化总结之加载与执行
Aug 11 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
Dec 26 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
Jan 24 Javascript
js中的触发事件对象event.srcElement与event.target详解
Mar 15 Javascript
基于JavaScript实现百度搜索框效果
Jun 28 Javascript
JS+canvas画一个圆锥实例代码
Dec 13 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
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
PHP动态创建Web站点的方法
2011/08/14 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
php生成二维码
2015/08/10 PHP
yii2 页面底部加载css和js的技巧
2016/04/21 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
jQuery+Ajax实现限制查询间隔的方法
2016/06/07 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
进一步探究Python的装饰器的运用
2015/05/05 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
Python全排列操作实例分析
2018/07/24 Python
Django认证系统实现的web页面实现代码
2019/08/12 Python
通过实例解析Python return运行原理
2020/03/04 Python
关于Python解包知识点总结
2020/05/05 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
甲方资料员岗位职责
2013/12/13 职场文书
暑期实践思想汇报
2014/01/06 职场文书
超市活动计划书
2014/04/24 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
小学生纪念九一八事变演讲稿
2014/09/14 职场文书
服务员态度差检讨书
2014/10/28 职场文书
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android