Vue中使用sass实现换肤功能


Posted in Javascript onSeptember 07, 2018

先给大家展示下效果图:

 Vue中使用sass实现换肤功能

先给大家看一下目录和主要文件:

Vue中使用sass实现换肤功能

解释一下主要文件:

base.scss: 一些通用样式文件。

mixin.scss: 定义mixin方法的文件。

varibale.scss: 颜色,字体,背景的配置文件

以下就拿封装的head组件代码来展示以下实现逻辑,现在大家主要是来理解,不要着急复制代码,在文章最后会贴出三个主要文件的代码的。

Vue中使用sass实现换肤功能

为什么会在 background:$background-color-theme; 地方标注错误?

如果之前用过sass的同学可能会知道,这样虽然实现了css样式变量化,但是后期没有办法作出灵活更改的。

所以需要把设置背景颜色封装成一个mixin方法(包括字体大小,字体颜色,都需要进行封装)

请看mixin.scss中的代码:

Vue中使用sass实现换肤功能

主要原理:

通过设置html的attribute属性在封装的函数中进行判断,进行相应的设置不同的颜色

css中 [ ] 可以识别到在html标签上设置的属性,所以在html上对应属性发生变化时,就会执行相应的样式,

这一步有点类似于平时给div添加一个.active属性,css自动执行相应样式。

更换主题时的具体操作:

Vue中使用sass实现换肤功能

下边是主要文件完整的代码

base.scss示例代码:

@charset "utf-8";
$font_default_color:$font-color-shallow3;
$font_default_size:$font_medium_s;
*{
 margin:0;padding:0;box-sizing:border-box;color:$font_default_color;
 /*@include font-dpr($font_default_size);*/
}
a{text-decoration:none;color:$font_default_color;}
.sub-page { //routerView
 position: fixed;top: 0;bottom: 0;width: 100%;background:#fff;right: 0;left: 0;z-index: 5;
}
#content{width:100%;position:absolute;@include px2rem(top,88px);bottom:0;overflow-x:auto;}
.width{
 width:100%;
}
/*竖向居中*/
.table-cell{
 display:table-cell;vertical-align:middle;text-align:center;
}
.middle{
 vertical-align:middle;
}
/*弹性盒*/
.flex{
 display: inline-flex;display: -webkit-flex;display: flex;
}
/*弹性盒-子元素可竖向居中*/
.flex-middle{
 display :flex; display:-webkit-flex; align-items:center; -webkit-align-items:center; justify-content:center ;
}
.tl{
 text-align:left;
}
.tc{
 text-align:center;
}
.tr{
 text-align:right;
}
.fl{
 float:left;
}
.fr{
 float:right;
}
.clear::after{
 /*原理: overflow!=visible ;display!=block;float!=none;position!=static||relative 都可为元素创建BFC;消除边距重叠或者浮动产生的影响*/
 content:'';overflow:hidden;clear:both;
}

mixin.scss示例代码:

@charset "utf-8";
@import "./variable";/*引入配置*/
@mixin font_size($size){/*通过该函数设置字体大小,后期方便统一管理;*/
 @include font-dpr($size);
}
@mixin font_color($color){/*通过该函数设置字体颜色,后期方便统一管理;*/
 color:$color;
 [data-theme="theme1"] & {
 color:$font-color-theme1;
 }
 [data-theme="theme2"] & {
 color:$font-color-theme2;
 }
 [data-theme="theme3"] & {
 color:$font-color-theme3;
 }
}
@mixin bg_color($color){/*通过该函数设置主题颜色,后期方便统一管理;*/
 background-color:$color;
 [data-theme="theme1"] & {
 background-color:$background-color-theme1;
 }
 [data-theme="theme2"] & {
 background-color:$background-color-theme2;
 }
 [data-theme="theme3"] & {
 background-color:$background-color-theme3;
 }
}
/*px转rem*/
@mixin px2rem($property,$px,$px2:false,$px3:false,$px4:false){
 $rem:75px;/* 设计稿尺寸/10 */
 @if $px and $px2 and $px3 and $px4 {
 #{$property}: ($px / $rem) + rem ($px2 / $rem) + rem ($px3 / $rem) + rem ($px4 / $rem) + rem;
 }
 @else if $px and $px2 {
 #{$property}: ($px / $rem) + rem ($px2 / $rem) + rem;
 //[data-model='pad'] & {#{$property}: ($px * 1.4 / $rem) + rem ($px2 * 1.4 / $rem) + rem;}
 }
 @else{
 #{$property}: ($px / $rem) + rem!important;
 //[data-model='pad'] & {#{$property}: ($px * 1.4 / $rem) + rem;}
 }
}
/*根据dpr计算font-size*/
@mixin font-dpr($font-size){
 font-size: $font-size;
 //[data-model="pad"] & { font-size: $font-size * 1.4; }
 [data-dpr="2"] & { font-size: $font-size * 2;}
 [data-dpr="3"] & { font-size: $font-size * 3;}
}
/*弹性盒属性*/
%flexbox{
 display: inline-flex;display: -webkit-flex;display: flex;
}
/*弹性盒比例*/
@mixin flex($num:1){
 -webkit-box-flex:$num;-moz-box-flex:$num;-webkit-flex:$num;-ms-flex:$num;flex:$num;
}
/*超行溢出显示省略号*/
@mixin overflow($num:1,$fontSize:0,$lineHeight:1.5){
 display: -webkit-box;-webkit-line-clamp:$num; overflow: hidden;
 /*! autoprefixer: off */
 -webkit-box-orient: vertical;
 /* autoprefixer: on */
 @if $fontSize!=0 and $lineHeight{/*高度需要撑开*/
 line-height:$lineHeight;
 @if $lineHeight < 1.2 {
  line-height:1.2; /*最小需要1.2,否则在部分安卓机下第$num+1行会顶部漏出*/
 }
 height: $num * $fontSize * $lineHeight;
 [data-dpr="2"] & { height: $num * $fontSize * $lineHeight * 2!important;}
 [data-dpr="3"] & { height: $num * $fontSize * $lineHeight * 3!important;}
 }
}
//transition兼容写法
@mixin transition($content:all .2s){
 -moz-transition: $content;
 -webkit-transition: $content;
 -o-transition: $content;
 transition: $content;
}
//transfrom兼容
@mixin translateX($num:-50%){
 -ms-transform: translateX($num);
 -moz-transform: translateX($num);
 -webkit-transform: translateX($num);
 -o-transform: translateX($num);
 transform: translateX($num);
}
@mixin translateY($num:-50%){
 -ms-transform: translateY($num);
 -moz-transform: translateY($num);
 -webkit-transform: translateY($num);
 -o-transform: translateY($num);
 transform: translateY($num);
}
@mixin rotate($deg:90deg){
 -ms-transform:rotate($deg);
 -moz-transform:rotate($deg);
 -webkit-transform:rotate($deg);
 -o-transform:rotate($deg);
 transform:rotate($deg);
}

variable.scss示例代码:

//颜色定义规范
$background-color-theme: #3f8e4d;//背景主题颜色默认
$background-color-theme1: red;//背景主题颜色1
$background-color-theme2: #652BF5;//背景主题颜色2
$background-color-theme3: deepskyblue;//背景主题颜色3
$background-color-themesec: #edc148;//背景次要主题颜色
$font-color-theme : #3f8e4d;//字体主题颜色默认
$font-color-theme1 : red;//字体主题颜色1
$font-color-theme2 : #652BF5;//字体主题颜色2
$font-color-theme3 : deepskyblue;//字体主题颜色3
$font-color-themesec : #edc148;//字体次要主题颜色
$font-color-shallow0 : #000;
$font-color-shallow1 : #111;
$font-color-shallow2 : #222;
$font-color-shallow3 : #333;
$font-color-shallow4 : #444;
$font-color-shallow5 : #555;
$font-color-shallow6 : #666;
$font-color-shallow7 : #777;
$font-color-shallow8 : #888;
$font-color-shallow9 : #999;
$font-color-shallowdb : #dbdbdb;
//字体定义规范
$font_little_s:10px;
$font_little:12px;
$font_medium_s:14px;
$font_medium:16px;
$font_large_s:18px;
$font_large:20px;

mine.vue中更换主题时的操作代码

<template>
 <div id="bookcaselist">
 <v-head :title="title" :showBack="showBack"></v-head>
 <div id="content">
  <p @click="changeTheme('theme1')"></p>
  <p @click="changeTheme('theme2')"></p>
  <p @click="changeTheme('theme3')"></p>
 </div>
 <v-foot :activeIndex="3"></v-foot>
 </div>
</template>
<script>
export default {
 name: 'mine',
 data () {
 return {
  title: '我的',
  showBack: false
 }
 },
 methods: {
 changeTheme (theme) {
  window.document.documentElement.setAttribute('data-theme', theme)
 }
 },
 components: {
 }
}
</script>
<style scoped="" lang="scss">
 p{
 @include px2rem(width,100px);
 @include px2rem(height,100px);
 @include px2rem(margin,20px);
 float:left;
 }
 p:first-child{
 background-color:red;
 }
 p:nth-child(2){
 background-color:#652BF5;
 }
 p:last-child{
 background-color:deepskyblue;
 }
</style>

其实过程和逻辑都比较简单,大家理解一下,有不明白的地方在下方评论区评论,有错误的地方也欢迎大家指出,看到后我会回复

总结

以上所述是小编给大家介绍的Vue中使用sass实现换肤功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
基于jquery实现的鼠标拖拽元素复制并写入效果
Aug 23 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
Mar 01 Javascript
javascript获取隐藏dom的宽高 具体实现
Jul 14 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
Apr 16 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
Apr 12 Javascript
js判断日期时间有效性的方法
Oct 24 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
Mar 02 Javascript
微信小程序中换行空格(多个空格)写法详解
Jul 10 Javascript
angular4中引入echarts的方法示例
Jan 29 Javascript
HTML+JavaScript实现扫雷小游戏
Sep 30 Javascript
部署vue+Springboot前后端分离项目的步骤实现
May 31 Javascript
关于vue属性使用和不使用冒号的区别说明
Oct 22 Javascript
jQuery中each遍历的三种方法实例分析
Sep 07 #jQuery
Vue异步组件处理路由组件加载状态的解决方案
Sep 07 #Javascript
Vue2.0 v-for filter列表过滤功能的实现
Sep 07 #Javascript
koa socket即时通讯的示例代码
Sep 07 #Javascript
vue侧边栏动态生成下级菜单的方法
Sep 07 #Javascript
Vuejs开发环境搭建及热更新【推荐】
Sep 07 #Javascript
小程序点赞收藏功能的实现代码示例
Sep 07 #Javascript
You might like
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
SONY SRF-M100的电路分析
2021/03/02 无线电
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
编辑浪子版表单验证类
2007/05/12 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
pandas 将索引值相加的方法
2018/11/15 Python
python爬虫实现中英翻译词典
2019/06/25 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
python归并排序算法过程实例讲解
2020/11/04 Python
CK美国官网:Calvin Klein
2016/08/26 全球购物
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
外贸采购员求职的自我评价
2013/11/26 职场文书
社区包粽子活动方案
2014/01/21 职场文书
教师专业自荐书范文
2014/02/10 职场文书
消防战士优秀事迹材料
2014/02/13 职场文书
领导调研接待方案
2014/02/27 职场文书
工程售后服务承诺书
2014/05/21 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书