用vue如何实现轮播,超简单。新手用vue实现轮播,超简单
知识点:
v-if 指令 --- 显示隐藏
transform --- vue 自带过渡动画
1 开始:准备 dom 并挂载
<!-- 样式 -->
<style>
.banner{width: 640px; height: 300px; background-color: #f0f0f0; margin: 50px auto; position: relative; overflow: hidden;}
</style>
<!-- HTML -->
<div id="app">
<div class="banner">
<!-- 挂载#app;.banner为banner的外盒子 -->
</div>
</div>
<!-- script 挂载 -->
<script>
// 新建实例,挂载
var app = new Vue({
el: '#app',
data() {
return { }
}
})
</script>
把图片渲染到html中,这里用数字代替
<!-- 刻意循环数字 -->
<div class="img"
v-for="(item, index) in 3"
v-if="num==index"
:key="index"
> <!-- 条件:num是在0/1/2几个数字间切换,当num 和图片的序列相等的时候,第 index 个显示,其他隐藏 -->
{{item}} <!-- 这里将根据情况显示 1/2/3 中的一个 -->
</div>
2 设置方法
<script>
// 新建实例,挂载
var app = new Vue({
el: '#app',
data() {
return {
num: 0 // 初始显示第几个
}
},
mounted() {
// this.play()
setInterval(this.autoPlay, 3000) // 3000毫秒执行一次,要和css的动画时间一致
},
methods: {
autoPlay() {
// 每3000ms(时间是下面的 play()方法 设定的) num+1,如果等于3,就等于0从0开始
let _self = this
_self.num++
if(_self.num == 3) {
_self.num = 0
}
},
play () {
// setInterval(this.autoPlay, 3000) // 3000毫秒执行一次,要和css的动画时间一致
}
}
})
</script>
3. 设置transition名字和样式
将 div.img 用 transition包裹起来,起名banner
<transition name="banner">
<div class="img" v-for="(item, index) in 3" v-if="num==index" :key="index">
{{item}}
</div>
</transition>
<!-- ...样式 -->
<style>
/* 设置过渡时间和缓动效果 */
.banner-enter-active, .banner-leave-active{transition: all 3s ease-in-out;}
/* 设置进入之前那一刻和之后那一刻的效果,一刻之后会消失 */
/* 从右往左进入,透明度从 0到1,实际banner没有透明度变化,可省略*/
.banner-enter{opacity: 0; left: 640px;}
.banner-enter-to{opacity: 1; left: 0px;}
/* 设置离开之前那一刻和离开之后那一刻的样式,一刻之后会消失*/
/* 从右往左离开,透明度从 1到0,实际banner没有透明度变化*/
.banner-leave{opacity: 1; left: 0px;}
.banner-leave-to{opacity: 0; left: -640px;}
</style>
完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Demo-Banner-Vue</title>
<style>
.banner{width: 640px; height: 300px; background-color: #f0f0f0; margin: 50px auto; position: relative; overflow: hidden;}
.banner .img-box{width: 640px; height: 300px;}
.banner .img{width: 640px; height: 300px;position: absolute;top: 0;}
.banner-enter-active, .banner-leave-active{transition: all 3s ease-in-out;}
.banner-enter{opacity: 0; left: 640px;}
.banner-enter-to{opacity: 1; left: 0px;}
.banner-leave{opacity: 1; left: 0px;}
.banner-leave-to{opacity: 0; left: -640px;}
</style>
</head>
<body>
<div id="app">
<div class="banner">
<transition name="banner">
<div class="img" v-for="(item, index) in 3" v-if="num==index" :key="index">
{{item}}
<!-- -->
</div>
</transition>
</div>
</div>
<script>
// 新建实例,挂载
var app = new Vue({
el: '#app',
data() {
return {
num: 0, // 默认显示第几个
animateTime: 3000 // 要和 css 的过渡一致
}
},
mounted() {
this.play() // 初始的时候加载
},
methods: {
autoPlay() { // num自增,通过判断 num 和 index 相不相等,来显示对应 index 的banner
let _this = this // 避免作用域的问题
_self.num++
if(_this .num == 3) {
_self.num = 0
}
},
play () { // 设置定时器,让banner显示隐藏
let _this = this
setInterval(this.autoPlay, _this.animateTime)
}
}
})
</script>
</body>
</html>
网友评论