当前位置: 首页 > news >正文

vue 中如何实现鼠标拖动出发滚动条的跟随移动?

使用场景

在做弹窗、表单或 tab 切换需求的时候,有时候因为内容过长会导致出现滚动条,但是只能拖动滚动条时会导致操作不便,我们会希望实现通过拖动内容区实现滚动条的滑动。这样操作就会简单多了。

实现思路

如果要实现鼠标辅助触发滚动条的移动,需要借助 mousedown,mouseup,mousemove 三个事件,通过鼠标的移动来动态修改滚动条的scrollLeft和scrollTop,来模拟实现滚动条的位置变更。

为方便复用,我们可以创建一个类来封装鼠标事件,使用时把事件挂载到指定容器即可。

1. 创建 move.js 文件

move.js下载地址

move.js 具体代码:

// 鼠标移动滚动位置类
class Drag {constructor(vm) {this.dragWrap = vm;// 要挂载的容器this._dom = {};this._x = 0;this._y = 0;this._top = 0;this._left = 0;this.move = false;this.down = false;this.init.apply(this, arguments);}// 绑定事件init() {this.bindEvent();}// 给要素增加鼠标事件// mousedown 按下初始化// mousemove 移动// mouseup,mouseleave 松开,移出结束移动bindEvent() {let t = this;this.dragWrap.addEventListener('mousedown', (e) => {e && e.preventDefault();if (!t.move) {t.move = false;t.down = true;t._x = e.clientX;t._y = e.clientY;t._top = t.dragWrap.scrollTop;t._left = t.dragWrap.scrollLeft;}}, { passive: false});this.dragWrap.addEventListener('mouseup',  (e) => {e && e.preventDefault();t.move = false;t.down = false;}, { passive: false});this.dragWrap.addEventListener('mouseleave',  (e) => {e && e.preventDefault();t.move = false;t.down = false;}, { passive: false});this.dragWrap.addEventListener('mousemove',  (e) => {if (t.down) {e && e.preventDefault();t.move = true;let x = t._x - e.clientX;let y = t._y - e.clientY;t.dragWrap.scrollLeft = t._left + x;t.dragWrap.scrollTop = t._top + y;}}, { passive: false});}
}
export default Drag;
2. 页面中引用
// 需要拖动的 div
<div class="tabBox" id="tabBox"></div>import Drag from '@/utils/move.js';
mounted() {this.changeSlider()this.initScroll()},
methods: {changeSlider(){let nav = document.getElementById('tabBox')// 滚动元素的父容器:刷新滚轮nav.scrollIntoView()},initScroll() {let nav = document.getElementById('tabBox')new Drag(nav)},
}

这样就实现啦,就是如此简单!

http://www.lryc.cn/news/442747.html

相关文章:

  • 【Java EE】文件IO
  • 使用 React、Material-UI、Spring、MySQL、MyBatis 以及高德 API 模拟实时位置信息
  • UniApp一句话经验: px -> rpx动态转换和动态元素区域的获取
  • Python基于flask框架的智能停车场车位系统 数据可视化分析系统fyfc81
  • 海外服务器哪个速度最快且性能稳定
  • C/C++通过CLion2024进行Linux远程开发保姆级教学
  • 工程师 - 如何安装Windows 终端
  • UniApp 从Vue2升级为Vue3需要注意哪些方面
  • 前端面试CSS常见题目
  • 408算法题leetcode--第10天
  • 13年计算机考研408-数据结构
  • 跨平台开发新视角:利用Android WebView实现Web内容的原生体验
  • Stable Diffusion 使用详解(11)--- 场景ICON制作
  • 【Linux系统编程】第二十弹---进程优先级 命令行参数 环境变量
  • 无人机之4G模块的主要功能和优势
  • 深度学习-03 Pytorch
  • GRU(门控循环单元)的原理与代码实现
  • 【医疗大数据】医疗保健领域的大数据管理:采用挑战和影响
  • gevent + flask 接口会卡住
  • SpringCloud Alibaba五大组件之——Sentinel
  • brpc之io事件分发器
  • MySQL | 知识 | 从底层看清 InnoDB 数据结构
  • es的封装
  • 写一个自动化记录鼠标/键盘的动作,然后可以重复执行的python程序
  • Spring Boot-热部署问题
  • 深度学习——管理模型的参数
  • 芯片验证板卡设计原理图:372-基于XC7VX690T的万兆光纤、双FMC扩展的综合计算平台 RISCV 芯片验证平台
  • 【软设】 系统开发基础
  • Linux移植之系统烧写
  • 【数据结构与算法】LeetCode:双指针法