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 相关文章推荐
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
Sep 20 Javascript
js 实现css风格选择器(压缩后2KB)
Jan 12 Javascript
浅析Node在构建超媒体API中的作用
Jul 30 Javascript
详谈JavaScript内存泄漏
Nov 14 Javascript
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 Javascript
jQuery使用$.each遍历json数组的简单实现方法
Apr 18 Javascript
js实现textarea限制输入字数
Feb 13 Javascript
JS判断两个对象内容是否相等的方法示例
Apr 10 Javascript
weex里Vuex state使用storage持久化详解
Sep 09 Javascript
JS返回顶部实例代码
Aug 09 Javascript
javascript实现fetch请求返回的统一拦截
Dec 22 Javascript
原生JavaScript写出Tabs标签页的实例代码
Jul 20 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 超链接 抓取实现代码
2009/06/29 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
php给图片加文字水印
2015/07/31 PHP
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
javascript闭包的理解和实例
2010/08/12 Javascript
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
select标签设置默认选中的选项方法
2018/03/02 Javascript
vue.js项目nginx部署教程
2018/04/05 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
Python中IPYTHON入门实例
2015/05/11 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
python实现简单遗传算法
2018/03/19 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
Python绘制组合图的示例
2020/09/18 Python
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
大学自主招生自荐信范文
2014/02/26 职场文书
施工员岗位职责
2014/03/16 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
二手房买卖协议书
2014/04/10 职场文书
2015年党员承诺书
2015/01/21 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
Spring boot实现上传文件到本地服务器
2022/08/14 Java/Android