VUE中鼠标滚轮使div左右滚动的方法详解


Posted in Vue.js onDecember 14, 2020

前言

技术点: addEventListener/attachEvent(传递参数)

功能描述: 鼠标停在div中,若div有x轴滚动条,则鼠标滚轮控制x轴滚动条横向滚动

一、单个实现

1.定义变量

data () {
	return {
		domObj: null
	}
}

2.编写方法

绑定事件

scrollFunction () {
 this.domObj = document.getElementById('ceshi') // 通过id获取要设置的div
 if (this.domObj.attachEvent) { // IE
 this.domObj.attachEvent('onmousewheel', this.mouseScroll)
 } else if (this.domObj.addEventListener) {
 this.domObj.addEventListener('DOMMouseScroll', this.mouseScroll, false)
 }
 this.domObj.onmousewheel = this.domObj.onmousewheel = this.mouseScroll
 }

当鼠标放在id为‘ceshi'的div上时,鼠标滚轮滚动触发的事件

mouseScroll(event) { // google 浏览器下
 let detail = event.wheelDelta || event.detail
 let moveForwardStep = -1
 let moveBackStep = 1
 let step = 0
 step = detail > 0 ? moveForwardStep * 100 : moveBackStep * 100
 event.preventDefault() // 阻止浏览器默认事件
 this.domObj.scrollLeft = this.domObj.scrollLeft + step
 }

3.触发

可以直接在mounted中触发

this.scrollFunction()

注意1: 如果是内容v-for循环出来的div,内容从后端获取,此时就不能在mounted中触发,因为mounted是挂载完成,这时请求还没开始,也就是说这时div还没x轴滚动条,所以应该在请求完成后触发scrollFunction()

注意2: 若在请求结束得到后端返回内容时触发,直接触发你会发现不起作用。个人理解:因为请求到数据,vue双向绑定监听到数据改变,触发页面更新,浏览器重绘或回流需要时间(如若有误,还望指正),所以可以用setTimeout

setTimeout(function () {
   this.scrollFunction()
   }, 100) // 0.1S后执行绑定方法

4.卸载

在beforeDistroy中卸载

if (!this.domObj) return
if (this.domObj.attachEvent) {
 this.domObj.detachEvent('onmousewheel', this.mouseScroll)
}
if (this.domObj.addEventListener) {
 this.domObj.removeEventListener('DOMMouseScroll', this.mouseScroll, false)
}

二、多个实现

关键点: addEventListener第二个参数Function传参

1.描述

如果一个页面中有多个div需要实现这个效果,按照上面的方法CV是当然可以的,不过就显得代码没有深度,所以用到了addEventListener传参。

2.addEventListener(参数)

绑定事件修改如下:

参数:obj:需要横向滚动的div存放位置

id:需要横向滚动的div的id

scrollFunction (obj, id) {
  obj = document.getElementById(id)
  if (obj.attachEvent) {
  obj.attachEvent('onmousewheel', this.mouseScroll(obj))
  } else if (obj.addEventListener) {
  obj.addEventListener('DOMMouseScroll', this.mouseScroll(obj), false)
  }
  obj.onmousewheel = obj.onmousewheel = this.mouseScroll(obj)
 }

既然mouseScroll有了个参数obj,但是addEventListener第二个参数接收的是一个function。在触发执行时,如果想将参数传递进去的话,就得使用闭包的形式。具体修改如下:

mouserScroll (obj) {
  return function () {
  let e = window.event || document.all ? window.event : arguments[0] ? arguments[0] : event
  let detail, moveForwardStep, moveBackStep
  let step = 0
  if (e.wheelDelta) { // google 下滑负数: -120
   detail = e.wheelDelta
   moveForwardStep = -1
   moveBackStep = 1
  } else if (e.detail) { // firefox 下滑正数:3
   detail = event.detail
   moveForwardStep = 1
   moveBackStep = -1
  }
  step = detail > 0 ? moveForwardStep * 100 : moveBackStep * 100
  e.preventDefault()
  obj.scrollLeft = obj.scrollLeft + step
  }
 }

注意:

1.因为有了传参,所以event直接放在mouserScroll(obj, event)这样是取不到event的,所以得用JS取event的方式写:

let e = window.event || document.all ? window.event : arguments[0] ? arguments[0] : event

(document.add ? window.event : arguments[0] ? arguments[0] : event) 是FireFox里面取event的写法

2.触发

因为有了参数,所以触发的写法如下:

this.scrollFunction(this.domObj1, 'ceshi1') 
this.scrollFunction(this.domObj2, 'ceshi2')

其中,this.domObj1和this,domObj2需要先在data中定义,第二个参数是需要横向滚动的div的id值。

3.卸载

最后在beforeDistroy中卸载就好了,卸载代码同上。

总结

到此这篇关于VUE中鼠标滚轮使div左右滚动的文章就介绍到这了,更多相关VUE鼠标滚轮使div左右滚动内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue实现下载文件流完整前后端代码
Nov 17 Vue.js
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
vue实现树状表格效果
Dec 29 Vue.js
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
Jan 05 Vue.js
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 Vue.js
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 Vue.js
vue实现防抖的实例代码
Jan 11 Vue.js
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
Vue-router编程式导航的两种实现代码
Mar 04 Vue.js
vue+django实现下载文件的示例
Mar 24 Vue.js
Vue实现动态查询规则生成组件
May 27 Vue.js
Vue3实现简易音乐播放器组件
Aug 14 Vue.js
vue3.0实现插件封装
Dec 14 #Vue.js
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 #Vue.js
Vue实现点击当前行变色
Dec 14 #Vue.js
Vue实现简单购物车功能
Dec 13 #Vue.js
vue使用element-ui实现表单验证
Dec 13 #Vue.js
vue+element实现动态加载表单
Dec 13 #Vue.js
vue实现两个区域滚动条同步滚动
Dec 13 #Vue.js
You might like
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
用php写的serv-u的web申请账号的程序
2006/10/09 PHP
PHP中Date获取时间不正确怎么办
2008/06/05 PHP
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
JavaScript中Null与Undefined的区别解析
2015/06/30 Javascript
jQuery简单实现仿京东商城的左侧菜单效果代码
2015/09/09 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
js 显示日期时间的实例(时间过一秒加1)
2017/10/25 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
[46:57]EG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
基于python的汉字转GBK码实现代码
2012/02/19 Python
python基础教程之元组操作使用详解
2014/03/25 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
python实现Virginia无密钥解密
2019/03/20 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
自适应线性神经网络Adaline的python实现详解
2019/09/30 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
电厂职工自我鉴定
2014/02/20 职场文书
音乐节策划方案
2014/06/09 职场文书
空气环保标语
2014/06/12 职场文书
个人德育工作总结
2015/03/05 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
用Python生成会跳舞的美女
2022/01/18 Python