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+iview实现文件上传
Nov 17 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
vue3中轻松实现switch功能组件的全过程
Jan 07 Vue.js
Vue实现多页签组件
Jan 14 Vue.js
Vue实现摇一摇功能(兼容ios13.3以上)
Jan 26 Vue.js
vue 组件基础知识总结
Jan 26 Vue.js
Vue基本指令实例图文讲解
Feb 25 Vue.js
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
Apr 11 Vue.js
vue项目配置sass及引入外部scss文件
Apr 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
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
用PHP实现Ftp用户的在线管理
2012/02/16 PHP
PHP中判断变量为空的几种方法小结
2013/11/12 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
2015/05/09 PHP
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
基于JS对象创建常用方式及原理分析
2017/06/28 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
python时间整形转标准格式的示例分享
2014/02/14 Python
python读取浮点数和读取文本文件示例
2014/05/06 Python
Python while 循环使用的简单实例
2016/06/08 Python
python微信好友数据分析详解
2018/11/19 Python
pip安装python库的方法总结
2019/08/02 Python
python中count函数简单的实例讲解
2020/02/06 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
python烟花效果的代码实例
2020/02/25 Python
python requests.get带header
2020/05/05 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
草船借箭教学反思
2014/02/03 职场文书
党代会心得体会
2014/09/04 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书
SQL 窗口函数实现高效分页查询的案例分析
2021/05/21 SQL Server
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
css弧边选项卡的项目实践
2023/05/07 HTML / CSS