Vue 向上滚动、向下滚动 轮播图

前言 原理解说

先说向上的轮播
Vue 向上滚动、向下滚动 轮播图_第1张图片
在盒子里面放置4张图片
复制4张一样的图片放在后面(即乘2)
设置外层盒子的高度为4张图的高度,让超出部分隐藏起来overflow:hidden

给定一个速度,即每次移动的像素
设置一个定时器,一直改变内层盒子的Top距离
即可以实现让图片向上/向下滚动

解释一下中间的一个判断
当向上滚动的情况:
初始的时候,内层盒子的top为0(即从第一张图开始向上轮播)
定时器内不断让top减去一个固定的值,即让top越来越小,就能实现上滚
第一张图
第二张图
第三张图 (乘2的原因:如果当此时移动到第三张图,或者第四张图的时候,屏幕后半部分会空白)
第四张图 (乘2的原因:乘2之后,我们就会看到后继的几张图,而不是看到空白)

第一张图
第二张图
第三张图

if (leftWrap.offsetTop < -2672) { 
//已经移动完第四张图片,也就是盒子的一半高度时,让内层盒子的高度变为0,然后继续
  leftWrap.style.top = 0 + "px";
}
leftWrap.style.top = leftWrap.offsetTop - speedup + "px";

当向下滚动的情况:
初始的时候,让内层盒子的top定位到一半的位置top: -2672px;(即从第四张图开始向下轮播)
定时器内不断让top加上一个固定的值,即让top越来越大,就能实现下滚

第四张图
第三张图
第二张图 (乘2的原因:如果当此时移动到第二张图,或者第一张图的时候,屏幕后半部分会空白)
第一张图(乘2的原因:乘2之后,我们就会看到前面的几张图,而不是看到空白)

第四张图
第三张图
第二张图

if (rightWrap.offsetTop >= 0) { 
//已经移完第一张图,也就是top为0的时候,让内层盒子top改为-2672px,继续向下滚动
   rightWrap.style.top = -2672 + "px";
 }
 rightWrap.style.top = rightWrap.offsetTop + speeddowm + "px";

1.HTML部分

注意事项:
如果需要鼠标移入,暂停播放;鼠标移出,继续播放的效果
则需要添加这两个时间函数@mouseover=“pasue” @mouseout=“play”

<div id="app">
  <div id="div2" @mouseover="pasue" @mouseout="play">
    <div id="wrap">
      <div class="item">
        <img src="https://img2.baidu.com/it/u=1786147954,3770383148&fm=26&fmt=auto&gp=0.jpg">
      div>
      <div class="item">
        <img src="https://img1.baidu.com/it/u=3251653125,2541959792&fm=26&fmt=auto&gp=0.jpg">
      div>
      <div class="item">
        <img src="https://img0.baidu.com/it/u=1024815077,3823714427&fm=26&fmt=auto&gp=0.jpg">
      div>
      <div class="item">
        <img src="https://img1.baidu.com/it/u=3232494856,29183283&fm=26&fmt=auto&gp=0.jpg">
      div>
    div>
  div>
div>

2.CSS部分

注意事项:
外层盒子div2一定要限制高度,相对定位,超出隐藏
内层盒子wrap绝对定位左上

#div2 {
  width: 533px;
  height: 1200px;
  position: relative;
  overflow: hidden;
}

#wrap {
  position: absolute;
  left: 0;
  top: 0;
  overflow: hidden;
}

#wrap div {
  float: left;
  width: 533px;
  height: 300px; 
}

3.JS部分

  <script type="text/javascript">
    var vm = new Vue({
      el: '#app',
      data: {
        timer: '' //全局定时器
      },
      methods: {
        autoPlay() { //自动播放 
          var speed = 1;//初始化速度 

          var oWrap = document.getElementById('wrap'); //获取外层盒子 

          oWrap.innerHTML += oWrap.innerHTML;//图片内容*2,播放的时候障眼法,不会断章
          var oImgs = document.getElementsByClassName('item'); //获取所有的item
          oWrap.style.height = oImgs.length * 300 + 'px';//设置oWrap的高度使图片可以放下 
          //300 是高度,依据你图片的高度来定 

          this.timer = setInterval(function () { //设置定时器
            if (oWrap.offsetTop < -(oWrap.offsetHeight / 2)) {//当前四张图移除的时候,重新开始移
              oWrap.style.top = 0;
            }
            oWrap.style.top = oWrap.offsetTop - speed + 'px';
          }, 10)
        },
        pasue() { //鼠标移入图片暂停轮播
          clearInterval(this.timer)
        },
        play() { //鼠标移除图片继续轮播
          this.autoPlay();
        },
      },
      mounted() { //在vue挂载期间,就开启定时器,让轮播动起来
        this.autoPlay()
      }
    })
  </script>

参考博客:
vue 实现无缝向左滚动 鼠标悬停、离开时停止、开始滚动
vue项目的无缝轮播

4.vue组件中的使用案例

这里的left就是向上滚动的
这里的right就是向下滚动的

<template> 
  <div class="fake"> 
    <div class="container">
      <div class="float-img">
        <img src="@/assets/designActivety/Group 137.png" alt="" />
      </div>
      <div class="left" id="left">
        <div
          id="leftWrap"
          ref="leftWrap"
          @mouseover="pasue('left')"
          @mouseout="play('left')"
        >
          <div class="item">
            <router-link to="/SGSHB"
              ><img src="@/assets/designActivety/image (1).png" alt=""
            /></router-link>
          </div>
          <div class="item">
            <img src="@/assets/designActivety/image (2).png" alt="" />
          </div>
          <div class="item">
            <router-link to="/WCB"
              ><img src="@/assets/designActivety/image (3).png" alt=""
            /></router-link>
          </div>
          <div class="item">
            <router-link to="/TSJ"
              ><img src="@/assets/designActivety/image (4).png" alt=""
            /></router-link>
          </div>
        </div>
      </div>
      <div class="right" id="right">
        <div
          id="rightWrap"
          ref="rightWrap"
          @mouseover="pasue('right')"
          @mouseout="play('right')"
        >
          <div class="item">
            <router-link to="/TSJ"
              ><img src="@/assets/designActivety/image (4).png" alt=""
            /></router-link>
          </div>
          <div class="item">
            <router-link to="/WCB"
              ><img src="@/assets/designActivety/image (3).png" alt=""
            /></router-link>
          </div>
          <div class="item">
            <img src="@/assets/designActivety/image (2).png" alt="" />
          </div>
          <div class="item">
            <router-link to="/SGSHB"
              ><img src="@/assets/designActivety/image (1).png" alt=""
            /></router-link>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script> 
export default { 
  data() {
    return {
      timerLeft: "",
      timerRight: "",
    };
  },
  methods: {
    autoPlayLeft() { //向上轮播 
      var speedup = 1; //初始化速度
      var leftWrap = this.$refs.leftWrap; //如果这里使用上面的方法不行的华,就使用refs来获取也行
      leftWrap.innerHTML += leftWrap.innerHTML; //图片内容*2
      var oImgs = document.getElementsByClassName("item");
      leftWrap.style.height = oImgs.length * 680 + "px"; //680 是一张图片高度

      this.timerLeft = setInterval(function () {
        if (leftWrap.offsetTop < -2672) { //向上轮播,top移出到一半的时候,重新开始
          leftWrap.style.top = 0 + "px";
        }
        leftWrap.style.top = leftWrap.offsetTop - speedup + "px";
      }, 4);
    },
    autoPlayRight() { //向下轮播
      var speeddowm = 1; //初始化速度
      var rightWrap = this.$refs.rightWrap;
      rightWrap.innerHTML += rightWrap.innerHTML; //图片内容*2
      var oImgs = document.getElementsByClassName("item");
      rightWrap.style.height = oImgs.length * 680 + "px";

      this.timerRight = setInterval(function () {
        if (rightWrap.offsetTop >= 0) { //向下轮播,top移动到0的时候从一半的位置继续移动
          rightWrap.style.top = -2672 + "px";
        }
        rightWrap.style.top = rightWrap.offsetTop + speeddowm + "px";
      }, 4);
    },
    pasue(derection) {
      if (derection == "left") {
        clearInterval(this.timerLeft);
      } else {
        clearInterval(this.timerRight);
      }
    },
    play(derection) {
      if (derection == "left") {
        this.autoPlayLeft();
      } else {
        this.autoPlayRight();
      }
    },
  },
  mounted() {
    this.autoPlayLeft();
    this.autoPlayRight();
  },
};
</script>

<style lang="scss" scoped>
.fake {
  width: 100%;
  height: 1640px;
  .container {
    background-color: #fbf9f7;
    padding: 0 14%;
    position: relative;
    .float-img {
      position: absolute;
      top: 0;
      left: 0;
      img {
        width: 94%;
      }
    }
    .left {
      display: inline-block;
      width: 49%;
      height: 800px;
      padding-left: 30px;
      box-sizing: border-box;
      img {
        width: 450px;
        margin-bottom: 40px;
      }
    }
    .right {
      display: inline-block;
      width: 49%;
      padding-left: 40px;
      box-sizing: border-box;
      img {
        width: 450px;
        margin-bottom: 40px;
      }
    }
  }
  #right {
    width: 536px;
    height: 2672px;
    position: relative;
    overflow: hidden;
    #rightWrap {
      position: absolute;
      top: -2672px;
      overflow: hidden;
      #rightWrap div {
        float: left;
        width: 450px;
        height: 680px;
        img {
          width: 100%;
        }
      }
    }
  }
  #left {
    width: 536px;
    height: 2672px;
    position: relative;
    overflow: hidden;
    #leftWrap {
      position: absolute;
      overflow: hidden;
      #leftWrap div {
        float: left;
        width: 450px;
        height: 680px;
        img {
          width: 100%;
        }
      }
    }
  }
}
</style>

你可能感兴趣的:(vue)