1. 程式人生 > >Js事件案例——實現div色塊拖動錄製

Js事件案例——實現div色塊拖動錄製

描述:

實現一個div50*50的色塊,拖動它生成一個軌跡,鬆手後,這個div會重複你剛才拖動的這個路徑。

效果:

程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        div
        {
            width: 50px;
            height: 50px;
            background-color: deepskyblue;
            position: absolute;
            border: 2px solid #656565;
        }
    </style>
    <script src="js/Method.js"></script>
</head>
<body>
<div></div>
    <script>
        var elem;
        var state=0;//當前的狀態 初始0——拖動錄製1——回放2
        var arr=[];//存放我們的行走路徑的 陣列
        var list=[];//存放我們的行走路徑的 陣列

        var index=0;
        init();
        function init() {
            elem=document.querySelector("div");
            Method.dragElem(elem);
            elem.addEventListener("mousedown",mouseHandler);
            elem.addEventListener("mouseup",mouseHandler);
            setInterval(animation,16);
        }

        function mouseHandler(e) {//當前的狀態 初始0——拖動錄製1——回放2
            if(e.type==="mousedown"){//滑鼠按下
                state=1;
            }else if(e.type==="mouseup"){//滑鼠擡起
                createElemShadow();
                state=2;
            }
        }

        function createElemShadow() {
            var bool=false;
            if(list.length===0) bool=true;
            for(var i=0;i<5;i++){
                if(bool)list.push(elem.cloneNode(false));
                list[i].style.opacity=1-i*0.2;
                document.body.appendChild(list[i])
            }
        }
        
        function animation() {
            if(!state) return;
            if(state===1){
                record();
            }else if(state===2){
                play();
            }
        }
        
        function record() {
            var rect=elem.getBoundingClientRect();
            arr.push({x:rect.x,y:rect.y});
        }
        
        
        function play() {
          /*  if(index>=arr.length-1){
                state=0;
                return;
            }*/
            index++;
            var point=arr[index];
            if(point){
                elem.style.left=point.x+"px";
                elem.style.top=point.y+"px";
                elem.style.backgroundColor=Method.divColor();
            }
            var bool=false;
            for(var i=0;i<list.length;i++){
                if(!arr[index-i*2]) continue;
                list[i].style.left=arr[index-i*2].x+"px";
                list[i].style.top=arr[index-i*2].y+"px";
                list[i].style.backgroundColor=Method.divColor();
                bool=true;
            }
            if(!bool){
                state=0;
                for(var j=0;j<list.length;j++){
                    list[j].remove();
                }
            }
        }
    </script>
</body>
</html>