美文网首页vue 学习练习笔记
纯vue实现轮播,超简单

纯vue实现轮播,超简单

作者: 云想衣 | 来源:发表于2020-05-28 09:29 被阅读0次

    用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>
    

    相关文章

      网友评论

        本文标题:纯vue实现轮播,超简单

        本文链接:https://www.haomeiwen.com/subject/exdgahtx.html