天天看點

vue實作圖檔切換效果

思路:

整個代碼部分分為輪播圖檔和控制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>