美文网首页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