純vue實現(xiàn)輪播,超簡單

用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è)置進入之前那一刻和之后那一刻的效果,一刻之后會消失 */
  /* 從右往左進入,透明度從 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>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容