< template> < div class = " container" id = " container" > < div class = " drag-box center" v-drag v-if = " isShowDrag" > < div> 无法拖拽出容器的div浮窗</ div> </ div> </ div>
</ template> < script>
export default { data ( ) { return { isShowDrag : true , } ; } , directives : { drag : { bind : function ( drag_dom ) { drag_dom. onmousedown = ( e ) => { let disX = e. clientX - drag_dom. offsetLeft; let disY = e. clientY - drag_dom. offsetTop; let container_dom = document. getElementById ( "container" ) ; document. onmousemove = ( e ) => { let left = e. clientX - disX; let top = e. clientY - disY; let leftMax = container_dom. offsetLeft + ( container_dom. clientWidth - drag_dom. clientWidth) ; let leftMin = container_dom. offsetLeft + 1 ; if ( left > leftMax) { drag_dom. style. left = leftMax + "px" ; } else if ( left < leftMin) { drag_dom. style. left = leftMin + "px" ; } else { drag_dom. style. left = left + "px" ; } let topMax = container_dom. offsetTop + ( container_dom. clientHeight - drag_dom. clientHeight) ; let topMin = container_dom. offsetTop + 1 ; if ( top > topMax) { drag_dom. style. top = topMax + "px" ; } else if ( top < topMin) { drag_dom. style. top = leftMin + "px" ; } else { drag_dom. style. top = top + "px" ; } } ; document. onmouseup = ( ) => { document. onmousemove = null ; document. onmouseup = null ; } ; } ; } , } , } ,
} ;
</ script> < style lang = " scss" scoped >
.drag-box { position : absolute; top : 100px; left : 100px; width : 300px; height : 100px; background : #fff; border-radius : 5px; box-shadow : 0 4px 12px rgba ( 0, 0, 0, 0.15) ; padding : 10px; // 改变鼠标样式为移动图标cursor : move; // 禁止文字被选中user-select : none;
} .container { border : 1px solid red; width : 600px; height : 300px; margin : 30px;
} .center { display : flex; justify-content : center; align-items : center;
}
</ style>