<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 100px;
height: 100px;
position: absolute;
top: 0;
}
div:nth-child(1) {
left: 0;
background: red;
}
div:nth-child(2) {
left: 100px;
background: green;
}
div:nth-child(3) {
left: 200px;
background: pink;
}
div:nth-child(4) {
left: 300px;
background: yellow;
}
</style>
</head>
<body>
<div></div>
<div></div>
<div></div>
<div></div>
<script src="js/drag.js"></script>
<script>
// 拖拽函数封装完毕后引入,可以给多个div同时绑定
var div = document.getElementsByTagName('div');
// 循环获得每一个div
for (var i = 0; i < div.length; i++) {
drag(div[i]);
}
</script>
</body>
</html>
function drag(ele) {
ele.onmousedown = function (ev) {
// 设置全局捕获,兼容IE8及以下
if (ele.setCapture) {
ele.setCapture();
}
var ev = ev || window.event;
// 控制盒子的移动范围,就要先得到可视区的宽和高
var clientW = document.documentElement.clientWidth;
var clientH = document.documentElement.clientHeight;
// 获取盒子的宽高
var boxW = ele.clientWidth;
var boxH = ele.clientHeight;
// 鼠标到盒子的距离
// ev.clientX/ev.clientY 鼠标到可视窗口的左、上距离
// box.offsetLeft/box.offsetTop box到父级body的左、上距离
// disX/disY 鼠标到盒子的左、上距离
var disX = ev.clientX - ele.offsetLeft;
var disY = ev.clientY - ele.offsetTop;
// 改进:鼠标拖动过快,会丢失盒子
// 把box下的鼠标移动事件换成了document下的鼠标移动事件,因为box的事件最终会冒泡至document
document.onmousemove = function (ev) {
var ev = ev || event;
var L = ev.clientX - disX; // 盒子到左边的距离
var T = ev.clientY - disY; // 盒子到上边的距离
// 判断L和T的位置距离再赋值
if (L < 0) {
L = 0;
} else if (L > clientW - boxW) {
L = clientw - disY;
}
if (T < 0) {
T = 0;
} else if (T > clientH - boxH) {
T = clientH - boxH;
}
// 将L和T赋值给box的left和top
ele.style.left = L + 'px';
ele.style.top = T + 'px';
}
// 抬起
document.onmouseup = function () {
// 鼠标抬起时,给鼠标移动和抬起分别设置为空
document.onmousemove = null;
document.onmouseup = null;
// 释放全局捕获,兼容IE8及以下
if (ele.releaseCapture) {
ele.releaseCapture();
}
}
// 图片拖动产生副本的现象是浏览器默认行为
// return false可以阻止浏览器的默认行为
return false;
}
}