首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【HTML5】逐步分析如何实现拖放功能

,那么我们来了解一下 (1)被拖动元素的事件 被拖动元素所支持的事件如下表所示 事件 含义 dragstart 准备拖动被拖动元素时触发 drag 拖动的过程中触发(频繁触发) dragend 拖动结束时触发...(2)目标元素的事件 在实现拖放功能的过程中,目标元素上的事件有如下三个 事件 含义 dragenter 被拖放元素进入目标元素时触发 dragover 被拖放元素在目标元素内时触发(频繁触发) dragleave...被拖动元素离开目标元素时触发 drop 当被拖动元素被放到了目标元素中时触发 这里我要详细讲解一下这三个事件的触发规则: dragenter事件与 mouseover 事件类似,那怎样才算被拖放元素进入目标元素呢...,除非拖放事件结束或者被拖放元素离开目标元素 dragleave事件 的其触发条件正好与 dragenter 事件相反,它是当被拖放元素离开目标元素时触发,经过测试,离开目标元素的条件是:被拖放元素一半以上的面积离开目标元素...值得注意的是,在我们没有对 drop事件 做处理之前,将被拖放元素拖动到目标元素中时,鼠标样式会变成禁止的样式,如图 ? 而当我们设置元素为可放置了以后,鼠标样式是这样的。如图 ?

1.5K10

拖拽牛逼,轻松实现一个自由拖拽的组件

在揭秘页面设计器时,我们重点分享了顺序排列布局的组件拖动方式,那篇文章[2]的评论中,有小伙伴问到自由布局的实现,那么我们在这篇文章中来分享一下自由布局拖动的实现原理,实现一个设计器组件自由拖动的最简demo...: dragenter:拖拽元素到目标上时触发 dragover:拖动元素在目标元素中,持续触发 dragleave:离开目标元素时触发 drop:拖放元素到了目标元素中松开鼠标时触发 拖动放置行为 在拖动事件中...,上文中我们讲到,拖动的元素以及目标元素可以设置一系列的事件,那么我们就可以在组件列表渲染时,为每个组件设置一下 dragstart 事件,在该事件中我们需要做如下处理: 设置拖动元素的放置行为为移动,...那拖动到画布中的组件又是如何实现通过拖动灵活的移动位置的呢?...同样,我们可以将画布中的组件添加mousedown事件,在事件中我们添加mousemove事件的监听,当画布中的组件进行移动时,我们实时的将该被移动元素所对应的元数据坐标进行更新。下面是代码的实现。

1.9K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【JS】1724- 重学 JavaScript API - Drag and Drop API

    如何使用 使用拖放 API 主要包括以下 3 个步骤: 「定义可拖拽的(draggable)元素」:将需要拖动的元素标记为可拖拽,并指定相应的事件处理逻辑。...当拖动 drag-source 元素时,使用 event.dataTransfer.setData() 方法设置了拖动数据,而放置目标元素时,执行 drop事件监听的回调方法,实现被拖动的元素添加到可放置元素底下...当拖动图片时,我们使用 dragstart 事件将图片的 ID 存储在 dataTransfer 对象中。...在放置目标容器上,我们使用 dragover 事件阻止默认行为并添加一些过渡样式,使用 dragleave 事件移除过渡样式,使用 drop 事件在放置目标容器中追加拖动的图片元素。...当拖动任务卡片时: 使用 dragstart 事件将任务名称存储在 dataTransfer 对象中; 使用 dragover 事件阻止默认行为并添加视觉反馈; 使用 dragleave 事件移除视觉反馈

    29820

    低代码设计器的自由布局拖动的实现原理

    如何使元素支持拖动 实现组件的自由拖动的核心就是 html5 中新添加的全局属性 draggable 属性,该属性规定了元素是否可进行拖动。...: dragenter:拖拽元素到目标上时触发 dragover:拖动元素在目标元素中,持续触发 dragleave:离开目标元素时触发 drop:拖放元素到了目标元素中松开鼠标时触发 拖动放置行为 在拖动事件中...,上文中我们讲到,拖动的元素以及目标元素可以设置一系列的事件,那么我们就可以在组件列表渲染时,为每个组件设置一下 dragstart 事件,在该事件中我们需要做如下处理: 设置拖动元素的放置行为为移动,...那拖动到画布中的组件又是如何实现通过拖动灵活的移动位置的呢?...同样,我们可以将画布中的组件添加mousedown事件,在事件中我们添加mousemove事件的监听,当画布中的组件进行移动时,我们实时的将该被移动元素所对应的元数据坐标进行更新。下面是代码的实现。

    4.5K30

    手写原生代码专题 | 图片拖拽效果(一)

    本系列文章小编将和大家一起从最基础的原生代码实践,做一些小的项目,从最基础的实践中复习和掌握前端的一些基础知识,只有熟练了才能理解前端的本质,学习前端新的知识和框架时就能更快的上手。...三、拖拽相关知识复习 在练习前,我们先复习下和拖拽相关的几个API事件,在某个元素被拖动时,会按照顺序触发以下事件: dragstart(按住鼠标不放,刚开始拖动元素时,就会触发 dragstart 事件...) drag(dragstart 事件触发后,只要元素还在被拖动时,就会持续触发 drag 事件,类似 mouseover,随着鼠标移动而不断触发) dragend(当拖动元素的动作停止时即松开鼠标时,...,如果被拖动元素,还在目标元素内持续拖动,会持续触发此事件) dragleave 或 drop(当被拖动的元素,放置在目标之外,dragover事件就会立即停止,触发dragleave事件;如果被拖动元素被放到了目标上...,想必大家都熟悉了拖拽相关的事件和如何应用,有了这些基础后,我们就有了写出更复杂拖拽应用的基础。

    2.2K30

    vue-grid-layout数据可视化图表面板优化过程所遇问题汇总

    还有有些实现还使用了Bus 透传 drag/dragend 事件,其实这里可能没有理解 :针对对象事件名称说明被拖动的元素dragstart在元素开始被拖动时候触发drag在元素被拖动时反复触发dragend...在拖动操作完成时触发目的地对象dragenter当被拖动元素进入目的地元素所占据的屏幕空间时触发dragover当被拖动元素在目的地元素内时触发dragleave当被拖动元素没有放下就离开目的地元素时触发整个拖拽事件触发的顺序如下...()返回的数据为空,以及在dragover时dataTransfer中的types不为0了,因为在除了dragstart,drop以外的事件,包括dragover,dragenter,dragleave...所以在dragover,dragenter,dragleave中做得更多的应该是对数据的处理,而不是应用效果。...drop事件不触发:在发现页面拖动过程中,drop事件不触发,重新了看了下《drag事件详解:html5鼠标拖动排序及resize实现方案分析及实践》drop:源对象拖放到目标对象中,目标对象完全接受被拖拽对象时触发

    1.6K30

    drag事件详解:html5鼠标拖动排序及resize实现方案分析及实践

    ,被拖拽对象离开目标对象时触发拖动事件列表每一个可拖动的元素,在拖动过程中,都会经历三个过程,拖动开始-->拖动过程中--> 拖动结束在拖动目标上触发事件 (源元素-被拖动的元素):ondragstart...- 在元素开始被拖动时候触发——拖动什么ondrag - 在元素被拖动时反复触发ondragend - 在拖动操作完成时触发释放目标时触发的事件(目的地对象):ondragenter - 当被鼠标拖动的对象进入其容器范围内时触发此事件...dragover当被拖动元素在目的地元素内时触发dragleave当被拖动元素没有放下就离开目的地元素时触发整个拖拽事件触发的顺序如下:dragstart-> drag -> dragenter ->...dragover -> dragleave -> drop ->dragend目标对象事件:drop:源对象拖放到目标对象中,目标对象完全接受被拖拽对象时触发,可理解为在目标对象内松手时触发。...()返回的数据为空,以及在dragover时dataTransfer中的types不为0了,因为在除了dragstart,drop以外的事件,包括dragover,dragenter,dragleave

    6.4K21

    HTML5 进阶系列:拖放 API 实现拖放排序

    接下来认识一下这个对象的方法和属性,来了解它是如何传递数据的。 setData() 该方法向 dataTransfer 对象中存入数据。...这时就要监听 dragleave 事件,当过程对象是最后一个元素时,源对象离开了过程对象,这时就把源对象添加到最后去。...:drag-demo 兼容 主要是在IE中的兼容不太好,不过至少在IE10中能兼容上面的拖动排序。...而且在我简单的试验中发现,就是在 IE 中元素不设置 height 的时候,不会触发 dragleave 事件。 更重要的一点是在 ios 和安卓上,完全不兼容。...插件地址:ios-html5-drag-drop-shim 只需要在原有的代码中引入该插件,即可在移动端上实现拖动了。

    1.9K70

    HTML5 进阶系列:拖放 API 实现拖放排序

    接下来认识一下这个对象的方法和属性,来了解它是如何传递数据的。 setData() 该方法向 dataTransfer 对象中存入数据。...这时就要监听 dragleave 事件,当过程对象是最后一个元素时,源对象离开了过程对象,这时就把源对象添加到最后去。...:drag-demo 兼容 主要是在IE中的兼容不太好,不过至少在IE10中能兼容上面的拖动排序。...而且在我简单的试验中发现,就是在 IE 中元素不设置 height 的时候,不会触发 dragleave 事件。 更重要的一点是在 ios 和安卓上,完全不兼容。...插件地址:ios-html5-drag-drop-shim 只需要在原有的代码中引入该插件,即可在移动端上实现拖动了。

    1.6K10

    addEventListener() 方法

    scroll 当文档被滚动时发生的事件。 unload 用户退出页面。...该事件在页面即将开始打印时触发 拖动事件 drag 该事件在元素正在拖动时触发 dragend 该事件在用户完成元素的拖动时触发 dragenter 该事件在拖动的元素进入放置目标时触发 dragleave...该事件在拖动元素离开放置目标时触发 dragover 该事件在拖动元素在放置目标上时触发 dragstart 该事件在用户开始拖动元素时触发 drop 该事件在拖动元素放置在目标区域时触发 多媒体...suspend 事件在浏览器读取媒体数据中止时触发。 timeupdate 事件在当前的播放位置发送改变时触发。 volumechange 事件在音量发生改变时触发。...offline 该事件在浏览器开始离线工作时触发。 popstate 该事件在窗口的浏览历史(history 对象)发生改变时触发。

    95410

    我被一个拖拽难住了?

    拖拽的Bug 拖拽的问题表现有两个: 一、当有一个组件时,拖拽到内容展示区,正常展示。当有多个组件时,直接展示组件列表中的最后一个。 二、拖拽时会在拖拽的组件上显示一个禁用标识。...第一个问题产生的原因: drop事件写在拖拽组件中,左侧可选组件都是基于这个拖拽组件的,只要drop事件触发,理论上所有的组件都会触发这个事件,最终在全局的状态中只会缓存最后一个组件。...最终的处理方案变成,在拖动某个组件时,全局中增加一个标识标识正在拖动的是哪个组件,然后在放置组件后清除这个缓存。...: 因为当拖动元素经过document时,document对象默认阻止了拖动事件,而其他HTML组件也位于document对象内,因此它们也不能接受“放”。...dragenter,dragover,dragleave,drop在目标放置区域触发,也就是你需要将拖动的元素放到哪个区域,这些个方法就在那个区域触发。

    61810

    原生JS快速实现拖放(drag and drop)效果

    元素被拖动的过程中增加边框等效果;2. 当元素被拖动到容器上方时,容器也应增加样式表明容器可以接收一个被拖拽的元素。...元素被拖动到容器上方时容器的状态,增加灰色虚线border。...当draggable元素被拖动时,原来容器中的draggable元素并不会消失,需要我们手动将其隐藏(class设置为invisible),如果同步操作会立马触发dragend事件导致拖动效果消失,所以在...setTimeout的回调中异步设置可确保拖动操作开始后再隐藏draggable元素;2....在dragEnter和dragOver方法中我们需要通过preventDefault来取消事件以表明容器是一个合法的droppable元素,不然容器的drop事件将无法触发,接下来的操作也将无法进行,详细解释请参考

    3.6K51

    【实战技巧】VUE3.0实现简易的可拖放列表排序

    拖拽事件 可用的拖拽事件一共有七个,其中三个是用于拖拽元素的 dragstart 在元素开始被拖动时触发 dragend 在拖动操作完成时触发 drag 在元素被拖动时触发 四个是用于释放区域的 dragenter...当被拖动元素进入到释放区所占据的屏幕空间时触发 dragover 当被拖动元素在释放区内移动时触发 dragleave 当被拖动元素没有放下就离开释放区时触发 drop 当被拖动元素在释放区里放下时触发步骤...首先给被拖放的元素添加 draggable 属性并添加 dragstart 事件处理函数 定义拖放数据,本例定义的是拖拽元素的id 定义一个释放区域,添加 drop 和 dragover 事件处理函数...const handleDragleave = (ev) => { console.log(' ~ dragleave 触发啦'); } // 当被拖动元素在释放区里放下时触发...在dragstart中记录下旧的索引 在dragover中记录下新的索引,每次经过一个都会更新 在drop事件中处理数组,删掉旧的元素,在目标索引添加新的元素 //简略后的伪代码 详情请查看源码 <div

    2.1K40

    前端拾零02—H5拖放总结

    目标元素 3.1 目标元素监听事件 ondragenter: 拖放元素进入目标元素时触发事件,作用于目标元素 ondragover: 拖放元素在目标元素上移动时触发事件,作用于目标元素 ondrop:...拖放元素在目标元素上放置时触发事件,作用于目标元素 ondragleave: 拖放元素离开目标元素时触发事件,作用于目标元素 3.2 demo 中拖东西进来,尤其是图片的时候,默认的动作是显示这个图片或是相关信息,并不是真的执行drop。此时需要用用document的ondragover事件覆盖 5....Event.dataTransfer Event.dataTransfer: 拖放对象数据传递媒介,保存在dataTransfer对象中的数据只能在drop事件处理程序中读取 Event.dataTransfer.dropEffect...事件处理程序中设置 (1) uninitialized: 不指定 (2) none: 不允许所有行为 (3) copy: 只允许值为"copy"的dropEffect (4) link: 只允许值为"link

    4.2K730

    关于VUE3+TS利用递归组件完成TreeList的设计与实现

    ,您啊可能就工资越高) 1、插件如何注册 2、插件需要设计那些事件 3、插件需要传入那些值,从而实现更大的灵活性 4、插件能包揽那些功能 我们一个个来解析 插件如何注册 对于vue 来说,插件套路都一样..., 来控制内容, 从而实现我们的功能,这个时候这些个拖动事件,必不可少 本次用到的事件如下 1、dragstart 当用户开始拖动一个元素或者一个选择文本触发 2、dragenter 当拖动的元素或被选择的文本进入有效的放置目标时触发...3、dragover 当元素或者选择的文本被拖拽到一个有效的放置目标上时触发 4、dragleave当一个被拖动的元素或者被选择的文本离开一个有效的拖放目标时触发 5、drop 当一个元素或是选中的文字被拖拽释放到一个有效的释放目标位置时触发...() return true } dragEnter和dragLeave dragEnter 当拖动的元素或被选择的文本进入有效的放置目标时触发 dragleave当一个被拖动的元素或者被选择的文本离开一个有效的拖放目标时触发...由于我们相当于是拖拽到文件夹中, 在拖拽中做响应的判断,为了拿到正确的组件数据 举个例子,我移动到一个文件中,那么我就需要向上寻找,找到上级文件夹,再去抛出事件 所以我们有了emit('setDragFolder

    3.2K20

    前端拾零02—H5原生拖放总结 【原创】

    目标元素 3.1 目标元素监听事件 ondragenter: 拖放元素进入目标元素时触发事件,作用于目标元素 ondragover: 拖放元素在目标元素上移动时触发事件,作用于目标元素 ondrop:...拖放元素在目标元素上放置时触发事件,作用于目标元素 ondragleave: 拖放元素离开目标元素时触发事件,作用于目标元素 3.2 demo 中拖东西进来,尤其是图片的时候,默认的动作是显示这个图片或是相关信息,并不是真的执行drop。此时需要用用document的ondragover事件覆盖 5....Event.dataTransfer Event.dataTransfer: 拖放对象数据传递媒介,保存在dataTransfer对象中的数据只能在drop事件处理程序中读取 Event.dataTransfer.dropEffect...) copy: 复制拖放元素 (4) link: 放置目标自动打开拖动元素(拖放元素必须是有URL的链接) Event.dataTransfer.effectAllowed: 指定目标元素允许的视觉效果

    1.9K20

    html5鼠标拖动排序及resize实现方案分析及实践

    源对象事件: dragstart:源对象开始拖放,开始移动时事件触发 drag:源对象拖放过程中,移动被拖拽对象时触发 dragend:源对象拖放结束,整个拖放操作结束时触发。...过程对象事件: dragenter:源对象进入过程对象范围内,被拖拽对象进入过程对象时被触发 dragover:源对象在过程对象范围内移动,被拖拽对象在过程对象内移动时触发 dragleave:源对象离开过程对象的范围...,被拖拽对象离开目标对象时触发 目标对象事件: drop:源对象拖放到目标对象中,目标对象完全接受被拖拽对象时触发,可理解为在目标对象内松手时触发。...text/uri-list 注:如果给定类型的数据不存在,则将其添加到拖动数据存储的末尾,使得dataTransfer.types列表中的最后一个项目将是新类型。...应该在dragstart事件中设置此属性,以便为拖动源设置所需的拖动效果。

    3.1K10

    理论 | HTML5 进阶系列:拖放 API 实现拖放排序

    想要拖放某个元素,必须设置该元素的 draggable 属性为 true,当该属性为 false 时,将不允许拖放。...dataTransfer 对象 在所有拖放事件中提供了一个数据传递对象 dataTransfer,用于在源对象和目标对象间传递数据。接下来认识一下这个对象的方法和属性,来了解它是如何传递数据的。...这时就要监听 dragleave 事件,当过程对象是最后一个元素时,源对象离开了过程对象,这时就把源对象添加到最后去。...主要代码如下: 完整的代码地址:https://github.com/lin-xin/blog/tree/master/drag-demo 兼容 主要是在IE中的兼容不太好,不过至少在IE10中能兼容上面的拖动排序...而且在我简单的试验中发现,就是在 IE 中元素不设置 height 的时候,不会触发 dragleave 事件。 更重要的一点是在 ios 和安卓上,完全不兼容。

    1.3K31

    js原生拖拽的两种方法

    ,目标元素会触发以下事件 dragenter dragover dragleave drop 拖拽元素到目标上,就会触发dragenter事件(类比mouseover) 当拖动元素在目标元素中,就会持续触发...dragover事件 离开目标元素,触发dragleave事件(类比mouseout) 若拖放元素到了目标元素中(在目标元素中松开鼠标),就会触发drop事件而不会触发dragleave事件...事件中取消默认事件就可以解决问题 数据交换 数据交换的对象就是事件对象的属性dataTransfer dataTransfer的两个核心方法是setData()和getData() setData...dropEffect和effectAllowed dropEffect dropEffect属性值为字符串,表示被拖动元素可以执行哪一种放置行为 要使用这个属性,必须在dragenter事件处理函数中设置...属性值也是字符串,表示允许拖动元素哪种dropEffect 要使用这个属性,必须在dragst事件处理函数中设置 uninitialized 没有设置任何拖放行为 none 不能由任何行为 copy

    4.1K30
    领券