【JavaScript】實現元素拖拽和碰撞檢測
阿新 • • 發佈:2018-12-09
function drag() {
var src1 = document.getElementById("src-1");
var src2 = document.getElementById("src-2");
var src3 = document.getElementById("src-3");
var srcs = [src1, src2, src3];
var dest1 = document.getElementById("dest-1");
var dest2 = document.getElementById("dest-2" );
var dest3 = document.getElementById("dest-3");
var drag;
var x, y;
srcs.forEach(function(item) {
item.onmousedown = function(e) {
var event = e || window.event;
var target = event.target || event.srcElement;
x = event.clientX - target.offsetLeft;
y = event.clientY - target.offsetTop;
drag = target;
}
});
document.onmousemove = function (e) {
if (drag) {
event = e || window.event;
var left = event.clientX - x;
var top = event.clientY - y;
body = document.documentElement || document.body;
if (left < 0) left = 0;
if (left > body.offsetWidth - drag.offsetWidth) left = body.offsetWidth - drag.offsetWidth;
if (top < 0) top = 0;
if (top > body.offsetHeight - drag.offsetHeight) top = body.offsetHeight - drag.offsetHeight;
drag.style.left = left + 'px';
drag.style.top = top + 'px';
}
}
document.onmouseup = function(e) {
if (drag) {
if (drag == src1) {
handler(src1, dest1);
} else if (drag == src2) {
handler(src2, dest2);
} else {
handler(src3, dest3);
}
}
drag = null;
}
}
function handler(src, dest) {
if (acreage(src, dest) == 0) { //未重合
if (src.getAttribute("id") == "src-1") {
src.style.left = "10px";
src.style.top = "50px";
} else if (src.getAttribute("id") == "src-2") {
src.style.left = "10px";
src.style.top = "150px";
} else {
src.style.left = "10px";
src.style.top = "250px";
}
} else if (acreage(src, dest) > dest.offsetHeight * dest.offsetWidth * 2 / 3) { //重合超過2/3
src.style.left = dest.style.left;
src.style.top = dest.style.top;
src.onmousedown = null;
}
}
function acreage(node1, node2) {
// 計算重合面積
return 0;
}
drag();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
* {
margin: 0px;
padding: 0px;
}
html {
height: 100%;
}
body {
height: 100%;
min-width: 300px;
display: flex;
justify-content: center;
align-items: center;
}
.pos {
width: 50px;
height: 50px;
position: absolute;
color: black;
line-height: 50px;
text-align: center;
font-size: 25px;
cursor: pointer;
user-select: none;
}
.dest {
border-color: black;
border-width: 1px;
border-style: solid;
}
#src-1 {
top: 50px;
left: 10px;
background-color: yellowgreen;
z-index: 100;
}
#src-2 {
top: 150px;
left: 10px;
background-color: yellow;
z-index: 100;
}
#src-3 {
top: 250px;
left: 10px;
background-color: green;
z-index: 100;
}
#dest-1 {
top: 250px;
right: 10px;
}
#dest-2 {
top: 150px;
right: 10px;
}
#dest-3 {
top: 50px;
right: 10px;
}
.success {
line-height: 50px;
height: 50px;
font-size: 30px;
text-align: center;
color: red;
background-color: black;
padding: 25px;
display: none;
}
.title {
text-align: center;
font-size: 20px;
position: absolute;
top: 10px;
}
</style>
</head>
<body>
<div class="title">標題</div>
<div class="pos src" id="src-1">1</div>
<div class="pos src" id="src-2">2</div>
<div class="pos src" id="src-3">3</div>
<div class="pos dest" id="dest-1">1</div>
<div class="pos dest" id="dest-2">2</div>
<div class="pos dest" id="dest-3">3</div>
<div class="success" id="success">拼圖完成</div>
<script type="text/javascript" src="test3.js"></script>
</body>
</html>