實現一個div可以被拖拽,代碼如下所示:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>zzw_drap</title> <style> * { margin: 0; padding: 0; } #box { position: absolute; top: 100px; left: 200px; width: 500px; } #bar { padding-left:50px; height: 50px; line-height: 50px; color: white; background-color: #aaa; cursor: move; } #content { padding:30px 0 0 50px ; height: 300px; background-color: #eee; } </style> </head> <body> <div id="box"> <div id="bar">可拖拽頭部</div> <div id="content">這里是內容</div> </div> <script> /* * zzw.drag 2017-3 * js實現div可拖拽 * @params bar 可以點擊拖動的元素 * @params box 拖動的整體元素 必須是position: absolute; * 思想:鼠標的clienX/clientY相對值設置為父元素的left/top的相對值 */ var dragBox = function (drag, wrap) { function getCss(ele, prop) { return parseInt(window.getComputedStyle(ele)[prop]); } var initX, initY, dragable = false, wrapLeft = getCss(wrap, "left"), wrapRight = getCss(wrap, "top"); drag.addEventListener("mousedown", function (e) { dragable = true; initX = e.clientX; initY = e.clientY; }, false); document.addEventListener("mousemove", function (e) { if (dragable === true ) { var nowX = e.clientX, nowY = e.clientY, disX = nowX - initX, disY = nowY - initY; wrap.style.left = wrapLeft + disX + "px"; wrap.style.top = wrapRight + disY + "px"; } }); drag.addEventListener("mouseup", function (e) { dragable = false; wrapLeft = getCss(wrap, "left"); wrapRight = getCss(wrap, "top"); }, false); }; dragBox(document.querySelector("#bar"), document.querySelector("#box")); </script> </body> </html>
其中我們可以直接使用封裝好的函數,它接受兩個參數,第一個是可以點擊拖拽的元素,第二個是父元素。 注意:父元素的postion設置為 absolute才可以使用。
2017年8月31日更新:
這里的mousemove的監聽對象修改為了document,否則,如果我們拖拽速度太快,會出現bug,即可能鼠標脫離了wrap,然后這時就會出現問題,而如果修改為了document,問題幾乎得到了解決。