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 相关文章推荐
JavaScript下申明对象的几种方法小结
Oct 02 Javascript
javascript attachEvent绑定多个事件执行顺序问题
Oct 20 Javascript
javascript验证只能输入数字和一个小数点示例
Oct 21 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
Jun 02 Javascript
jQuery实现统计输入文字个数的方法
Mar 11 Javascript
3个可以改善用户体验的AngularJS指令介绍
Jun 18 Javascript
JavaScript常用字符串与数组扩展函数小结
Apr 24 Javascript
JQuery实现DIV其他动画效果的简单实例
Sep 18 Javascript
VueJS如何引入css或者less文件的一些坑
Apr 25 Javascript
详解vue 模版组件的三种用法
Jul 21 Javascript
一篇文章,教你学会Vue CLI 插件开发
Apr 17 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
Jun 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
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
php获取指定数量随机字符串的方法
2017/02/06 PHP
IE8 中使用加速器(Activities)
2010/05/14 Javascript
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
python 计算概率密度、累计分布、逆函数的例子
2020/02/25 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
Eclipse面试题
2014/03/22 面试题
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
若干个Java基础面试题
2015/05/19 面试题
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
机关党员公开承诺书
2014/08/30 职场文书
法定代表人身份证明书
2014/09/10 职场文书
工伤私了协议书范本
2014/11/24 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
2015年国庆节寄语
2015/08/17 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js