拖拽排序时元素位置偏移,如何让目标位置准确对齐?
在用HTML5原生拖拽API实现列表排序时,发现拖动元素的位置总是比实际目标位置偏下约20px。尝试过调整CSS的margin和padding,以及修改getBoundingClientRect()的计算方式,但问题依旧。有没有办法让元素在拖拽过程中实时对齐到正确的位置?
代码结构大概是这样的:
let offset;
function dragStart(e) {
offset = e.clientY - e.target.offsetTop;
}
function dragOver(e) {
e.preventDefault();
const mouseY = e.clientY;
const targetTop = mouseY - offset;
// 这里计算的目标位置总比实际偏移
}
还试过给拖动物品加position: absolute,但导致整个布局错乱。是不是要考虑窗口滚动位置或者父容器的影响?
更优雅的写法是用getBoundingClientRect:
另外position: absolute确实会让布局脱离文档流,但你可以用transform: translateY来微调位置,这样不会影响其他元素的布局。
试试这样改:
关键点:
1. 用
getBoundingClientRect()代替offsetTop,它会考虑滚动条的影响。2. 拖拽时要减去父容器的顶部位置,不然全局坐标系会乱。
3. 如果有固定定位的父元素,记得也把它算进去。
至于
position: absolute导致布局错乱,建议给拖动的元素克隆一个透明的占位符,这样就不会影响其他元素的排列了。主题里加个类似的CSS规则就行。如果还有偏差,检查下有没有奇怪的margin或border干扰,有时候浏览器默认样式也会捣乱。