拖拽操作

应用:

1.拖拽排序
2.拖拽上传
3.拖拽裁剪

拖拽流程

确定可拖拽的内容-->开始拖拽-->拖拽过程-->结束拖拽
draggable dragstart drag(dragenter\dragleave\dragover) drag(dragend)

拖拽知识点

·draggable 状态:true\false\auto(默认值)
默认能被拖拽:
-<img>
-表示图片的<object>
-<a>
-选中的文本

<ol>
      <li draggable="true">Apple</li>
      <li draggable="true">Pear</li>
      <li draggable="true">Orange</li>
</ol>

DragEvent
-dataTransfer.dropEffect(none\move\copy\link):
表示拖拽的内容当前位置可被放置的效果;
在dragstart\drag\dragexit\dragleave事件中值为none;
在drop,dragend事件中对应当前的dropEffect;
在其他事件如dragenter\dragover取决于effectAllowed

-dataTransfer.effectAllowed(none\copy\copyLink\copyMove\link\linkMove\move\all\uninitialized):
表示拖拽的内容被允许的操作效果;
只能在dragstart事件中设置
用于dragenter和dragover事件中初始化dropEffect

-dataTransfer.setDragImage(element,x,y):
只能在dragstart事件中设置

拖拽数据操作
-dataTransfer.types
-dataTransfer.items
-dataTransfer.files
-dataTransfer.setData(format,data)
-dataTransfer.getData(format)
-dataTransfer.clearData([format])

案例

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
    <p>which fruit do you like</p>
    <ol ondragstart="dragStartHandler(event)" ondragend="dragEndHandler(event)"  style="background-color: rgb(255, 255, 240);border: 1px solid #bbb;">
        <li draggable="true" data-value="Apples">Apples</li>
        <li draggable="true" data-value="Oranges">Oranges</li>
        <li draggable="true" data-value="Pears">Pears</li>
    </ol>
    
    <p>Drop your favorite fruits belows:</p>

    <ol ondrop="dropHandler(event)" ondragover="dragOverHandler(event)" style="background-color: rgb(255, 255, 240);border: 1px solid #bbb;height: 100px;">
    </ol>
    

<script type="text/javascript">
let imgs = {
    Apples: getImage('./apple.jpg'),
    Oranges:getImage('./orange.jpg'),
    Pears:getImage('./pear.jpg')
};
function getImage(src) {
    let img = new Image();
    img.src = src;
    return img;
}

function dragStartHandler(event) {
    if (event.target instanceof HTMLLIElement) {
        let value = event.target.dataset.value;
        event.dataTransfer.setData(
            'text/fruit',value
        );
        event.dataTransfer.effectAllowed = 'move';
        event.dataTransfer.setDragImage(imgs[value],25,0);
    } else {
        event.preventDefault();
    }
}

function dragOverHandler(event) {
    event.preventDefault();
}//拖拽过程需要去掉默认的,要不只能对textarea input输入框产生效果

function dragEndHandler(event) {
    if (event.dataTransfer.dropEffect === 'move') {
        event.target.parentNode.removeChild(event.target);
    }
}

function dropHandler(event) {
    let li = document.createElement('li');
    li.textContent = event.dataTransfer.getData('text/fruit');
    event.target.appendChild(li);
}
</script>
</body>
</html>

兼容性

MouseEvent模拟

image.png

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 拖拽,拖放事件可以通过拖拽实现数据传递,达到良好的交互效果,如:从操作系统拖拽文件实现文件选择,拖拽实现元素布局的...
    ConRon阅读 5,630评论 0 2
  • 系列文章自定义表单(一)--拖拽(JS版本)自定义表单(二)--拖拽(HTML版本)自定义表单(完)--(html...
    会打代码的扫地王大爷阅读 8,894评论 0 6
  • dragenter当外界有一些拖拽的东西进入到元素区域时触发事件 dragenter拖拽离开事件 dragover...
    angelwgh阅读 2,662评论 0 0
  •   HTML5 规范了很多新 HTML 标记。为了配合这些标记的变化,HTML5 规范也用显著篇幅定义了很多 Ja...
    霜天晓阅读 3,961评论 0 1
  • 现在每天需要看很多学校,收集更多的院校信息。 这种感觉并不陌生,为了一个特定的目标,寻找更多的可能,然后每次努力都...
    颜贵人阅读 1,651评论 0 3