1. 程式人生 > >【重點突破】——Drag&Drop拖動與釋放

【重點突破】——Drag&Drop拖動與釋放

style cti script urn 知識點 dragstart document 觸發 get

一、引言

在學習HTML5新特性的時候,學到了Drag&Drop這兩種拖放API,這裏根據拖動的是“源對象”還是“目標對象”做兩個小練習,主要是為了理解與應用HTML5為拖放行為提供的7個事件。

二、七個事件

HTML5為拖放行為提供了7個事件,分為兩組:

拖動的源對象(會動)可以觸發的事件:

  • dragstart:拖動開始
  • drag:拖動中
  • dragend:拖動結束

整個拖動過程:dragstart*1+drag*n+dragend*1

拖動的目標對象(不會動)可以觸發的事件:

  • dragenter:拖動著進入
  • dragover:拖動著懸停在上方
  • dragleave:拖動著離開
  • drop: 在目標上方釋放

整個拖動過程1:dragenter*1+dragover*n+dragleave*1

整個拖動過程2:dragenter*1+dragover*n+drop*1

三、可以隨鼠標拖動而移動的小飛機

要求:使用拖動源對象提供的事件句柄。

小知識點:拖動事件是要求獲得相對於整個頁面的左上角的偏移量,使用e.pageX/pageY。e.pageX與e.offsetX的區別:e.offsetX是相對於事件源左上角的偏移量

問題1:h1有margin-top,會把body擠下來

解決方法:給body設置前置內容給元素,空格元素設為body的第一個子元素。這樣即使h1有margin-top,也不會把body擠下來

body:before{
     content:‘ ‘;
     display:table;
}

問題2:瀏覽器默認拖動的源對象觸發結束,自動定位位置到(0,0)點處

解決方法:當ex,ey都等於0的時候,跳出函數,不執行

if(ex===0 && ey===0){
     return;//跳出函數,不執行
}

實現:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
<style> body{ position:relative; margin:0; } body:before{ content:‘ ‘; display:table; } #p3{ position:absolute; } </style> </head> <body> <h1>拖動的源對象可能觸發的事件</h1> <h3>可以隨著鼠標拖動而移動的飛機</h3> <img id="p3" src="image/p3.png"> <script> //剛拖動時鼠標在飛機上的偏移量 var startX = 0; var startY = 0; //源對象剛開始拖動 p3.ondragstart = function(e){ startX = e.offsetX;//拖動事件相對於飛機上的偏移量 startY = e.offsetY; } //源對象拖動中 p3.ondrag = function(e){ //獲得拖動事件相對於頁面的偏移量 var ex = e.pageX; var ey = e.pageY; if(ex===0 && ey===0){ return;//防止拖動事件最後觸發的(0,0)坐標 } //修改元素位置 p3.style.left = (ex-startX)+px; p3.style.top = (ey-startY)+px; } //源對象拖動結束 p3.ondragend = function(e){ console.log(drag end...) } </script> </body> </html>

效果:

技術分享

四、模擬垃圾箱拖動刪除效果

要求:使用拖動事件的源對象和目標對象可能觸發的7個事件。

思路:在剛開始拖動時(src.ondragstart)記錄被拖動的源對象的ID,釋放時(target.ondrop)根據此ID找到源對象,執行刪除:div.removeChild(c)。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        body{
            text-align: center;
        }
        #box{
            border-top:1px solid #aaa;
            padding:1em;
        }
    </style>
</head>
<body>
<h1>拖動的目標對象可能觸發的事件</h1>
<img id="trash" src="image/trash.png">
<div id="box">
    <img id="p1" src="image/p1.png">
    <img id="p2" src="image/p4.png">
    <img id="p3" src="image/p3.png">
</div>


<script>
    var planeId = null;//當前被拖動的飛機的id

    //拖動事件的源對象可能觸發的事件
    var list = document.querySelectorAll(#box img);
    for(var i= 0;i<list.length;i++){
        var plane = list[i];
        plane.ondragstart = function(e){
          planeId = this.id;//記錄被拖放的飛機的id
        };
        plane.ondrag = function(e){};
        plane.ondragend = function(e){}
    }

    //拖動事件的目標對象可能觸發的事件
    trash.ondragenter = function(e){};
    trash.ondragover = function(e){
        e.preventDefault();
    };
    trash.ondragleave = function(e){};
    trash.ondrop = function(e){
        //根據元素的ID查找IMG元素,在#box進行刪除
        var img = document.getElementById(planeId);
        box.removeChild(img);
    }

</script>
</body>
</html>

效果:

技術分享

【重點突破】——Drag&Drop拖動與釋放