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中echarts的用法及与elementui-select的协同绑定操作
Nov 17 Vue.js
vue动态合并单元格并添加小计合计功能示例
Nov 26 Vue.js
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
vue-cli4.0多环境配置变量与模式详解
Dec 30 Vue.js
vue实现防抖的实例代码
Jan 11 Vue.js
vue实现验证用户名是否可用
Jan 20 Vue.js
Vue常用API、高级API的相关总结
Feb 02 Vue.js
Vue的过滤器你真了解吗
Feb 24 Vue.js
Vue2.0搭建脚手架
Mar 13 Vue.js
vue实现省市区联动 element-china-area-data插件
Apr 22 Vue.js
Vue2项目中对百度地图的封装使用详解
Jun 16 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
一个高ai的分页函数和一个url函数
2006/10/09 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
php过滤XSS攻击的函数
2013/11/12 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
php实现在线考试系统【附源码】
2018/09/18 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
apycom出品的jQuery精美菜单破解方法
2011/02/18 Javascript
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
2013/09/29 Javascript
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
easyui-datagrid开发实践(总结)
2017/08/02 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
vue translate peoject实现在线翻译功能【新手必看】
2018/06/07 Javascript
Python多线程编程(五):死锁的形成
2015/04/05 Python
为Python的web框架编写前端模版的教程
2015/04/30 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
基于python traceback实现异常的获取与处理
2019/12/13 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
什么是Python包的循环导入
2020/09/08 Python
网络体系结构及协议的定义
2014/03/13 面试题
项目经理的岗位职责
2013/11/23 职场文书
道德之星事迹材料
2014/05/03 职场文书
个人租房协议书
2014/11/28 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL