1. 程式人生 > 其它 >【前端】【H5 API】拽託

【前端】【H5 API】拽託

拖曳操作需要藉助於滑鼠來實現,如檔案或圖片的移動操作等。在開發中,我們經常使用原生的JavaScript來實現拖曳效果,實現起來比較複雜。因此,HTML5為我們提供了更好用的介面或者事件,在很大程度上簡化了頁面中拖曳互動的實現難度。

圖片和連結預設是可以拖動的,它們不用新增draggable屬性。

一個完整的拖曳效果由拖曳(Drag)和釋放(Drop)組成的。

在拖曳操作中,被拖動的元素稱之為源物件,它指的是頁面中設定了draggable="true"屬性的元素;

源物件進入的元素稱之為目標元素,目標元素可以是頁面中的任一元素

拖曳元素的事件

事件 事件描述
ondragstart 當拖曳開始時觸發
ondrag 作用於整個拖曳過程,ondrag事件表示在拖曳元素被拖動過程中會觸發的事件。此時,滑鼠可能在移動也可能未移動。
ondragend 當拖曳結束時觸發

目標元素相關的事件

事件 事件描述
ondragenter 當源物件進入目標元素時觸發
ondragover 當源物件懸停在目標元素上方時觸發
ondragleave 當源物件離開目標元素時觸發
ondrop 當源物件在目標元素上方釋放滑鼠時觸發

只有當源物件上的滑鼠點進入目標元素時,才會觸發ondragenter事件。

預設情況下,瀏覽器會預設阻止ondrop事件,如果想要觸發該事件,則需要在ondragover事件中使用“return false;”

(或者e.preventDefault())來阻止其預設行為

拽托實例1

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width= , initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        div {
            width: 200px;
            height: 200px;
            border: 1px solid red;
            float: left;
            margin: 10px;
        }

        div:nth-child(2) {
            border: 1px solid green;
        }

        div:nth-child(3) {
            border: 1px solid blue;
        }

        p {
            height: 25px;
            background-color: pink;
            line-height: 25px;
            text-align: center;
        }
    </style>

</head>

<body>
    <div id="div1">
        <p id="p1" draggable="true">拖曳內容1</p>
        <p id="p2" draggable="true">拖曳內容2</p>
    </div>
    <div id="div2"></div>
    <div id="div3"></div>
    <script>
        // 當拖曳開始時觸發
        document.ondragstart = function (event) {
            console.log('源物件開始被拖動');
            console.log(event.target.id);
            event.dataTransfer.setData('text/html', event.target.id); // 傳遞id值
        };
        // 當拖曳結束時觸發
        document.ondragend = function (event) {
            console.log('源物件被拖動結束');
        };
    </script>

</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width= , initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        div {
            width: 200px;
            height: 200px;
            border: 1px solid red;
            float: left;
            margin: 10px;
        }

        div:nth-child(2) {
            border: 1px solid green;
        }

        div:nth-child(3) {
            border: 1px solid blue;
        }

        p {
            height: 25px;
            background-color: pink;
            line-height: 25px;
            text-align: center;
        }
    </style>

</head>

<body>
    <div id="div1">
        <p id="p1" draggable="true">拖曳內容1</p>
        <p id="p2" draggable="true">拖曳內容2</p>
    </div>
    <div id="div2"></div>
    <div id="div3"></div>
    <script>
        // 當拖曳開始時觸發
        document.ondragstart = function (event) {
            console.log('源物件開始被拖動');
            console.log(event.target.id);
            event.dataTransfer.setData('text/html', event.target.id); // 傳遞id值
        };
        // 當拖曳結束時觸發
        document.ondragend = function (event) {
            console.log('源物件被拖動結束');
        };
        // 當源物件進入目標元素時
        document.ondragenter = function (event) {
            console.log('目標物件被源物件拖動著進入');
            console.log(event.target);
        };
        // 當源物件懸停在目標元素上方時觸發
        document.ondragover = function (event) {
            console.log('源物件懸停在目標元素上方');
            return false;
        };
        // 當源物件在目標元素上方釋放滑鼠時 
        document.ondrop = function (event) {
            console.log('上方釋放/鬆手');
            var id = event.dataTransfer.getData('text/html');
            event.target.appendChild(document.getElementById(id));
        };
    </script>

</body>

</html>