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 相关文章推荐
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 Vue.js
用vue设计一个日历表
Dec 03 Vue.js
vue中利用three.js实现全景图的完整示例
Dec 07 Vue.js
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
vue实现防抖的实例代码
Jan 11 Vue.js
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
Vue如何实现组件间通信
May 15 Vue.js
Vue的生命周期一起来看看
Feb 24 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
解决vue-router的beforeRouteUpdate不能触发
Apr 14 Vue.js
vue如何在data中引入图片的正确路径
Jun 05 Vue.js
Vue深入理解插槽slot的使用
Aug 05 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通用分页类page.php[仿google分页]
2008/08/31 PHP
smarty section简介与用法分析
2008/10/03 PHP
CMS中PHP判断系统是否已经安装的方法示例
2014/07/26 PHP
JS删除数组元素的函数介绍
2013/03/27 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
vuejs如何配置less
2017/04/25 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
layer弹出层扩展主题的方法
2019/09/11 Javascript
解决VUE双向绑定失效的问题
2019/10/29 Javascript
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
python中管道用法入门实例
2015/06/04 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
Python3 读取Word文件方式
2020/02/13 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
惠普香港官方商店:HP香港
2019/04/30 全球购物
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
英语翻译系毕业生求职信
2013/09/29 职场文书
护理自荐信范文
2013/10/05 职场文书
职高毕业生自我鉴定
2013/10/21 职场文书
2014年应届大学生自我评价
2014/01/09 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
党员进社区活动总结
2015/05/07 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
nginx实现动静分离的方法示例
2021/11/07 Servers
Django框架中视图的用法
2022/06/10 Python