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+iview实现分页及查询功能
Nov 17 Vue.js
vue实现广告栏上下滚动效果
Nov 26 Vue.js
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 Vue.js
vue中配置scss全局变量的步骤
Dec 28 Vue.js
vue实现简易的双向数据绑定
Dec 29 Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
vue3.0 项目搭建和使用流程
Mar 04 Vue.js
Vue实现下拉加载更多
May 09 Vue.js
HTML+VUE分页实现炫酷物联网大屏功能
May 27 Vue.js
前端vue+express实现文件的上传下载示例
Feb 18 Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 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
Oracle 常见问题解答
2006/10/09 PHP
php数组随机排序实现方法
2015/06/13 PHP
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
微信小程序 picker-view 组件详解及简单实例
2017/01/10 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
Conforama西班牙:您的家具、装饰和电器商店
2020/02/21 全球购物
Unix如何添加新的用户
2014/08/20 面试题
自考毕业生自我鉴定
2013/11/04 职场文书
大学校运会广播稿
2014/02/03 职场文书
家长会主持词
2014/03/26 职场文书
企业活动策划方案
2014/06/02 职场文书
入党现实表现材料
2014/12/23 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
导游词之西安骊山
2019/12/20 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
浅谈redis缓存在项目中的使用
2021/05/20 Redis