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

news/2024/12/23 5:12:53/

使用场景

在做弹窗、表单或 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.ppmy.cn/news/1530912.html

相关文章

Ubuntu 64系统信息查看

一、查看系统基本信息 uname -a 显示系统内核名称、主机名、内核版本号、发布日期等信息。 Linux ubuntu 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux 内核版本&#xff1a;这是一个基于 Linux 的 Ubuntu 系…

智算中心动环监控:构建高效、安全的数字基础设施@卓振思众

在当今快速发展的数字经济时代&#xff0c;智算中心作为人工智能和大数据技术的核心支撑设施&#xff0c;正日益成为各行业实现智能化转型的重要基石。为了确保这些高性能计算环境的安全与稳定&#xff0c;卓振思众动环监控应运而生&#xff0c;成为智算中心管理的重要组成部分…

elastic search 向量检索的过程包括数据写入与查询

使用 Elasticsearch 的 `dense_vector` 字段类型,实现 Elasticsearch 中向量写入和向量检索查询。以下是一个完整的 Python 示例,展示了如何将数据写入 Elasticsearch 并进行向量检索查询。 ### 1. 安装依赖 首先,确保你已经安装了 `elasticsearch` 库: ```bash pip inst…

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

十七&#xff0c;Spring Boot 整合 MyBatis 的详细步骤(两种方式) 文章目录 十七&#xff0c;Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后&#xff1a; MyBatis 的官方文档&#xff1a;https://mybatis.p2hp.com/ 关于 MyBa…

nrf52840 arm_startup_nrf52840.s文件解析

在基于 Nordic nRF52840 芯片的开发中,arm_startup_nrf52840.s文件起着至关重要的作用,主要包括以下几个方面: 一、启动引导 初始化硬件 在芯片上电或复位后,该文件负责初始化处理器的基本硬件设置,如设置堆栈指针、初始化内存等。这确保了处理器在开始执行主要程序代码之…

Linux之实战命令02:shred应用实例(三十六)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

解决IDEA出现:java: 程序包javax.servlet不存在的问题

问题截图&#xff1a; 解决如下&#xff1a; 1. 点击文件——>项目结构 2. 点击库——>点击——>点击java 3. 找到Tomcat的文件夹&#xff0c;找到lib文件夹中的servlet-api.jar&#xff0c;点击确定 4. 选择要添加的模块 5. 点击应用——>确定

小白是如何挖漏洞的(技巧篇)入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

给大家的福利&#xff0c;点击下方蓝色字 即可免费领取↓↓↓ &#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 目录&#xff1a; 怎么找漏洞 找到后如何挖漏洞 关于通杀漏洞N day漏洞的挖掘 漏洞如何提交 每小结…