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实现的在当前窗口中漂浮框的代码
Mar 15 Javascript
jQuery.validate 常用方法及需要注意的问题
Mar 20 Javascript
js中的屏蔽的使用示例
Jul 30 Javascript
JS实现图片横向滚动效果示例代码
Sep 04 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
Jan 09 Javascript
js实现网页多级级联菜单代码
Aug 20 Javascript
xtemplate node.js 的使用方法实例解析
Aug 22 Javascript
Three.js的使用及绘制基础3D图形详解
Apr 27 Javascript
jQuery插件Validation表单验证详解
May 26 jQuery
vue.js的简单自动求和计算实例
Nov 08 Javascript
微信小程序wx.navigateTo方法里的events参数使用详情及场景
Jan 07 Javascript
JS实现图片幻灯片效果代码实例
May 21 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下删除字符串中HTML标签的函数
2008/08/27 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
php+jQuery递归调用POST循环请求示例
2016/10/14 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
Vue项目中引入外部文件的方法(css、js、less)
2017/07/24 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
Python脚本实现自动发带图的微博
2016/04/27 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
用python写PDF转换器的实现
2020/10/29 Python
医大实习自我鉴定
2013/12/07 职场文书
信息管理应届生求职信
2014/03/07 职场文书
《卖木雕的少年》教学反思
2014/04/11 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
护士个人总结范文
2015/02/13 职场文书
社区活动总结范文
2015/05/07 职场文书
贷款收入证明格式
2015/06/24 职场文书
医学会议开幕词
2016/03/03 职场文书
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python
Python序列化与反序列化相关知识总结
2021/06/08 Python
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技