vue实现滚动鼠标滚轮切换页面


Posted in Vue.js onDecember 13, 2020

本文实例为大家分享了vue实现滚动鼠标滚轮切换页面的具体代码,供大家参考,具体内容如下

新项目产品被甲方的要求逼疯了,大概返稿了100+次吧,最后甲方网上找了个他们认为的比较有科技感的模板,让我们照着写,首页就是类似于纵向走马灯,鼠标滚动切换,一次切换一整屏的效果。之前没接触过,写了个简单的demo,仅作为学习笔记。

其实原理很简单,就是把所有页面放在一个div中,然后滚动的时候改变外层div的top即可。

因为滚动条监听事件是实时的,所以要加上节流来防止页面切换太快速,我这控制在1.5s才能切换一页。

其实vue不应该操作dom,应该用数据来渲染虚拟dom,但是有些地方暂时没找到合适的方法,还是用的dom操作。

<template>
  <div id="wrap" :style="{ height: screenHeight + 'px' }">
    <div id="main" :style="{ top: nowTop + 'px' }">
      <ul id="pageUl" type="circle">
        <li id="pageUlLi1" class="pageUlLi" :class="{'active': curIndex == 1}"> </li>
        <li id="pageUlLi2" class="pageUlLi" :class="{'active': curIndex == 2}"> </li>
        <li id="pageUlLi3" class="pageUlLi" :class="{'active': curIndex == 3}"> </li>
        <li id="pageUlLi4" class="pageUlLi" :class="{'active': curIndex == 4}"> </li>
        <li id="pageUlLi5" class="pageUlLi" :class="{'active': curIndex == 5}"> </li>
      </ul>
      <div style="background-color: #1b6d85" id="page1" class="page"></div>
      <div style="background-color: #5cb85c" id="page2" class="page"></div>
      <div style="background-color: #8a6d3b" id="page3" class="page"></div>
      <div style="background-color: #337ab7" id="page4" class="page"></div>
      <div style="background-color: #66512c" id="page5" class="page"></div>
    </div>
  </div>
</template>
 
<script>
  
  export default {
    name: 'Home',
    data(){
      return{
        screenWeight: 0,    // 屏幕宽度
        screenHeight: 0,    // 屏幕高度
        index: 1,        // 用于判断翻页
        curIndex: 1,      // 当前页的index
        startTime: 0,      // 翻屏起始时间 
        endTime: 0,       // 上一次翻屏结束时间
        nowTop: 0,       // 翻屏后top的位置
        pageNum: 0,       // 一共有多少页
        main: Object,
        obj: Object
      }
    },
    mounted(){
      this.screenWeight = document.documentElement.clientWidth;
      this.screenHeight = document.documentElement.clientHeight;
      this.main = document.getElementById("main");
      this.obj = document.getElementsByTagName("div");
      for (let i = 0; i < this.obj.length; i++) {
        if (this.obj[i].className == 'page') {
          this.obj[i].style.height = this.screenHeight + "px";
        }
      }
      this.pageNum = document.querySelectorAll(".page").length;
 
      // 浏览器兼容   
      if ((navigator.userAgent.toLowerCase().indexOf("firefox") != -1)) {
        document.addEventListener("DOMMouseScroll", this.scrollFun, false);
      } else if (document.addEventListener) {
        document.addEventListener("mousewheel", this.scrollFun, false);
      } else if (document.attachEvent) {
        document.attachEvent("onmousewheel", this.scrollFun);
      } else {
        document.onmousewheel = this.scrollFun;
      }
    },
    methods:{
      scrollFun(event) {
        this.startTime = new Date().getTime();
        // mousewheel事件中的 “event.wheelDelta” 属性值:返回的如果是正值说明滚轮是向上滚动
        // DOMMouseScroll事件中的 “event.detail” 属性值:返回的如果是负值说明滚轮是向上滚动
        let delta = event.detail || (-event.wheelDelta);
        // 如果当前滚动开始时间和上次滚动结束时间的差值小于1.5s,则不执行翻页动作,这样做是为了实现类似节流的效果
        if ((this.startTime - this.endTime) > 1500) {
          if (delta > 0 && parseInt(this.main.offsetTop) >= -(this.screenHeight * (this.pageNum - 2))) {
            // 向下滚动
            this.index++;
            this.toPage(this.index);
          }else if (delta < 0 && parseInt(this.main.offsetTop) < 0) {
            // 向上滚动
            this.index--;
            this.toPage(this.index);
          }
          // 本次翻页结束,记录结束时间,用于下次判断
          this.endTime = new Date().getTime();
        }
      },
      // 翻页
      toPage(index) {
        if (index != this.curIndex) {
          let delta = index - this.curIndex;
          this.nowTop = this.nowTop - delta * this.screenHeight;
          this.curIndex = index;
        }
      }
    }
  }
</script>
<style>
  html, body {
    height: 100%;
  }
 
  body, ul, li, a, p, div {
    /*慎删*/
    padding: 0px;
    margin: 0px;
  }
 
  #wrap {
    overflow: hidden;
    width: 100%;
  }
 
  #main {
    position: relative;
    transition:top 1.5s;
  }
 
  .page {
    /*谨删*/
    width: 100%;
    margin: 0;
  }
 
  #pageUl {
    position: fixed;
    right: 10px;
    bottom: 50%;
  }
 
  .active{
    color: red;
  }
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。 

Vue.js 相关文章推荐
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
利用Vue实现简易播放器的完整代码
Dec 30 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
详解vue3中组件的非兼容变更
Mar 03 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
关于Vue中的options选项
Mar 22 Vue.js
vue选项卡切换的实现案例
Apr 11 Vue.js
vue3语法糖内的defineProps及defineEmits
Apr 14 Vue.js
vue项目如何打包之项目打包优化(让打包的js文件变小)
Apr 30 Vue.js
详解vue中使用transition和animation的实例代码
Dec 12 #Vue.js
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 #Vue.js
vue使用exif获取图片经纬度的示例代码
Dec 11 #Vue.js
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 #Vue.js
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 #Vue.js
vuex页面刷新导致数据丢失的解决方案
Dec 10 #Vue.js
详解vue-cli项目在IE浏览器打开报错解决方法
Dec 10 #Vue.js
You might like
php去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
19个超实用的PHP代码片段
2014/03/14 PHP
PHP return语句的另一个作用
2014/07/30 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
PHP加密解密实例分析
2015/12/25 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
PHP实现倒计时功能
2020/11/16 PHP
FCK调用方法..
2006/12/21 Javascript
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
jQuery实现根据生日计算年龄 星座 生肖
2016/11/23 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
Vue响应式原理详解
2017/04/18 Javascript
JavaScript实现短信倒计时60s
2017/10/09 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
Vue指令指令大全
2019/02/09 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
python 读写文件,按行修改文件的方法
2018/07/12 Python
python实现飞机大战
2018/09/11 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
python 如何上传包到pypi
2020/12/24 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
人事档案接收函
2014/01/12 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
Python打包exe时各种异常处理方案总结
2021/05/18 Python