JavaScript拖拽核心依赖mousedown→mousemove→mouseup事件链,需坐标计算与样式控制;IE8及以下需用attachEvent、setCapture和offsetLeft兼容;移动端须改用touch事件并阻止默认行为;现代推荐Drag and Drop API或SortableJS等库。

JavaScript 实现拖拽功能核心靠 mousedown → mousemove → mouseup 事件链,配合元素坐标计算和样式控制。现代浏览器普遍支持,但旧版 IE(尤其是 IE8 及以下)和部分移动端存在关键兼容性差异。
基础拖拽实现(PC 端)
使用原生事件监听即可完成基本拖拽:
- 在目标元素上监听
mousedown,记录鼠标相对元素的偏移(clientX - element.offsetLeft等) - 绑定
mousemove到document(防止鼠标快速移动导致脱离元素),实时更新元素left/top(需设为position: absolute或fixed) - 监听
mouseup清除mousemove和mouseup监听器,避免内存泄漏 - 注意:触发
mousedown时调用event.preventDefault(),防止文本选中或图片拖出页面
IE8 及更早版本的兼容要点
IE8 不支持 getBoundingClientRect()、pageX/pageY,且事件对象属性不同:
- 用
event.clientX + document.documentElement.scrollLeft模拟pageX - 获取元素位置优先用
offsetLeft/offsetTop,而非getBoundingClientRect - IE 中
mousemove在元素外可能不触发,需确保绑定到document并启用setCapture()(IE 特有):在mousedown后调用element.setCapture(),mouseup后调用releaseCapture() - IE6–8 不支持
addEventListener,需用attachEvent(如element.attachEvent('onmousedown', handler)),并注意this指向问题
移动端拖拽的特殊处理
触摸屏无鼠标事件,必须改用 touchstart/touchmove/touchend:
标签: css react javascript java js go 浏览器 edge safari ios win bing
还木有评论哦,快来抢沙发吧~