Fe-interview: [js] 第157天 举例说明js拖拽用到的事件有哪些?

Created on 19 Sep 2019  ·  4Comments  ·  Source: haizlin/fe-interview

第157天 举例说明js拖拽用到的事件有哪些?

js

Most helpful comment

  • 传统方式

    • PC:mousedonw``mousemove``mouseup

    • 移动端:touchstart``touchmove``touchend

    • 原理:通过计算坐标的方式来实现元素的可视化移动。

  • HTML5原生拖拽

    • dragstart``drag``dragenter``dragover``dragleave``drop``dragend

    • 原理:通过对被拖动元素和拖动目标元素进行事件监听,实现拖动效果

  • 区别

    • 传统方式是实现元素的实时移动,HTML5原生拖拽事件是体现元素的拖拽结果,需要确定拖拽的目标区域,如应用于拖拽上传。

  • demo

        <!DOCTYPE html>
        <html lang="en">
    
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <meta http-equiv="X-UA-Compatible" content="ie=edge">
            <title>Document</title>
            <style>
                * {
                    margin: 0;
                    padding: 0;
                }
    
                .tra {
                    width: 70px;
                    height: 70px;
                    position: fixed;
                    background: red;
                }
    
                .drag {
                    width: 80px;
                    height: 80px;
                    background: blueviolet;
                }
    
                #dragTarget {
                    width: 200px;
                    height: 200px;
                    border: 1px solid;
                }
            </style>
        </head>
    
        <body>
            <!-- HTML Draggable -->
            <div class="drag" id="drag" draggable="true"></div>
    
            <div id="dragTarget"></div>
            <!-- 传统的拖拽 -->
            <div id="tra" class="tra">
            </div>
    
    
            <script>
                // 传统的拖拽
                ; (function () {
                    var tra = document.querySelector('#tra');
                    var startPoint = Object.create(null);
                    var isStartMove = false;
                    const addUnit = num => num + 'px';
                    tra.addEventListener('mousedown', e => {
                        isStartMove = true;
                        startPoint = {
                            x: e.offsetX,
                            y: e.offsetY,
                        }
                    });
                    window.addEventListener('mousemove', e => {
                        if (!isStartMove) return;
                        tra.style.left = addUnit(e.clientX - startPoint.x);
                        tra.style.top = addUnit(e.clientY - startPoint.y);
                    });
                    window.addEventListener('mouseup', e => {
                        isStartMove = false;
                        startPoint = {
                            x: 0,
                            y: 0,
                        }
                    });
                })();
    
                // HTML5拖拽事件
                ;(function() {
                    var dragEl = document.querySelector('#drag');
                    dragEl.addEventListener('dragstart', e => {
                        e.dataTransfer.setData("Text",e.target.id);
                        e.dataTransfer.effectAllowed = 'copyMove';
                    });
    
                    var dragTargetEl = document.querySelector('#dragTarget');
                    dragTargetEl.addEventListener('dragenter', e => {
                        e.preventDefault();
                    });
    
                    dragTargetEl.addEventListener('dragover', e => {
                        e.preventDefault();
                    });
    
                    dragTargetEl.addEventListener('drop', e => {
                        e.preventDefault();
                        var id = e.dataTransfer.getData('Text');
                        e.target.appendChild(document.getElementById(id));
                    })
                })();
    
    
            </script>
        </body>
    
        </html>
    

All 4 comments

  1. 鼠标按下事件 onmousedown
function onMouseDown(event){

    if (event.button == 0) {

         console.log("鼠标左键!")

     }else if (event.button == 2){

         console.log("鼠标右键!");

     }else if(event.button == 1){

         console.log("鼠标滚轮!");

     }
}
  1. 鼠标移动事件 onmousemove
  2. 鼠标抬起时间 onmouseup

ondragstart/ondrop/ondragover

PC端: ondragstart/ondrop/ondragover
手机端: touchstart/touchmove/touchend

  • 传统方式

    • PC:mousedonw``mousemove``mouseup

    • 移动端:touchstart``touchmove``touchend

    • 原理:通过计算坐标的方式来实现元素的可视化移动。

  • HTML5原生拖拽

    • dragstart``drag``dragenter``dragover``dragleave``drop``dragend

    • 原理:通过对被拖动元素和拖动目标元素进行事件监听,实现拖动效果

  • 区别

    • 传统方式是实现元素的实时移动,HTML5原生拖拽事件是体现元素的拖拽结果,需要确定拖拽的目标区域,如应用于拖拽上传。

  • demo

        <!DOCTYPE html>
        <html lang="en">
    
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <meta http-equiv="X-UA-Compatible" content="ie=edge">
            <title>Document</title>
            <style>
                * {
                    margin: 0;
                    padding: 0;
                }
    
                .tra {
                    width: 70px;
                    height: 70px;
                    position: fixed;
                    background: red;
                }
    
                .drag {
                    width: 80px;
                    height: 80px;
                    background: blueviolet;
                }
    
                #dragTarget {
                    width: 200px;
                    height: 200px;
                    border: 1px solid;
                }
            </style>
        </head>
    
        <body>
            <!-- HTML Draggable -->
            <div class="drag" id="drag" draggable="true"></div>
    
            <div id="dragTarget"></div>
            <!-- 传统的拖拽 -->
            <div id="tra" class="tra">
            </div>
    
    
            <script>
                // 传统的拖拽
                ; (function () {
                    var tra = document.querySelector('#tra');
                    var startPoint = Object.create(null);
                    var isStartMove = false;
                    const addUnit = num => num + 'px';
                    tra.addEventListener('mousedown', e => {
                        isStartMove = true;
                        startPoint = {
                            x: e.offsetX,
                            y: e.offsetY,
                        }
                    });
                    window.addEventListener('mousemove', e => {
                        if (!isStartMove) return;
                        tra.style.left = addUnit(e.clientX - startPoint.x);
                        tra.style.top = addUnit(e.clientY - startPoint.y);
                    });
                    window.addEventListener('mouseup', e => {
                        isStartMove = false;
                        startPoint = {
                            x: 0,
                            y: 0,
                        }
                    });
                })();
    
                // HTML5拖拽事件
                ;(function() {
                    var dragEl = document.querySelector('#drag');
                    dragEl.addEventListener('dragstart', e => {
                        e.dataTransfer.setData("Text",e.target.id);
                        e.dataTransfer.effectAllowed = 'copyMove';
                    });
    
                    var dragTargetEl = document.querySelector('#dragTarget');
                    dragTargetEl.addEventListener('dragenter', e => {
                        e.preventDefault();
                    });
    
                    dragTargetEl.addEventListener('dragover', e => {
                        e.preventDefault();
                    });
    
                    dragTargetEl.addEventListener('drop', e => {
                        e.preventDefault();
                        var id = e.dataTransfer.getData('Text');
                        e.target.appendChild(document.getElementById(id));
                    })
                })();
    
    
            </script>
        </body>
    
        </html>
    
Was this page helpful?
0 / 5 - 0 ratings