原生js实现拖拽,但是draggable

645 阅读1分钟

前言

拖拽功能在实际项目中经常遇到,比如拖拽排序、拖拽添加与移除等,所以给大家分享一种使用原生js实现的拖拽方式,这个方式借助的是html5新增的draggable标签属性

源码地址: gitee.com/powerJproud…

项目预览

bandicam 2023-02-19 16-50-54-298_1.gif

draggable介绍

定义:draggable 属性规定元素是否可拖动。

开启draggable

在标签中加入draggable="true"即可开启draggable

<div draggable="true"></div>

draggable的钩子事件

  1. 拖拽时
  • dragstart:开始
  • drag:进行时
  • dragend:结束
  1. 进入区域后
  • dragenter:进入时
  • drageover:进入后
  • dragleave:离开
  • drop:放置

项目实践

搭建页面结构

<body>
    <section class="main">
        <h1>请选择喜欢的头像</h1>
        <div class="container">
            <div class="empty"></div>
        </div>

    </section>

    <section class="patterns">
        <img draggable="true" src="./assets/img/Compendium.jpeg" alt="Compendium">
        <img draggable="true" src="./assets/img/Naruto.jpeg" alt="Naruto">
        <img draggable="true" src="./assets/img/Sasuke.jpeg" alt="Sasuke">
    </section>


    <script src="./index.js"></script>
</body>

添加监听事件

const empty = document.querySelector("div.empty");
const title = document.querySelector("h1");
const patterns = document.querySelector(".patterns");
let imgName;

// 拖拽开始时触发
document.addEventListener("dragstart", (e) => {
  imgName = e.target.alt;
});

// 拖拽进行时触发事件,给内容和容器加上边框
document.addEventListener("drag", (e) => {
  e.target.style.border = "3px dashed red";
  empty.style.border = "3px dashed red";
});
// 选择目标进入放置区域后触发
document.addEventListener("dragenter", (e) => {
  title.innerHTML = imgName;
  title.style.color = "red";
});

// 拖拽结束触发事件,去除内容和容器边框
document.addEventListener("dragend", (e) => {
  e.target.style.border = "none";
  empty.style.border = "none";
  title.innerHTML = "请选择喜欢的头像";
  title.style.color = "black";
});

// 拖拽元素进入目标区域时触发
empty.addEventListener("dragover", (e) => {
  // 判断目标区域内若已有元素则移除
  if (empty.firstChild) {
    empty.removeChild(empty.firstChild);
  }
  e.preventDefault();
});

// 放置触发事件
empty.addEventListener("drop", (e) => {
  // 阻止默认事件
  e.preventDefault();
  // cloneNode作用为克隆元素节点,若直接使用appendChild原有元素节点将消失
  let targetImg = document.querySelector(`img[alt=${imgName}]`).cloneNode(true);
  targetImg.style.width = "150px";
  targetImg.style.height = "150px";
  targetImg.style.border = "none";
  e.target.appendChild(targetImg);
});

结语

本篇文章只是简单实现拖拽功能,项目中更高级的效果可以通过事件进行升级,感谢大家浏览。