H5拖拽效果(一)

2,517 阅读2分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战
上一篇说到,在页面中,拖拽能给用户起到很好的体验效果,也介绍了用JavaScript实现了一种拖拽方法;这次就用更简单的方式来实现拖拽。

拖拽事件

使用JavaScript来实现拖拽实在太麻烦了,或许是大神们看到我等凡夫俗子的辛苦后,决定解救我等,于是出了H5的拖拽功能。实现很简单,只要给目标物体加上draggable="true",这个物体就可以实现视觉上的拖拽效果;draggable是接受布尔值,只能传进true或者false;如下列代码,即可实现div的拖拽效果。

<div
    draggable="true">
    <span>子元素</span>
 </div>

拖拽,不仅仅是要视觉效果,我们还需要数据处理,这时,大神们就提供了一些事件,在拖拽的过程中,会在某些阶段给予某个事件,让我们可以在某些特定的阶段来将数据做相应的处理。有如下一些事件:

  1. dragstart:鼠标点击被拖动物体并开始拖动时触发
  2. drag:在dragstart事件触发后就开始触发这个事件,并是在移动的时候持续触发,大概几百毫秒就触发一次
  3. dragover:被拖动的物体移动到一个有效的目标物体时触发
  4. dragenter:被拖动物体进入一个有效的放置目标时触发,只会在进去的时候触发并只有一次,进去一次就触发一次
  5. dragleave:被拖动物体离开一个有效的目标元素时触发
  6. drog:被拖拽物体移动到有效的放置目标并且被释放时,就立马触发事件

使用方式

  <div id='app'>
    <div id="drag"
      draggable="true" 
      @dragstart="dragstart"
    ></div>
    <div id="drop"
      @dragover="dragover"
      @dragenter="dragenter"
      @dragleave="dragleave"
      @drop="drop"
    >
    </div>
  </div> 
new Vue({
  el: "#app",
  data: {},
  methods: {
    dragstart(event) {
      console.log('dragstart')
    },
    dragover(event) {
      event.preventDefault()
      console.log('dragover')
    },
    dragenter(event) {
      console.log('dragenter')
    },
    dragleave(event) {
      console.log('dragleave')
    },
    drop(event) {
      console.log('drop')
    },
  }
})

上面的代码就是一个简单的视觉拖动效果,没有任何数据的处理;里面有两个元素drag和drop;当我们点击drag并开始移动鼠标时,就立马触发dragstart事件打印'dragstart';当我们的鼠标移动进入drop时,就立马触发了dragenter事件,然后在drop里面移动鼠标就一直触发dragover,一直打印着'dragover',直到松开鼠标将数据放到drop里,触发drop事件就结束了;或者,不松开鼠标,直接将鼠标移动出来,就会触发dragleave事件。
这里有个需要注意的,就是要在dragover事件里面阻止默认事件,这样drop才能变成有效的目标,鼠标的样式才会变成加号。
不能在dragover事件中传递消息,因为dragover事件的作用对象是目标区域,即dragover中的DragEvent是以目标放区身份施加的,故而不会传递到drop中。