vue实现图片滚动的示例代码(类似走马灯效果)


Posted in Javascript onMarch 03, 2018

上次写了一个简单的图片轮播,这个相当于在上面的一些改进。这个组件除了可以进行图片滚动外,也可以嵌入任何内容的标签进行滚动,里面用了slot进行封装。

父:

<template>
 <div id="app">
  <er-carousel-index :typeNumber=2 :pageNumber=3 :timeSpace=2 :duration=2 :isOrNotCircle="true" url="/src/js/index.json" :isOrNotButton=false>
   <template scope="props">-----使用子组件传过来的值,封装slot
    <div class="articleList-box-photo ">
     <div class="tu imageEffectsAnimate imageEffects_Magnifier">
      <a>
       <img class="minMax" :src="props.item.img">
      </a>
     </div>
    </div>
    <div class="articleList-box-title">
     <div class="title">
      <a class="textleft">{{props.item.title}}</a>
     </div>
    </div>
   </template>
  </er-carousel-index>
 </div>
</template>
<script>
 import ErCarouselIndex from './components/carouselIndex/src/carouselIndex.vue'
 export default {
  name: 'app',
  data() {
   }
    },
  components: {
   ErCarouselIndex//一定要进行组件声明,不然不能引用子组件
  }
 }
</script>

子组件:

<template>
 <div tag="div" class="articleList articleListMod-3 er-carouseindex" name="slide-fade" id="articleList" :style="{height:imgHeight+'px'}" >
  <span id="btn1" class="er-carouseindex-left" @mousedown="imgMove('mouseLeft')" @mouseup="cancelMove('left')" v-show="isOrNotButton"></span>
  <span id="btn2" class="er-carouseindex-right" @mousedown="imgMove('mouseRight')" @mouseup="cancelMove('right')" v-show="isOrNotButton"></span>
  <div id="packageAll" class="er-carouseindex-con" @mouseover="clearAuto" @mouseout="slideAuto">
   <div class="er-carouseindex-bar" v-show="isOrNotCircle">
    <div v-for="(item,dex) in imgList" @mouseup="clearAuto" class="er-carouseindex-circle" @click="circleClick(dex)" :class="{circleSelected:dex===indexCircle}">
    </div>
   </div>
   <div id="imageAll" class="er-carouseindex-item" :style="{transform:translateX,transition:transFlag?transitionTime:''}">
    <div class="articleList-box er-carouseindex-box" v-for="(list,index) in imgLisShow" :style="{width:imgWidth+'%'}"
      style="max-height:50%;">
     <slot :item="list"></slot>
    </div>
   </div>
  </div>
 </div>
</template>
<script>
 export default
 {
  name: "ErCarouselIndex",
  data(){
   return {
    imgList: [],//请求接口数据
    imgLisShow: [],//图片滚动数据,包括左中右三种
    timer: null,//自动循环滚动时的间隔时间
    timeout:null,//长按时的图片滚动间隔时间
    index:0,//图片索引
    translateXnum:0,//图片滚动时的偏移量
    translateX:"",//生成图片偏移时的表达式
    imgWidth:"",//图片所占宽度
    timeDown:"",//鼠标刚按下时的时间
    timeup:"",//鼠标松开时的时间
    clickSpace:"",//鼠标按下松开的时间间隙
    transFlag:true,//是否匀速滚动,
    transitionTime:"",
    indexCircle:0//小圆圈滚动索引
   }
  },
  props:{
   duration:0,//图片延时滚动
   typeNumber:0, //每次滚动几张
   timeSpace:0, //图片滚动时间间隔
   url:String,//请求接口地址
   pageNumber:0,//当前页面显示几张图片
   isOrNotButton:true,//是否显示左右按钮
   isOrNotCircle:true,//是否显示小圆圈
   imgHeight:""//图片滚动显示高度
  },
  watch:{
   index:{
    handler(){
     var _this=this;
     if(Math.abs(this.index)==this.imgList.length){
      this.indexCircle=0;
      setTimeout(function(){
       _this.reset();
      },_this.duration*1000*0.98);
     }else{
      this.indexCircle=this.index;
     }
     this.calcXnum();
     }
   },
   translateXnum:{
    handler(){
     this.translateX="translateX("+this.translateXnum+"%)";
    }
   }
  },
  methods:{
   //页面初始化复赋值
   imgView:function() {
    var _this = this;
    _this.$http.get(_this.url).then(function (res) {
     _this.imgList = res.data.imgList;
     for(var i=0;i<3;i++){
      _this.imgList.forEach(function (item, index) {
       _this.imgLisShow.push(item);
      });
     }
     _this.reset();
     _this.slideAuto();
     _this.imgWidth=(100/_this.pageNumber)-1;
     _this.transitionTime="all "+_this.duration*0.98+"s linear";
     console.log(_this.transitionTime);
    });
   },
   //图片滚动方法(长按)
   imgMove:function(direct){
    var _this = this;
    _this.timeDown=new Date();//记录按下的时间
    _this.timeout = setInterval(function() {
     if(direct=="mouseLeft") {
      _this.leftMove();
     }else{
      _this.rightMove();
     }
    },300);
   },
   //鼠标送开时执行的方法
   cancelMove:function(direct){
    var _this = this;
    _this.clearAuto();
    this.timeup=new Date();//记录松开的时间
    this.clickSpace=this.timeup.getTime() - this.timeDown.getTime();
    //时间间隔小于500毫秒为点击,反之为长按
    if(this.clickSpace<500){
     for(var i=0;i<_this.typeNumber;i++){
      if(direct=="left"){
       _this.leftMove();
      }else{
       _this.rightMove();
      }
     }
    }
    if (this.timeout) {
     clearInterval(this.timeout);
     this.timeout = null;
    }
   },
   //向左移动
   leftMove:function(){
    this.index--;
    this.transFlag=true;
   },
   //向右移动
   rightMove:function(){
    this.transFlag=true;
    this.index++;
   },
   slideAuto:function () {
    var _this = this;
    _this.timer = setTimeout(function () {
     if(Math.abs(_this.index)!==_this.imgList.length){
      _this.rightMove();
      _this.slideAuto();
     }
    }, _this.timeSpace * 1000);
   },
   clearAuto:function () {
    console.log("停止");
    if (this.timer) {
     clearInterval(this.timer);
     this.timer = null;
    }
   },
   //重置
   reset:function(){
    this.index=0;
    this.transFlag=false;
    this.calcXnum();
   },
   calcXnum:function(){
    var _this=this;
    this.translateXnum=-(this.index+this.imgList.length)*(100/this.pageNumber);
   },
   //点击圆圈跳转图片
   circleClick:function(dex){
    this.index=dex;
    this.clearAuto();
   }
  },
  mounted()
  {
   this.$nextTick(function () {
    this.imgView();
   });
  }
 }
</script>

这个组件相对来说功能比较完整,用户可以通过传参来控制当前页面需要显示几张图片,图片滚动时间间隔,是否显示左右点击按钮等等,详细参数可以查看props,里面都有注释。

以上这篇vue实现图片滚动的示例代码(类似走马灯效果)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS连连看源码完美注释版(推荐)
Dec 09 Javascript
textarea 控制输入字符字节数(示例代码)
Dec 27 Javascript
JS组件Bootstrap实现弹出框效果代码
Apr 26 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
Jun 24 Javascript
全面了解函数声明与函数表达式、变量提升
Aug 09 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
Mar 15 Javascript
JS实现点击循环切换显示内容的方法
Oct 19 Javascript
JS原型继承四步曲及原型继承图一览
Nov 28 Javascript
详解vuex状态管理模式
Nov 01 Javascript
JS学习笔记之闭包小案例分析
May 29 Javascript
微信小程序实现多行文字超出部分省略号显示功能
Oct 23 Javascript
React实现全选功能
Aug 25 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
Mar 03 #Javascript
js操作二进制数据方法
Mar 03 #Javascript
vue2.0使用swiper组件实现轮播的示例代码
Mar 03 #Javascript
Vue的轮播图组件实现方法
Mar 03 #Javascript
在Vue中使用Compass的方法
Mar 02 #Javascript
AjaxUpLoad.js实现文件上传功能
Mar 02 #Javascript
关闭Vue计算属性自带的缓存功能方法
Mar 02 #Javascript
You might like
用PHP创建PDF中文文档
2006/10/09 PHP
真正的ZIP文件操作类(php)
2007/07/21 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
JQuery 文本框使用小结
2010/05/22 Javascript
flexigrid 参数说明
2010/11/23 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
Python字符串格式化
2015/06/15 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
python中subprocess批量执行linux命令
2018/04/27 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
UML设计模式笔试题
2014/06/07 面试题
中药专业大学生医药工作求职信
2013/10/25 职场文书
应届生财务会计求职信
2013/11/05 职场文书
物业管理员岗位职责范文
2013/11/25 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
护士个人自我鉴定
2014/03/24 职场文书
转让协议书
2015/01/27 职场文书
教师考核表个人总结
2015/02/12 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
小学运动会开幕词
2016/03/04 职场文书
Python进行区间取值案例讲解
2021/08/02 Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python