思路:
整個代碼部分分為輪播圖檔和控制span兩個部分。
按照前端工程化的需求來說,這兩個部分應該解耦成兩個component最後再導入頁面比較合理,但由于demo較為簡單,
作為練手就不搞那麼複雜了。
先寫出整體代碼架構:
<div id="banner" class="slide" style="padding-top: 5px;">
<div v-for="(item, index) in bannerList" v-show="index===mark" :key="index" class="slideShow">
<a href="">
<img :src="item.image" alt="" style="width: 100%; height: 2.9rem;">
</a>
</div>
<div class="bor">
<span v-for="(item, index) in bannerList" :class="{'actives': index===mark}" :key="index"></span>
</div>
</div>
我們使用v-for清單渲染兩個部分,值得注意的是清單渲染最好要提供一個key值,至于為什麼官方文檔說得很複雜,
就我所知的是如果不加key值在使用transition-group也就是過渡效果的時候會出現bug,官方給出的建議也是盡可能
在清單渲染的時候加上key值,百利無一害,養成習慣就好。
建立定時器,每隔2s給變量mark+1,挂載到鈎子函數created:
<script>
export default {
data () {
return {
mark: 0, //比對圖檔索引的變量
bannerList:[]
}
},
methods: {
autoPlay () {
this.mark++;
if (this.mark === 3) { //當周遊到最後一張圖檔置零
this.mark = 0
}
},
play () {
setInterval(this.autoPlay, 2000)
},
change (i) {
this.mark = i
}
},
created () {
this.play()
}
}
</script>
<style>
.slide {
width: 950px;
height: 150px;
margin: 0 auto;
margin-top: 50px;
overflow: hidden;
position: relative;
}
.slideshow {
width: 95px;
height: 150px;
}
li {
position: absolute;
}
img {
width: 95px;
height: 150px;
}
.bar {
position: absolute;
width: 100%;
bottom: 10px;
margin: 0 auto;
z-index: 10;
text-align: center;
}
.bar span {
width: 20px;
height: 5px;
border: 1px solid;
background: white;
display: inline-block;
margin-right: 10px;
}
.active {
background: #bfd6b6 !important;
}
</style>