10分钟掌握HTML拖放API!让你的网页元素瞬间拥有拖拽功能,轻松提升用户体验!

馒头老爸
• 阅读 640

在日常开发中,拖拽功能无疑是一个常见的需求场景。为了更好地满足这一需求,HTML5提供了一套便捷的拖放API。这些API不仅能够帮助开发者轻松实现拖拽效果,还可以提高排查拖拽问题的效率,甚至可以让我们更加灵活地自定义拖拽场景和设计能力。

要想完全掌握拖放API的使用及常见问题,本文将从三个步骤出发,带你深入了解并掌握这一技术。

首先,我们将通过案例演示来直观地展示拖拽功能在实际应用中的表现,帮助你快速理解拖拽的基本概念和操作流程。其次,我们将详细解析拖放流程并介绍相关的API,包括拖放事件的类型、事件处理函数以及关键属性的使用方法等。最后,我们将通过案例实现和讲解来巩固所学知识,让你能够亲自动手实践,并将所学知识应用到实际项目中。

通过本文的学习,你将能够轻松掌握HTML5拖放API的使用技巧,提高拖拽功能的开发效率,为你的项目增色添彩。

一、案例演示

实现一个可拖放自定义课程表,将左侧的科目拖拽到右侧的课程表中,支持增加、修改、删除、移动功能。

10分钟掌握HTML拖放API!让你的网页元素瞬间拥有拖拽功能,轻松提升用户体验!

二、API介绍

1. 拖放过程

整个拖放过程中,存在两个关键元素:拖拽元素、放置元素 拖拽元素:被拖拽的元素

  • ondrag:元素被拖拽时触发,从开始拖拽到拖拽结束前整个过程会一直持续的触发 ◦ondragstart:元素被拖拽开始时触发
  • ondrop:拖拽元素被放置到放置元素内时触发,如果没有在放置元素内松手,则不会触发

放置元素:

  • ondragenter:有拖拽元素进入时触发
  • ondragover:有拖拽元素在该元素上时触发,在离开前会持续触发
  • ondragleave:拖拽元素离开时触发
  • ondragend:拖拽元素放置时触发

10分钟掌握HTML拖放API!让你的网页元素瞬间拥有拖拽功能,轻松提升用户体验!

2. 可拖拽元素

在HTML中,文本、图片和链接是默认可以拖放的元素。 其他元素都是默认不可拖动的,如果需要让其他非默认可拖动的HTML元素变得可拖动,比如<div><span>等,你需要明确地为这些元素设置 draggable="true" 属性。这样,这些元素就能够接受拖放操作了。

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

3. 放置元素

所有HTML元素在默认情况下都不接受拖拽元素的放置,除非通过特定的事件处理来允许。 要使一个HTML元素能够接受被拖动的元素,需要对这个元素进行一些特定的设置和事件绑定:

  • dragover事件:当被拖动的元素在另一个元素上方移动时,会触发dragover事件。为了接受拖放,必须在- -
  • dragover事件处理器中调用event.preventDefault()方法,这会阻止浏览器的默认行为,也就是不接受任何被拖放的元素。
container.ondragover  = (e) => {
    e.preventDefault();
}

4. DataTransfer

DataTransfer对象用于保存拖动并放下(drag and drop)过程中的数据。它可以保存一项或多项数据,这些数据项可以是一种或者多种数据类型

  • dropEffect:获取当前选定的拖放操作类型,或设置为一个新的类型。值必须为 none、copy、link、move
  • effectAllowed:提供所有可用的操作类型。值必须为none、copy、copyLink、copyMove、link、copyMove、move、all、uninitialized
  • files:包含数据传输中的所有本地文件列表
  • items(只读):提供一个包含所有拖动数据列表的DataTransferItemList对象
  • types(只读):一个提供 dragstart 事件中设置的格式的 strings 数组

三、案例实现

1.把左侧科目设置为可拖拽

<div class="content">
    <div class="left"  data-drop="move">
        <div draggable="true" style="background:rgb(26, 231, 156)">语文</div>
        <div draggable="true" style="background:rgb(107, 219, 15)">数学</div>
        <div draggable="true" style="background:rgb(208, 133, 13)">英语</div>
        <div draggable="true" style="background:rgb(30, 98, 246)">物理</div>
        <div draggable="true" style="background:rgb(210, 40, 113)">化学</div>
        <div draggable="true" style="background:rgb(210, 224, 26)">生物</div>
    </div>
    <div class="right">
        <table>
            <thead>
                <tr>
                    <td>星期一</td>
                    <td>星期二</td>
                    <td>星期三</td>
                    <td>星期四</td>
                    <td>星期五</td>
                </tr>
            </thead>
            <body>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
            </body>
        </table>
    </div>
</div>

2. 绑定事件

这里采用事件委托的方式,对整个父元素进行事件绑定

const container = document.querySelector('.content');
ondragover:让整个容器内的所有元素都可以接受拖拽元素,这里只需要阻止默认行为就可以
container.ondragover  = (e) => {
    e.preventDefault();
}

ondragstart:拖拽开始时,需要做以下处理

  • 拖拽元素原来的位置样式有些变化,这里就是整体颜色变得更透明
  • 从左侧拖到右侧,为新增,鼠标显示新增的手势。右侧拖到左侧为移除,显示普通手势。(拖拽过程中默认为新增手势)
  • 保存当前拖拽元素,后续操作需要用到

10分钟掌握HTML拖放API!让你的网页元素瞬间拥有拖拽功能,轻松提升用户体验!

通过data属性给拖拽元素添加标识,标识此元素是新增还是移除,新增设置为 data-effect="copy"

<div class="left"  data-drop="move">
    <div data-effect="copy" draggable="true" style="background:rgb(26, 231, 156)">语文</div>
    <div data-effect="copy" draggable="true" style="background:rgb(107, 219, 15)">数学</div>
    <div data-effect="copy" draggable="true" style="background:rgb(208, 133, 13)">英语</div>
    <div data-effect="copy" draggable="true" style="background:rgb(30, 98, 246)">物理</div>
    <div data-effect="copy" draggable="true" style="background:rgb(210, 40, 113)">化学</div>
    <div data-effect="copy" draggable="true" style="background:rgb(210, 224, 26)">生物</div>
</div>
let source = '';
container.ondragstart = (e) => {
    // 如果是移除操作,则设置手势为移除
    if (e.target.dataset.effect === "move") {
        e.dataTransfer.effectAllowed = "move";
    }
    source = e.target;
    // 设置拖拽元素的样式
    e.target.style.opacity = '0.2'
}

ondragenter:进入放置元素,需要做以下处理

  • 判断该元素以及该元素的所有上级元素是否可以接收拖拽元素。哪些元素可以接收,也通过data属性进行标识 data-drop="copy"
  • 如果可以接收拖拽元素,需要设置其样式用于标识
<tr>
    <td data-drop="copy"></td>
    <td data-drop="copy"></td>
    <td data-drop="copy"></td>
    <td data-drop="copy"></td>
    <td data-drop="copy"></td>
</tr>
container.ondragenter  = (e) => {
    const dropNode = getDropNode(e.target);
    // 判断放置元素是否可以接收拖拽元素,当 data-effect 和 data-drop 的值相等时,说明可以
    if (dropNode && dropNode.dataset.drop === source.dataset.effect) {
        // 给放置元素添加样式
        dropNode.classList.add('hover-background');
    }
}

// 获取最近的可接受拖拽元素的父节点
function getDropNode(node) {
    while (node) {
        //  判断元素是否设置了data-drop属性,如果设置了,说明此元素是一个放置元素
        if (node.dataset && node.dataset.drop) {
            return node;
        }
        node = node.parentNode;
    }
    return node;
}

此时会发现,所有经过的放置元素背景色都发生了变化 10分钟掌握HTML拖放API!让你的网页元素瞬间拥有拖拽功能,轻松提升用户体验!

每次在进入元素时,清除所有的背景色。

container.ondragenter  = (e) => {
    const dropNode = getDropNode(e.target);
    // 判断放置元素是否可以接收拖拽元素,当 data-effect 和 data-drop 的值相等时,说明可以
    if (dropNode && dropNode.dataset.drop === source.dataset.effect) {
        // 给放置元素添加样式
        dropNode.classList.add('hover-background');
    }
}

function clearHoverClass() {
    document.querySelectorAll('.hover-background').forEach(ele => ele.classList.remove("hover-background"));
}

ondrop:松手放置时 对放置元素的处理

  • 清除hover时的背景样式
  • 【新增课程】清除放置元素内的内容;克隆拖拽元素;设置克隆后的元素data-effect属性只为move;恢复拖拽元素本身的样式;添加到放置元素中
  • 【移除课程】删除掉拖拽元素

对放置元素的处理

  • 恢复元素样式
// 对放置元素触发的事件
container.ondrop = (e) => {
    // 清除hover时的样式
    clearHoverClass();
    // 获取最近的放置节点
    const dropNode = getDropNode(e.target);
    if (dropNode && dropNode.dataset.drop === source.dataset.effect) {
        // 如果是新增课程
        if (dropNode.dataset.drop === "copy") {
            dropNode.innerHTML = "";
            const cloned = source.cloneNode(true);
            cloned.dataset.effect = "move";
            cloned.style.opacity = "1";
            dropNode.appendChild(cloned);
        // 移除课程
        } else {
            source.remove();
        }
    }
}

// 对拖拽元素触发的事件
container.ondragend = (e) => {
    e.target.style.opacity = "1";
}

最后,可以到我的个人网站(www.dengzhanyong.com)的资源中心中下载本地案例的完整源码。 欢迎关注我的公众号,不错过每一篇推送 10分钟掌握HTML拖放API!让你的网页元素瞬间拥有拖拽功能,轻松提升用户体验!

点赞
收藏
评论区
推荐文章
阮小五 阮小五
1年前
BetterSnapTool for Mac 帮你整理窗口,提升效率
每个人都有自己用着顺手的窗口布局。BetterSnapToolforMac可以通过拖放、点按或快捷键,迅速把窗口调整到你喜欢的位置,助你提升效率。推荐理由:《BetterSnapTool》调整窗口位置的方式很灵活。你可以把窗口拖放到屏幕顶部、左侧或右侧边缘
小尉迟 小尉迟
1年前
BetterSnapTool for Mac 帮你整理窗口,提升效率
每个人都有自己用着顺手的窗口布局。BetterSnapToolforMac可以通过拖放、点按或快捷键,迅速把窗口调整到你喜欢的位置,助你提升效率。推荐理由:《BetterSnapTool》调整窗口位置的方式很灵活。你可以把窗口拖放到屏幕顶部、左侧或右侧边缘
kenx kenx
1年前
掌握这些GitHub搜索技巧,你的开发效率将翻倍!
作为开发it行业一员,学习借鉴他人项目是很有必要的,所以我们一般都会从github或者Gitee上面去参考借鉴他人的项目来学习增加自己的项目经验但是一般我还是在github上看项目比较多,毕竟人家实力项目量摆在那里,但是国内访问github有时候比较慢,或
Python进阶者 Python进阶者
2年前
HTML页面基本结构和加载过程
大家好,我是皮皮。前言对于前端来说,HTML都是最基础的内容。今天,我们来了解一下HTML和网页有什么关系,以及与DOM有什么不同。通过本讲内容,你将掌握浏览器是怎么处理HTML内容的,以及在这个过程中我们可以进行怎样的处理来提升网页的性能,从而提升用户的体验。一、浏览器页面加载过程不知你是否有过这样的体验:当打开某个浏览器的时候,发现一直
Easter79 Easter79
3年前
Swagger从入门到精通
如何编写基于OpenAPI规范的API文档\TOC\前言编写目的本文介绍如何使用Swagger编写API文档。通过阅读本文,你可以:了解swagger是什么掌握使用swagger编写API文档的基本方法涉及范围本文包括对swagger
可莉 可莉
3年前
10 个很实用的 JavaScript 技巧
编程语言通常暗藏着各种技巧,熟练使用这些技巧可以提高开发效率。JavaScript就是一门技巧性很强的语言,掌握常见的语法技巧不但可以加深对语言特性的理解,还可以简化代码,提高编码效率。本文分享10个常用的技巧,希望能成为你的开发工具箱的一部分。1arguments对象转成数组arguments对象是函数内可访问的类数组对象,包含了传给函
绣鸾 绣鸾
1年前
网页设计软件EverWeb for Mac
是一款适用于macOS的网页制作工具,它提供了一系列易于使用的工具和模板,使用户能够轻松地创建专业的网页。EverWeb具有直观的界面和拖放式的设计方法,无需编写代码即可创建网页。此外,它还提供了多种设计工具和功能,如响应式设计、SEO优化、内置的图像库、
铁扇公主 铁扇公主
1年前
专业强大的可视化网页设计工具Blocs最新激活版
Blocs是一款网页设计软件,适用于Mac电脑,专为非技术人员和初学者设计,使他们能够轻松地创建漂亮且功能强大的网页。Blocs的特点包括:用户友好的界面:提供了简单且直观的界面,使用户可以轻松地拖放组件、编辑文本和调整布局。响应式设计:支持响应式设计,可
曼成 曼成
1年前
如何集成验证码短信API到你的应用程序
验证码短信API可以帮助你轻松实现用户验证、密码重置和账户恢复等功能,提高用户体验并增强应用程序的安全性。本文将介绍如何将验证码短信API集成到你的应用程序中,以确保你的用户数据得到保护。
馒头老爸
馒头老爸
Lv1
个人网站:www.dengzhanyong.com 公众号:前端筱园
文章
4
粉丝
0
获赞
1