用Vue写一个简单轮播图

之前在JS里面写过轮播图,然后后面都用的是swiper插件,正好最近vue忘了好多的感觉,使用vue手写一个轮播图封装,目前只实现定时滚动功能,正好用来复习下vue的知识

  1. 用mockjs模拟图片数据
  2. 实现父子组件的数据传输
  3. 实现鼠标放上暂停,移开继续播放

vue项目的创建就不额外说了,先来直接构建数据

构建mock数据

通过mock构建虚拟数据,感觉是前端的一个必备技能,因为后台不一定很快搭建好,所以需要自己创建数据来测试组件,这里使用的是]Mockjs](http://mockjs.com/examples.html),当然还有更多在线mock平台这里就不说了
安装完成之后需要创建对应的js文件

// 要求生成300*400的图片,图片内容为序号
// 生成的数量以传入的值为准
// 导入mockjs
var Mock = require('mockjs')
// 随机函数
let Random = Mock.Random
// 开始生成数据,设置为一个function,每次调用函数的时候就能随机生成数据
let getPicture = function (n) {
   // 保存图片的数组
   let list = []
   // 循环填充list
   for(let i = 0;i<n;i++) {
     let text = Random.csentence(3,5)
     // 生成单张图片数据,图片大小300*400
     var data = Random.image('300x400', '#38a1db', `所有图片中第${i+1}张内容为${text}`)
     // 放入list
     list.push(data)
   }
   // 返回list
   return list
}
export default getPicture

这里在之前的项目中学到的是用一个函数包裹Mock,之后返回整个函数,那么在组件内调用的时候,就能实现传参,并且如果数据内容是变化的也能实现函数再次调用的时候生成不同内容的数据。

实际生成的数据

之后需要在父组件中调用暴露出来的gertPicture函数,并且传入需要多少张图片即可
import getPicture from '../public/imgdata'来获取函数,之后在created生命周期内调用函数,就模拟出在组件创建阶段发送网络请求的感觉了

实现父子组件的数据传输

父传子传参用Props
父组件内要在子组件的标签内写:子组件接受变量名 = “父组件传递变量名”
子组件要用props接收

  props:{
    // 子组件接受的变量名字
    list: {
       // 变量的默认类型
       type:Array,
       // 变量的默认参数,如果是复杂数据类型,需要用return,这样是固定写法
       default() {
       return []
       }
    }
  }

子组件布局的实现

用flex布局实现盒子都在一行显示

<template>
   <div class="box">
     <ul class='content'>
       <li class='pic' v-for="(item,i) in list" :key="i" > 
          <img :src="item">
       </li> 
     </ul>
   </div>
</template>
.box
  width 300px
  height 400px
  overflow hidden 
  .content 
    position relative
    padding 0
    margin 0
    width 2400px
    height 100%
    list-style none
    left -300px
    .pic
      float left
      width 300px
      height 400px
      img 
        width 100%
        height 100%

实现动画

接下来实现的是动画和无缝切换
动画的实现
动画的话主要用transition以及transform来实现
transform来移动包裹图片的盒子,每次移动一张图片的长度实现图片的切换,并且移动多少距离可以通过vue内保存的变量来计算

<ul class='content' :style = "{transform:'translate('+-currentpic*300+'px,0)'}" @mouseover="stop()" @mouseout="play()">
       <li class='pic' v-for="(item,i) in list" :key="i" > 
          <img :src="item">
       </li> 
     </ul>

transition来实现动画,监听的是transform属性,并且保证它0.2s内完成

transition transform .2s

无缝切换的实现
就是每当到最后一张图片的时候,立马切回到第一张图片就能实现无缝切换

实现鼠标放上去暂停,移出来之后继续滚动

利用Vue给元素绑定事件,当鼠标移上去的时候,清除滚动定时器,移出来的时候就重新设置定时器即可

swiper组件完整代码

<template>
   <div class="box">
    <ul class='content' :style = "{transform:'translate('+-currentpic*300+'px,0)'}" @mouseover="stop()" @mouseout="play()">
       <li class='pic' v-for="(item,i) in list" :key="i" > 
          <img :src="item">
       </li> 
     </ul>
   </div>
</template>

<script>
   export default {
     name:'swiper',
     data() {
        return {
           // 当前的图片
           currentpic: 0,
           // 保存定时器
           timer: null
        }
     },
     props:{
       list: {
          type:Array,
          default() {
            return []
          }
       }
     },
     methods: {
        // 通过递增参数来移动图片
        move () {
           // 递增
          this.currentpic++
          if(this.currentpic > 7) this.currentpic = 0
        },
        // 鼠标放在图片上面的时候停止运动
        stop () {
          // 清除定时器
          clearInterval(this.timer)
        },
        play () {
           this.timer = setInterval(() => {
              this.move()
           }, 2000);
        } 
     },
     mounted() {
        setTimeout(() => {
           this.play()
        }, 3000);
     },
   }
</script>

<style lang='stylus' scoped>
.box
  width 300px
  height 400px
  margin 100px auto 
  overflow hidden
  .content 
    position relative
    padding 0
    margin 0
    width 2400px
    height 100%
    list-style none
    transition transform .2s
    .pic
      float left
      width 300px
      height 400px
      img 
        width 100%
        height 100%
</style>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容