1. 程式人生 > >【JavaScript】實現元素拖拽和碰撞檢測

【JavaScript】實現元素拖拽和碰撞檢測

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>