用vue如何實現(xiàn)輪播刻帚,超簡單。新手用vue實現(xiàn)輪播涩嚣,超簡單
知識點:
v-if 指令 --- 顯示隱藏
transform --- vue 自帶過渡動畫
1 開始:準(zhǔn)備 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中航厚,這里用數(shù)字代替
<!-- 刻意循環(huán)數(shù)字 -->
<div class="img"
v-for="(item, index) in 3"
v-if="num==index"
:key="index"
> <!-- 條件:num是在0/1/2幾個數(shù)字間切換顷歌,當(dāng)num 和圖片的序列相等的時候,第 index 個顯示幔睬,其他隱藏 -->
{{item}} <!-- 這里將根據(jù)情況顯示 1/2/3 中的一個 -->
</div>
2 設(shè)置方法
<script>
// 新建實例眯漩,掛載
var app = new Vue({
el: '#app',
data() {
return {
num: 0 // 初始顯示第幾個
}
},
mounted() {
// this.play()
setInterval(this.autoPlay, 3000) // 3000毫秒執(zhí)行一次,要和css的動畫時間一致
},
methods: {
autoPlay() {
// 每3000ms(時間是下面的 play()方法 設(shè)定的) num+1麻顶,如果等于3赦抖,就等于0從0開始
let _self = this
_self.num++
if(_self.num == 3) {
_self.num = 0
}
},
play () {
// setInterval(this.autoPlay, 3000) // 3000毫秒執(zhí)行一次,要和css的動畫時間一致
}
}
})
</script>
3. 設(shè)置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>
/* 設(shè)置過渡時間和緩動效果 */
.banner-enter-active, .banner-leave-active{transition: all 3s ease-in-out;}
/* 設(shè)置進(jìn)入之前那一刻和之后那一刻的效果队萤,一刻之后會消失 */
/* 從右往左進(jìn)入,透明度從 0到1矫钓,實際banner沒有透明度變化要尔,可省略*/
.banner-enter{opacity: 0; left: 640px;}
.banner-enter-to{opacity: 1; left: 0px;}
/* 設(shè)置離開之前那一刻和離開之后那一刻的樣式,一刻之后會消失*/
/* 從右往左離開新娜,透明度從 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, // 默認(rèn)顯示第幾個
animateTime: 3000 // 要和 css 的過渡一致
}
},
mounted() {
this.play() // 初始的時候加載
},
methods: {
autoPlay() { // num自增杯活,通過判斷 num 和 index 相不相等匆帚,來顯示對應(yīng) index 的banner
let _this = this // 避免作用域的問題
_self.num++
if(_this .num == 3) {
_self.num = 0
}
},
play () { // 設(shè)置定時器,讓banner顯示隱藏
let _this = this
setInterval(this.autoPlay, _this.animateTime)
}
}
})
</script>
</body>
</html>