需求:
为了提升交互体验,满足用户“不关弹窗还能看弹窗下的页面”的需求,需要弹窗可以随意拖动位置。
原本ant design的弹窗没有拖拽功能,但是为了保留原本功能样式,我们要拓展一下这个Modal组件。
思路:
1、首先需要两个DIV,一个是和视口一样大的drag-mask,绑定mouseMove事件和mouseUp事件,用来作为拖拽参照;另一个是和Modal一样大的drag-target,绑定mouseDown事件。
2、已知Modal的样式.ant-modal{position:relative;top:100px;left:0px;},可见通过更改top、left我们将可以改变Modal位置。
3、mouseDown事件时,显示drag-mask,并记录坐标(preX,preY);
4、mouseMove事件时,Modal的新位置=Modal的原位置+移动距离:
left2 = left1 + (pageX-preX);
top2 = top1 + (pageY-preY);
图示:由灰色位置移动到蓝色位置,箭头表示拖拽轨迹
5、mouseMove到窗口边缘时不能继续拖动,误差10px,也就是说拖拽时鼠标移动到靠近窗口边缘10px时就自动mouseUp(防止拖出视口