使用原生HTML的drag实现元素的拖拽

8,832次阅读
没有评论

共计 1660 个字符,预计需要花费 5 分钟才能阅读完成。

使用原生 HTML 的 drag 实现元素的拖拽

HTML 拖放 Drag and Drop)接口使应用程序能够在浏览器中使用拖放功能。例如,用户可使用鼠标选择可拖拽(draggable)元素,将元素拖拽到可放置(droppable)元素,并释放鼠标按钮以放置这些元素。拖拽操作期间,会有一个可拖拽元素的半透明快照跟随着鼠标指针。🔍MDN: HTML 拖放 API

1.draggable 属性:设置元素可以拖拽。true 表示元素可以被拖动,false 表示元素不可以被拖动。

注意:像 这样的简写是不允许的。正确的用法是

2.@dragstart:在拖拽开始时,将当前拖拽项的索引存储到 draggedIndex,并设置拖拽光标的效果为 move。更新 draggedIndex 实现拖拽过程中的预览。

3.@dragover.prevent:当拖拽项经过其他项时,通过 splice 方法将当前拖拽项临时移除并插入到新的位置。

4.@drop:当拖拽放置完成时,draggedIndex 被重置,以防止任何临时变化影响最终顺序。

案例代码:
使用原生 HTML 的 drag 实现元素的拖拽

template>
  div class="drag-container">
    div
      v-for="(item, index) in items"
      :key="item.id"
      class="draggable-item"
      draggable="true"
      :class="{selected: index === draggedIndex}"
      @dragstart="onDragStart($event, index)"
      @dragover.prevent="onDragOver(index)"
      @drop="onDrop(index)"
    >
      {{item.name}}
    div>
  div>
template>

script setup>
import { ref } from "vue";


const items = ref([
  { id: 1, name: "项 1" },
  { id: 2, name: "项 2" },
  { id: 3, name: "项 3" },
  { id: 4, name: "项 4" },
]);


const draggedIndex = ref(null);


const onDragStart = (event, index) => {
  draggedIndex.value = index;
  
  event.dataTransfer.effectAllowed = "move";
  console.log(` 开始拖拽: ${items.value[index].name}`);
};


const onDragOver = (index) => {
  if (draggedIndex.value !== null && draggedIndex.value !== index) {
    
    const draggedItem = items.value.splice(draggedIndex.value, 1)[0];
    
    items.value.splice(index, 0, draggedItem);
    
    draggedIndex.value = index;
  }
};


const onDrop = (index) => {
  
  draggedIndex.value = null;
  console.log(` 放置到: ${items.value[index].name}`);
};
script>

style scoped>
.drag-container {
  margin-left: 30px;
  width: 100px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-top: 20px;
}

.draggable-item {
  padding: 10px;
  background-color: #4caf50;
  color: white;
  cursor: grab;
  text-align: center;
}

.selected {
  border: 2px dashed #ff9800;
}
style>

在 vue 中还可以使用第三方库 vuedraggable 来实现拖拽:🔍vue3 使用 vuedraggable 实现拖拽(有过渡)

原文地址: 使用原生 HTML 的 drag 实现元素的拖拽

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-10-30发表,共计1660字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)