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

拖拽同时支持Y轴滚动

一.父容器+window

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>拖拽自动滚动测试</title><style>#parent {max-height: 2000px; /* 远超屏幕高度 */overflow-y: auto; /* 出现滚动条 */border: 1px solid #ccc;position: relative;margin: 50px auto;width: 80%;}.child {height: 50px;background: lightblue;margin: 5px;display: flex;align-items: center;justify-content: center;cursor: move; /* 鼠标样式 */}</style>
</head>
<body><div id="parent"><div class="child" draggable="true">Item 1</div><div class="child" draggable="true">Item 2</div><div class="child" draggable="true">Item 3</div><div class="child" draggable="true">Item 4</div><div class="child" draggable="true">Item 5</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><div class="child" draggable="true">Item 6</div><!-- 可以继续添加更多子项 -->
</div><script>const parent = document.getElementById('parent');// 监听整个文档的 dragover 事件(因为拖拽过程中鼠标可能移出父容器)document.addEventListener('dragover', (e) => {// 必须阻止默认行为,否则某些浏览器可能不允许拖拽e.preventDefault();// 获取父容器的位置信息const rect = parent.getBoundingClientRect();// 获取当前鼠标 Y 坐标const mouseY = e.clientY;// 定义触发滚动的阈值(距离边缘多少像素时开始滚动)const scrollThreshold = 100;// 定义每次滚动的像素数const scrollSpeed = 20;// 计算鼠标在父容器内的相对位置// 注意:rect.top 是父容器顶部相对于视口的位置// mouseY 是鼠标相对于视口的位置// 所以鼠标在父容器内的相对 Y 坐标是:mouseY - rect.top// mouseY - rect.top 计算鼠标在父容器内的相对位置,这样无论父容器是否滚动,都能正确判断鼠标是否接近父容器的边缘。const mouseYInParent = mouseY - rect.top;console.log("mouseYInParent:",mouseYInParent)let isParentScroll = false;// 判断是否需要滚动父容器if (mouseYInParent < scrollThreshold) {isParentScroll = true;// 靠近父容器顶部,向上滚动parent.scrollTop -= scrollSpeed;} else if (mouseYInParent > rect.height - scrollThreshold) {isParentScroll = true;// 靠近父容器底部,向下滚动parent.scrollTop += scrollSpeed;}if(isParentScroll){console.log("父容器在滚动----------------------------父容器在滚动")}let isWindowScroll = false;// 判断是否需要滚动页面(当父容器本身已经接近页面边缘时)// 如果鼠标靠近屏幕底部,且父容器已经滚动到页面底部 → 滚动页面if (mouseY > window.innerHeight - scrollThreshold) {isWindowScroll = true;window.scrollBy(0, scrollSpeed); // 向下滚动页面}// 如果鼠标靠近屏幕顶部,且父容器顶部已经到达视口顶部 → 滚动页面// 如果父容器顶部已经到达视口顶部(rect.top <= 0),说明父容器不能再向上滚动(rect.top 已经包含 margin等值)// 此时如果鼠标靠近屏幕顶部(mouseY < scrollThreshold),就可以触发页面向上滚动;if (mouseY < scrollThreshold && rect.top <= 0) {isWindowScroll = true;window.scrollBy(0, -scrollSpeed); // 向上滚动页面}if(isWindowScroll){console.log("window在滚动----------------------------window在滚动")}});
</script>
</body>
</html>

http://www.dtcms.com/a/296509.html

相关文章:

  • 开立医疗2026年校园招聘
  • openbmc 日志系统继续分析
  • 行为型模式-协作与交互机制
  • 华为仓颉编程语言的表达式及其特点
  • mac llama_index agent算术式子计算示例
  • 力扣刷题(第九十七天)
  • 强化学习入门三(SARSA)
  • 专题:2025微短剧行业生态构建与跨界融合研究报告|附100+份报告PDF汇总下载
  • LeetCode 1695.删除子数组的最大得分:滑动窗口(哈希表)
  • 07 RK3568 Debian11 网络优先级
  • “抓了个寂寞”:一次实时信息采集的意外和修复
  • 网络基础19--OSPF路由协议(上)
  • 基于QT(C++)实现(图形界面)通讯录系统
  • JavaJSP
  • 【SpringAI实战】FunctionCalling实现企业级自定义智能客服
  • Qt 调用ocx的详细步骤
  • 单片机学习课程
  • 数据推荐丨海天瑞声7月数据集上新啦!
  • 海外红人营销的下一站:APP出海如何布局虚拟网红与UGC生态?
  • idea监控本地堆栈
  • Redis分布式锁的学习(八)
  • 无源域自适应综合研究【2】
  • Qt连接MySql数据库
  • SAP B1 DTW成功登录后点击下一步提示没有权限读取清单
  • QML 模型
  • 阿里云SLS未开启索引时无法查询日志内容
  • 11.事务
  • 【GoLang#1】:Go 语言概述(背景 | 环境配置 | 特点 | 学习)
  • Redis单线程模型(含面试题)
  • pytorch常用函数