js实现单元格拖拽效果

<head>
	<meta charset="UTF-8">
	<title></title>
	<style type="text/css">
		* {
			margin: 0;
			padding: 0;
		}
		
		#box {
			position: relative;
		}
		
		#box div {
			position: absolute;
			width: 100px;
			height: 100px;
			border-radius: 15px;
			text-align: center;
			line-height: 100px;
			font-size: 50px;
			cursor: pointer;
		}
	</style>
</head>

<body>
	<div id="box"></div>
	<script type="text/javascript">
		//生成结构
		var oDiv = document.getElementById("box");
		var ml = mt = 10;
		//行列结构
		for(var i = 0; i < 3; i++) { //行
			for(var j = 0; j < 3; j++) { //列
				var aDiv = document.createElement("div");
				oDiv.appendChild(aDiv);
				aDiv.style.left = j * (aDiv.offsetWidth + ml) + "px";
				aDiv.style.top = i * (aDiv.offsetHeight + mt) + "px";

				//背景颜色随机
				aDiv.style.backgroundColor = "rgb(" + Math.floor(Math.random() * 256) + "," + Math.floor(Math.random() * 256) + "," + Math.floor(Math.random() * 256) + ")";  //256=(256-0+1)+0;
			}
		}
		//添加文字
		var str = "ABCDEFGHI";
		var aItems = oDiv.children;
		for(var i = 0; i < str.length; i++) {
			aItems[i].innerText = str[i];
		}
		//拖拽
		for(var i = 0; i < aItems.length; i++) {
			aItems[i].onmousedown = function(e) {
				var evt = e || event;
				var x = evt.offsetX;
				var y = evt.offsetX;
				var dragNode = this;

				var cloneNode = dragNode.cloneNode();
				oDiv.replaceChild(cloneNode, dragNode);
				cloneNode.style.border = "1px dashed #ccc";
				oDiv.appendChild(dragNode);
				dragNode.style.zIndex = 1;

				document.onmousemove = function(e) {
					var evt = e || event;
					var _left = evt.clientX - x;
					var _top = evt.clientY - y;

					dragNode.style.left = _left + "px";
					dragNode.style.top = _top + "px";

					return false; //选中,文字也会拖动  去除默认行为
				}
				document.onmouseup = function() {
					var disArr =[];
					var newArr =[];
					for(var i = 0; i < aItems.length-1; i++) {
						var disx = dragNode.offsetLeft - aItems[i].offsetLeft;
						var disy = dragNode.offsetTop - aItems[i].offsetTop;
						var dis= Math.sqrt(Math.pow(disx, 2) + Math.pow(disy, 2));
			 			disArr.push(dis);
						newArr.push(dis);
					}

					disArr.sort(function(a, b) {
						return a - b;
					});
					var minval = disArr[0];
					
					var minIndex = newArr.indexOf(minval);

					dragNode.style.left = aItems[minIndex].style.left;
					dragNode.style.top = aItems[minIndex].style.top;
					aItems[minIndex].style.left = cloneNode.style.left;
					aItems[minIndex].style.top = cloneNode.style.top;
					
					oDiv.removeChild(cloneNode);
					
					document.onmousemove = null;
					document.onmouseup = null;

				}
				return false;
			}
		}
	</script>
</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值