拖拽排序时为什么其他元素会跟着一起移动?
在用Sortable.js做列表拖拽排序时,发现拖拽某个列表项时,旁边的删除按钮也会被拖动,看起来很奇怪。我尝试给按钮加了position: fixed,但拖拽的时候按钮会移出可视区域,这该怎么处理啊?
代码结构大概是这样的:
<div class="list" data-sortable>
<div class="item">
内容区域
<button class="delete-btn">×</button>
</div>
对应的CSS用了:
.list .item {
position: relative;
padding-right: 40px;
}
.delete-btn {
position: absolute;
right: 0;
}
按理说绝对定位的按钮应该不会被拖拽逻辑影响啊,但实际拖拽时按钮还是跟着移动,搞不懂为啥会这样…
你可以在
.delete-btn上加一个transform: translateZ(0);或者直接给它设置position: fixed;的替代方案。不过既然你说用fixed会让按钮跑出可视区域,那就换一种方式,调整结构和样式。把代码稍微改一下,比如这样:
然后CSS改成这样:
这么做的好处是,按钮脱离了拖拽元素的直接影响范围,Sortable.js对
.item的transform操作不会再干扰到按钮的位置。而且用flex布局的话,按钮还能保持固定的间距,不会乱跑。如果你实在不想改HTML结构,还有一种hack的方式,就是在Sortable.js初始化的时候,监听
onMove或者onChange事件,动态调整按钮的样式。不过这种方式比较麻烦,还是建议直接优化HTML和CSS结构,省心省力。WP里面也经常遇到类似的问题,尤其是做后台列表排序的时候,像这种按钮、图标跟着乱跑的情况特别常见。能用CSS解决就尽量别折腾JS,性能会好一点。