Vue的轮播图组件实现方法


Posted in Javascript onMarch 03, 2018

今天在上慕课老师fishenal的vue实战课程的时候,有一个轮播图组件实现,在跟着做的时候,自己也踩了一些坑。此外,在原课程案例的基础上,我加入了不同方向的滑动功能。

本文章采用Vue结合Css3来实现轮播图。

首先要了解的是Vue的动画原理。在vue中,如果我们要给元素设置动画效果,则需要使用一个<transition name="targetClassName"></transition>将相应的元素包裹住,如下:

<transition name="imgShouldMove"> 
 <img v-if="shouldShow" src="/1.jpg"> 
</transition>

之后,便可以在.imgShoudMove中设置动画属性了,如下:

.imgShouldMove-enter{ 
 transition: all 0.5s; 
} 
.imgShouldMove-enter-active{ 
 transform:translateX(900px); 
}

注意在HTML中,这里<img>有一个v-if="shoudShow"属性。shouldShow这个属性是在data(){}中设置的,当shouldShow从false-->true时(即img从无到突然出现时),Vue动画原理将动画分为了 shouldShouldMove-enter 和 imgShouldMove-enter-active 两个阶段。

我本人对其的理解为,其中 shouldShouldMove-enter 表示动画开始的初始状态, imgShouldMove-enter-active 这表示动画的终止状态。而动画的触发则是通过if-show引起的。

如下图

Vue的轮播图组件实现方法

了解了这些之后,我就可以开始着手实现轮播图组件了。

首先是HTML代码:

<template>
 <div class="carousel" @mouseenter="clearInv()" @mouseleave="runInterval()">
 <div class="imgBox">
 <a :href="pics[currentIndex].href" rel="external nofollow" >
 <transition v-bind:name="'carousel-trans-' + direction + '-old'">
 <!-- isShow: false -> true
 取反后: true -> false(从显示到消失) -->
  <img v-if="!isShow" :src="pics[currentIndex].src">
 </transition>
 <transition v-bind:name="'carousel-trans-' + direction ">
 <!-- isShow: false -> true -->
 <!-- 从消失到显示 -->
  <img v-if="isShow" :src="pics[currentIndex].src">
 </transition>
 </a>
 </div>
 <h2>{{pics[currentIndex].title}}</h2>
 <ul class="pagination">
 <li v-for="(item, index) in pics" @click="goto(index)" :class="{active:index === currentIndex}">{{index + 1}}</li>
 </ul>
 <div class="prevBtn" @click="goto(prevIndex)"><i class="iconfont">?</i></div>
 <div class="nextBtn" @click="goto(nextIndex)"><i class="iconfont">?</i></div>
 </div>
</template>

Script代码:

<script>
export default {
 props:{
 pics:{
 type:Array,
 default:[]
 },
 timeDelta:{
 type:Number,
 default:2000
 }
 },
 data () {
 return {
 currentIndex:0,
 isShow:true,
 direction:'toleft'
 }
 },
 computed:{
 prevIndex(){
 this.direction = 'toleft'
 if (this.currentIndex <= 0) {
 return this.pics.length - 1
 }
 return this.currentIndex - 1
 },
 nextIndex(){
 this.direction = 'toright'
 if (this.currentIndex >= this.pics.length - 1) {
 return 0
 }
 return this.currentIndex + 1
 }
 },
 methods:{
 goto(index){
 this.isShow = false
 setTimeout(()=>{
 this.isShow = true
 this.currentIndex = index
 },10)
 
 },
 runInterval(){
 this.direction = 'toright'
 this.timer = setInterval(()=>{
 this.goto(this.nextIndex)
 },this.timeDelta)
 },
 clearInv(){
 clearInterval(this.timer)
 }
 },
 mounted(){
 this.runInterval()
 }
}
</script>

与动画相关的css代码如下

.carousel-trans-toright-enter-active,.carousel-trans-toright-old-leave-active{ 
 transition:all 0.5s; 
} 
.carousel-trans-toright-enter{ 
 transform:translateX(940px); //新图片从右侧940px进入 
} 
.carousel-trans-toright-old-leave-active{ 
 transform:translateX(-940px); //老图片向左侧940px出去 
} 
.carousel-trans-toleft-enter-active,.carousel-trans-toleft-old-leave-active{ 
 transition:all 0.5s; 
} 
.carousel-trans-toleft-enter{ 
 transform:translateX(-940px); //新图片从右侧940px进入 
} 
.carousel-trans-toleft-old-leave-active{ 
 transform:translateX(940px); //老图片向左侧940px出去 
}

---------------以下为解释说明-------------

注意:对于<img>需要放在<box>里面,<box>需要设置为position:relative; 而<img>必须设置为position:absolute; 这步非常非常重要,否则每次莫名其妙的总是只有一张图片显示。

在每次切换的时候,都要触发goto()方法,将this.isShow先置false,10毫秒后,this.isShow置true。这时,html中的<transition>被触发,它与css相结合触发动画效果,持续时间为css属性中的transition所定的0.5s。

在向前、向后切换的时候,使用到了计算属性,在div.prevBtn以及div.nextBtn上,我们作了点击事件绑定,触发方法goto(),而传入的正是计算属性prevIndex, @click="goto(prevIndex)"

计算属性的设定方法如下:

computed:{ 
 prevIndex(){ 
 //经过一番计算过程得出result 
 return result //这个值即<template>中的prevIndex 
 } 
 },

每隔2秒自动滑动时,我们向left滑动,在data中,设定了变量 direction ,它的值要么为字符串'toleft',要么为'toright'。

我们在计算属性中对 this.direction 进行了设置,并在<template>中对相应的name进行了字符串拼接,如下

<transition v-bind:name="'carousel-trans-' + direction ">

在vue中,除了class和style可以传入对象、数组,其他的属性绑定必须进行字符串拼接。

以上这篇Vue的轮播图组件实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 图像裁剪插件Jcrop的简单使用
May 22 Javascript
new Date()问题在ie8下面的处理方法
Jul 31 Javascript
js重写alert控件(适合学习js的新手朋友)
Aug 24 Javascript
轻松实现javascript数据双向绑定
Nov 11 Javascript
JQuery.validate在ie8下不支持的快速解决方法
May 18 Javascript
微信小程序 教程之数据绑定
Oct 18 Javascript
javascript 数组去重复(在线去重工具)
Dec 17 Javascript
Vue.js项目部署到服务器的详细步骤
Jul 17 Javascript
vue使用recorder.js实现录音功能
Nov 22 Javascript
javascript实现鼠标点击生成文字特效
Dec 24 Javascript
JS实现手写 forEach算法示例
Apr 29 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
Jun 04 Javascript
在Vue中使用Compass的方法
Mar 02 #Javascript
AjaxUpLoad.js实现文件上传功能
Mar 02 #Javascript
关闭Vue计算属性自带的缓存功能方法
Mar 02 #Javascript
解决vue 更改计算属性后select选中值不更改的问题
Mar 02 #Javascript
完美解决iview 的select下拉框选项错位的问题
Mar 02 #Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
Mar 02 #Javascript
vue element-ui table表格滚动加载方法
Mar 02 #Javascript
You might like
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
js实现网页抽奖实例
2015/08/05 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
2015/08/12 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
Python中有趣在__call__函数
2015/06/21 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
Django框架中方法的访问和查找
2015/07/15 Python
python中map()与zip()操作方法
2016/02/27 Python
Python代码解决RenderView窗口not found问题
2016/08/28 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
python实现树形打印目录结构
2018/03/29 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
Tensorflow累加的实现案例
2020/02/05 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
Python生成器常见问题及解决方案
2020/03/21 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
CSS3制作文字半透明倒影效果的两种实现方式
2014/08/08 HTML / CSS
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
毕业生自我鉴定
2013/11/05 职场文书
最新离婚协议书范本
2014/08/19 职场文书
励志演讲稿200字
2014/08/21 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS
选购到合适的激光打印机
2022/04/21 数码科技