vue swipe自定义组件实现轮播效果


Posted in Javascript onJuly 03, 2019

本文实例为大家分享了vue swipe自定义组件实现轮播效果的具体代码,供大家参考,具体内容如下

<template>

 <layout-div :style="getStyle" class="over-h posi-r">
 <layout-div :style="getChildStyle" class="flex" @load="loadHandle">
  <slot/>
 </layout-div>
 <layout-div class="flex-center flex posi-a b0 l0 r0" :height="40" :unit="unit" v-if="!$slots.point">
  <layout-div class="flex">
  <layout-div v-for="i in this.length" :key="i" class="op-5" :mar="[0,15]" :height="20" :width="20"
    :bg="Math.abs(index) == i-1?'red':'#fff'" :fillet="20" :unit="unit"/>
  </layout-div>
 </layout-div>
 <slot v-else name="point"/>
 </layout-div>

</template>
<script>
 export default {
 props: {
  value: {
  type: Number,
  default: 0
  },
  width: { //宽
  type: Number,
  default: null
  },
  height: { //高
  type: Number,
  default: null,
  },
  unit: { //单位
  type: String,
  default: 'px'
  },
  time: { //时间(毫秒)
  type: Number,
  default: 3000
  },
  direction: { //方向 X | Y (注意是:大写)
  type: String,
  default: "X"
  },
  duration: { //每次切换的时间(毫秒)
  type: Number,
  default: 300
  },
  autoPlay: { //是否自动轮播
  type: Boolean,
  default: true
  }
 },
 data() {
  return {
  style: {},
  multiple: 50, //倍数处理,更加UI进行 100倍是按照 750*1334 的UI
  dom: null,  //当前swipe元素
  length: 0, //子元素的数量
  countWidth: 0, //总长度
  index: 0,
  isTouch: false,// 手指是否在屏幕上
  }
 },
 methods: {
  loadHandle(e) {
  this.dom = e.dom
  this.length = e.dom.childElementCount
  for (let i = 0; i < this.length; i++) {
   this.dom.children[i].style.height = this.height ? this.height / this.multiple + this.unit : ''
   this.dom.children[i].style.width = parseFloat(this.dom.style.width) / this.length / this.multiple + this.unit
   this.dom.children[i].style.flexGrow = 1;
  }
  this.bingTouch(this.dom)
  // 判断可不可以自动轮播
  if (this.autoPlay && this.length) this.beginSwipe()
  },
  bingTouch(dom) {
  const self = this;
  let tranX = 0
  this.touch({
   stop: false,
   dom,
   start(e) {
   dom.style.transitionDuration = '0ms'
   tranX = parseFloat(dom.style.transform.split("(")[1]) || 0
   },
   move({dx}) {
   dom.style.transform = `translateX(${dx + tranX + self.unit})`;
   },
   change({direction}) {
   switch (direction) {
    case 'left':
    self.index--;
    break;
   }
   self.moveHandle()
   }
  })
  },
  moveHandle() {  //移动
  const Y = parseFloat(this.dom.style.width) / this.length
  this.dom.style.transitionDuration = `${this.duration}ms`
  this.dom.style.transform = `translateX(${this.index * Y + this.unit})`;
  setTimeout(() => {
   if (!this.isTouch) {
   if (Math.abs(this.index) == this.length - 1) {
    // console.log("要开始调换位置了");
    const first = this.dom.firstChild;
    first.style.transform = `translateX(${(Math.abs(-this.index) + 1) * Y + this.unit})`;
   } else if (Math.abs(this.index) == this.length) {
    // console.log("开始下一轮了")
    const first = this.dom.firstChild;
    this.dom.style.transitionDuration = '0ms'
    this.dom.style.transform = `translateX(${0 + this.unit})`;
    this.index = 0;
    first.style.transform = `translateX(${0 + this.unit})`;
   }
   }
   this.$emit('input', Math.abs(this.index))
  }, this.duration)
  },
  beginSwipe() {
  setTimeout(() => {
   if (this.isTouch) return this.beginSwipe(); //如果是手指在移动,就不再执行
   this.index--
   this.moveHandle()
   this.beginSwipe()
  }, this.time > this.duration ? this.time : this.duration + 1000)
  }
 },
 computed: {
  getStyle() {
  if (this.unit != 'rem') this.multiple = 1;
  const width = this.width ? this.width / this.multiple + this.unit : '100%',
   height = this.height ? this.height / this.multiple + this.unit : ''
  return {width, height};
  },
  getChildStyle() {
  if (this.unit != 'rem') this.multiple = 1;
  this.countWidth = ((this.width || this.dom ? this.dom.parentNode.clientWidth : window.screen.width) / this.multiple * this.length)
  this.style.width = this.countWidth + this.unit
  if (this.height) {
   this.style.height = this.height / this.multiple + this.unit
  } else {
   this.style.height = ''
  }
  return this.style;
  }
 }
 }

</script>

class - style 具体内容如下

css 参考的 UI设计尺寸为 750*1334

.over-h {
 overflow: hidden;
}
.posi-r {
 position: relative;
 z-index: 0;
}
.flex {
 display: flex;
}
.flex-center {
 justify-content: center;
 align-items: center;
}
.posi-a {
 position: absolute;
 z-index: 0;
}
.b0 {
 bottom: 0;
}

.l0 {
 left: 0;
}
.r0 {
 right: 0;
}
.op-5 {
 opacity: 0.5
}
.font-68 {
 font-size: 0.68rem;
}
.col-f {
 color: #fff;
}

示例代码

<layout-swipe :height="240" :time="2000" unit="rem">
  <layout-div bg="red" class="flex-center flex font-68 col-f">1</layout-div>
  <layout-div bg="yellow" class="flex-center flex font-68 col-f">2</layout-div>
  <layout-div bg="green" class="flex-center flex font-68 col-f">3</layout-div>
 </layout-swipe>

效果图

vue swipe自定义组件实现轮播效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript innerHTML使用分析
Dec 03 Javascript
下拉菜单点击实现连接跳转功能的js代码
May 19 Javascript
js中的eventType事件及其浏览器支持性介绍
Nov 29 Javascript
jQuery检测输入的字符串包含的中英文的数量
Apr 17 Javascript
js实现文字闪烁特效的方法
Dec 17 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
Jan 23 Javascript
js中window.open的参数及注意注意事项
Jul 06 Javascript
Bootstrap和Java分页实例第二篇
Dec 23 Javascript
完美实现js选项卡切换效果(一)
Mar 08 Javascript
详解js中let与var声明变量的区别
Apr 05 Javascript
对vue中的事件穿透与禁止穿透实例详解
Oct 28 Javascript
浅析JavaScript 函数柯里化
Sep 08 Javascript
20个必会的JavaScript面试题(小结)
Jul 02 #Javascript
微信小程序如何调用新闻接口实现列表循环
Jul 02 #Javascript
Angular.JS读取数据库数据调用完整实例
Jul 02 #Javascript
js实现for循环跳过undefined值示例
Jul 02 #Javascript
Vue的路由及路由钩子函数的实现
Jul 02 #Javascript
Node.js 实现远程桌面监控的方法步骤
Jul 02 #Javascript
使用vue中的混入mixin优化表单验证插件问题
Jul 02 #Javascript
You might like
PHP访问数据库集群的方法小结
2016/03/14 PHP
PHP编程求最大公约数与最小公倍数的方法示例
2017/05/29 PHP
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
javascript知识点收藏
2007/02/22 Javascript
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
js中AppendChild与insertBefore的用法详细解析
2013/12/16 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
关于layui flow loading占位图的实现方法
2019/09/21 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
python self,cls,decorator的理解
2009/07/13 Python
python logging日志模块的详解
2017/10/29 Python
详解python之heapq模块及排序操作
2019/04/04 Python
对于Python深浅拷贝的理解
2019/07/29 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
工商学院毕业生个人自我评价
2013/09/19 职场文书
区域销售经理岗位职责
2013/12/10 职场文书
大学生社会实践评语
2014/04/25 职场文书
员工生日活动方案
2014/08/24 职场文书
单位授权委托书范本
2014/09/26 职场文书
公司老总年会致辞
2015/07/30 职场文书
消防安全主题班会
2015/08/12 职场文书
关于EntityWrapper的in用法
2022/03/22 Java/Android