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 相关文章推荐
js中复制行和删除行的操作实例
Jun 25 Javascript
js解决弹窗问题实现班级跳转DIV示例
Jan 06 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
Aug 11 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
Jun 03 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
Aug 10 Javascript
JavaScript的设计模式经典之代理模式
Feb 24 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
May 24 Javascript
jQuery EasyUI 入门必看
Jun 03 Javascript
文件上传,iframe跨域数据提交的实现
Nov 18 Javascript
angular+webpack2实战例子
May 23 Javascript
微信小程序实现上拉加载功能
Nov 20 Javascript
React Native项目框架搭建的一些心得体会
May 28 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编码规范之注释和文件结构说明
2010/07/09 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
js技巧--转义符&quot;\&quot;的妙用
2007/01/09 Javascript
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
jQuery Masonry瀑布流插件使用方法详解
2017/01/18 Javascript
获取url中用&amp;隔开的参数实例(分享)
2017/05/28 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
javascript触发模拟鼠标点击事件
2019/06/26 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
Python时间模块datetime、time、calendar的使用方法
2016/01/13 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
办公室人员先进事迹
2014/01/27 职场文书
《称象》教学反思
2014/04/25 职场文书
大型活动组织方案
2014/05/10 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
小学语文教学随笔
2015/08/14 职场文书
nginx location优先级的深入讲解
2021/03/31 Servers
利用ajax+php实现商品价格计算
2021/03/31 PHP