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 相关文章推荐
分享27款非常棒的jQuery 表单插件
Mar 28 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
Mar 26 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
Nov 02 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
Jan 07 Javascript
微信小程序实现自上而下字幕滚动
Jul 14 Javascript
Three.js实现3D机房效果
Dec 30 Javascript
Vue项目服务器部署之子目录部署方法
May 12 Javascript
微信小程序webview 脚手架使用详解
Jul 22 Javascript
react实现移动端下拉菜单的示例代码
Jan 16 Javascript
js生成1到100的随机数最简单的实现方法
Feb 07 Javascript
详解如何使用React Hooks请求数据并渲染
Oct 18 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下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
js 覆盖和重载 函数
2009/09/25 Javascript
jQuery LigerUI 使用教程入门篇
2012/01/18 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
Seajs源码详解分析
2019/04/02 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
Python中的CURL PycURL使用例子
2014/06/01 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
Python中Yield的基本用法
2020/10/18 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
通信工程毕业生自荐信
2013/11/01 职场文书
高校教师思想汇报
2014/01/11 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
分析并发编程之LongAdder原理
2021/06/29 Java/Android
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers