【HTML】draggable 属性:解锁网页交互新维度

一、简介

  1. 在Web开发中,用户与内容的交互方式直接影响用户体验的深度。
  2. 在 HTML 中,draggable 是一个全局属性,通过简单配置即可让任意元素实现拖拽功能。
  3. 也可通过结合 draggable 属性和 JavaScript 事件,可以实现丰富的拖放交互功能。
  4. 为构建可视化编辑器、任务看板、工作流拖拽等场景提供了原生支持。
  5. 本文将系统解析该属性的使用方法、事件机制及 dataTransfer 实现跨元素数据交互等要点。

二、基本语法

draggable 它是一个布尔属性,可以设置为 truefalse,默认值为 false(除非元素是默认可拖动的,如 <img><a> 标签)。

<element draggable="true|false|auto">

属性值与作用范围

draggable作为全局布尔属性,支持三种取值:

  • true:强制启用拖拽(如<div draggable="true">
  • false:禁用拖拽(覆盖默认行为)
  • auto(默认):遵循浏览器规则(链接/图片默认可拖拽)

特殊说明

  • 表单控件(<input>/<button>)和表格结构元素(<th>/<td>)默认不支持拖拽
  • 文本选中状态下拖拽会触发系统默认的文本复制行为
  • 移动端需配合触摸事件或第三方库(如interact.js)实现兼容

eg:示例代码

1.使 <div> 可拖动

<div draggable="true" style="width: 100px; height: 100px; background: lightblue;">拖动我!
</div>
  1. 禁止图片拖动(覆盖默认行为)
<img src="example.jpg" draggable="false" alt="不可拖动的图片">

三、拖拽事件生命周期

要实现完整的拖放功能,需要结合 JavaScript 监听拖放相关事件:

完整的拖拽操作涉及7个关键事件,按触发顺序如下:

事件类型触发场景典型用途
dragstart用户开始拖拽元素时设置拖拽数据、预览样式
drag拖拽过程中持续触发(每350ms)实时反馈位置(需节流处理)
dragend拖拽结束时(无论成功/取消)清理临时状态
dragenter拖拽元素进入放置区域时高亮显示放置区域
dragover拖拽元素在放置区域内移动时必须调用preventDefault()
dragleave拖拽元素离开放置区域时恢复放置区域样式
drop元素在放置区域释放时处理业务逻辑

四、数据传递

通过 dataTransfer 对象在拖放事件中传递数据

  • dataTransfer 对象是 HTML5 拖放 API 的核心部分。
  • 它允许在拖放操作期间在不同元素之间传递数据。
  • 通过 setData() 方法设置数据,通过 getData() 方法获取数据
  • 实现步骤
  1. dragstart 事件中,使用 setData() 设置要传递的数据
  2. drop 事件中,使用 getData() 获取之前设置的数据

eg:示例代码

<!DOCTYPE html>
<html><head><title>拖放数据传递示例</title><style>#dragItem {width: 100px;height: 50px;background-color: #3498db;color: white;text-align: center;line-height: 50px;cursor: move;margin: 20px;}#dropZone {width: 300px;height: 200px;border: 2px dashed #7f8c8d;background-color: #ecf0f1;text-align: center;line-height: 200px;margin: 20px;}</style>
</head><body><div id="dragItem" draggable="true">拖我</div><div id="dropZone">放到这里</div><script>const dragItem = document.getElementById('dragItem');const dropZone = document.getElementById('dropZone');/*** dragItem 元素处理拖动开始事件* 1. 设置数据,第一个参数是数据格式,第二个参数是数据内容*/dragItem.addEventListener('dragstart', function (e) {console.log('开始拖动,设置数据');// 设置数据,第一个参数是数据格式,第二个参数是数据内容e.dataTransfer.setData('text/plain', '这是通过dataTransfer传递的消息');e.dataTransfer.setData('application/json', JSON.stringify({ id: 1, name: '示例对象' }));});/*** dropZone 元素处理拖拽经过放置区事件* 1. 阻止默认行为以允许放置*/dropZone.addEventListener('dragover', function (e) {e.preventDefault();});/*** dropZone 元素处理放置事件 * 1. 阻止默认行为以允许放置* 2. 获取之前设置的数据* 3. 显示接收到的数据* 4. 改变背景色以示反馈*/dropZone.addEventListener('drop', function (e) {e.preventDefault();// 获取之前设置的数据,第一个参数是数据格式,第二个参数是数据内容const textData = e.dataTransfer.getData('text/plain');const jsonData = e.dataTransfer.getData('application/json');console.log('获取到的文本数据:', textData);console.log('获取到的JSON数据:', JSON.parse(jsonData));dropZone.textContent = `已接收数据: ${textData}`;dropZone.style.backgroundColor = '#2ecc71';});</script>
</body></html>

五、注意事项

  1. 默认可拖动元素:如 <img><a>(带 href)默认支持拖动,无需设置 draggable="true"
  2. 移动端兼容性:部分移动设备对拖放支持有限,需测试目标平台。
  3. 数据传递:通过 dataTransfer 对象在拖放事件中传递数据(如示例中的 setData/getData

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95315.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Github中创建仓库?如何将本地项目上传到GitHub中?

1.1 点击New repository&#xff08;这个是创建代码仓库的意思&#xff09;初次完成后只有一个文件最后&#xff1a;在本地git clone 项目地址然后把项目文件复制到git的文件夹内再提交到远程仓库git add . git commit -m "修改https"git push origin mainmain为分支…

【前端教程】HTML 基础界面开发

一、网站导航栏设计与实现 导航栏是网站的重要组成部分&#xff0c;负责引导用户浏览网站的各个板块。以下是一个实用的导航栏实现方案&#xff1a; 实现代码 HTML 结构&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8" /&…

【学Python自动化】 6. Python 模块系统学习笔记

一、模块基础 什么是模块&#xff1f;包含 Python 定义和语句的 .py 文件解决代码复用和组织问题每个模块有自己的命名空间创建模块示例# fibo.py - 斐波那契模块 def fib(n):"""打印小于n的斐波那契数列"""a, b 0, 1while a < n:print(a, e…

机器学习-时序预测2

门控循环单元GRU 接着机器学习-时序预测1-CSDN博客这个说&#xff0c;GRU是LSTM的一个简化而高效的变体&#xff0c;都使用“门控机制”来控制信息流&#xff0c;但它通过合并一些组件&#xff0c;使结构更简单、参数更少、计算更快&#xff0c;同时在许多任务上性能与 LSTM 相…

数据湖与数据仓库

大数据前沿技术详解 目录 数据湖技术湖仓一体架构数据网格实时流处理技术云原生数据技术数据治理与血缘AI原生数据平台边缘计算与大数据 核心内容包括&#xff1a; 数据湖技术 - 架构模式、技术栈、面临的挑战 湖仓一体架构 - Delta Lake、Iceberg、Hudi等主流实现 数据网格…

Python OpenCV图像处理与深度学习:Python OpenCV入门-图像处理基础

Python OpenCV入门实践&#xff1a;图像处理基础 学习目标 通过本课程&#xff0c;学员们将了解OpenCV的基本概念、安装方法&#xff0c;掌握如何使用Python和OpenCV进行基本的图像处理操作&#xff0c;包括图像的读取、显示、保存以及简单的图像变换。 相关知识点 Python Open…

【lua】Lua 入门教程:从环境搭建到基础编程

Lua 入门教程&#xff1a;从环境搭建到基础编程 Lua 是一种轻量级、可扩展的脚本语言&#xff0c;广泛应用于游戏开发&#xff08;如《魔兽世界》《Roblox》&#xff09;、嵌入式系统、Web 后端等领域。它语法简洁、运行高效&#xff0c;非常适合作为编程入门语言或辅助开发工…

MySQL索引事务(未完成)

索引的相关操作1.查看索引show index from 表名;2.创建索引create index 索引名字 on 表名(列名);创建索引&#xff0c;是一个危险操作创建索引的时候&#xff0c;需要针对现有的数据&#xff0c;进行大规模的重新整理如果当前表是一个空表&#xff0c;或者数据不多&#xff0c…

Docker一键快速部署压测工具,高效测试 API 接口性能

以下是对该压测工具的简单介绍&#xff1a; 这是一个简易的在线压测工具&#xff0c;可以对 API 接口/页面、websocket服务等进行压力测试&#xff0c;检验服务的并发能力使用 thinkphp ant design pro 构建&#xff0c;压测能力驱动基于 wrk 、 php 多进程协程实现支持在线授…

前端缓存问题详解

前端缓存是提升网页性能和用户体验的重要手段&#xff0c;但也常导致资源更新不及时等问题。以下是关于前端缓存的核心知识点和解决方案&#xff1a; 一、缓存类型及工作原理HTTP缓存&#xff08;最核心&#xff09; 强缓存&#xff1a;直接从本地读取&#xff0c;不请求服务器…

webpack升级

一、调研对比维度Webpack 4 状态Webpack 5 改进与优势构建速度较慢&#xff0c;增量构建效率低✅ 引入 持久化缓存&#xff08;filesystem cache&#xff09;&#xff0c;二次构建速度提升高达 90%Tree Shaking支持基础 Tree Shaking&#xff0c;需手动配置✅ 更强的 Tree Shak…

Logstash数据迁移之es-to-kafka.conf详细配置

在 Logstash 中配置从 Elasticsearch (ES) 读取数据并输出到 Kafka 是一个相对高级但强大的用法&#xff0c;通常用于数据迁移、重新索引、或构建新的数据管道。 下面我将详细解释配置文件的各个部分和细节。 核心配置文件结构 (es-to-kafka.conf) 一个完整的配置文件主要包含三…

在OracleLinux9.4系统上静默滚动打补丁安装Oracle19c

OracleLinux9.4系统 安装Oracle19c 文章目录OracleLinux9.4系统 安装Oracle19c一、安装准备1、yum安装预检查需要的包2、系统资源二、滚动安装一、安装准备 1、yum安装预检查需要的包 yum install libnsl yum install -y oracle-database-preinstall-19c # 最新的unzip yum i…

Android原生HttpURLConnection上传图片方案

创建上传方法object FormUploader {private val BOUNDARY "Boundary-" System.currentTimeMillis()private const val LINE_FEED "\r\n"Throws(IOException::class)fun uploadImage(url: String, imageFile: File, params: MutableMap<String?, Str…

落叶清扫机器人cad+三维图+设计说明书

摘 要 城市公共场所、校园等环境中&#xff0c;落叶的清扫一直是一个繁琐而耗时的任务。传统的人工清扫方式不仅效率低下&#xff0c;还存在人力浪费和安全隐患等问题。因此&#xff0c;研发一款能够自主完成落叶清扫任务的机器人成为了当今研究的热点之一。随着科技的不断进…

国别域名的SEO优势:是否更利于在当地搜索引擎排名?

当你盯着搜索引擎结果页发呆时&#xff0c;有没有想过——凭什么那个.jp域名的网站能排在.ca前面&#xff1f;别扯什么内容质量&#xff0c;上周帮客户优化新加坡市场时&#xff0c;亲眼见着两个内容相似度90%的页面&#xff0c;.sg域名比.com.au在Google Singapore上高出3个排…

动态配置最佳实践:Spring Boot 十种落地方式与回滚审计指南(含实操与避坑)

作为一名Spring Boot开发者&#xff0c;正在运维一个高可用微服务系统&#xff1a;业务需求变化频繁&#xff0c;需要实时调整配置如数据库连接或日志级别&#xff0c;但每次修改都得重启应用&#xff0c;造成服务中断和用户投诉。这不是小麻烦&#xff0c;而是配置管理的痛点—…

vue社区网格化管理系统(代码+数据库+LW)

摘要 随着城市化进程的加快&#xff0c;社区管理的复杂性逐渐增大&#xff0c;传统的管理模式已无法满足现代社区管理的需求。社区网格化管理系统作为一种新的管理模式&#xff0c;通过将社区划分为多个网格单元&#xff0c;使得管理更加精细化、智能化和高效化。本论文基于Sp…

使用EasyExcel实现Excel单元格保护:自由锁定表头和数据行

使用EasyExcel实现Excel单元格保护&#xff1a;锁定表头和第二行数据 前言 在日常开发中&#xff0c;我们经常需要导出Excel文件&#xff0c;有时还需要对Excel中的某些单元格进行保护&#xff0c;防止用户误修改。本文将介绍如何使用EasyExcel 4.0.3实现锁定Excel表头和第二行…

dify docker知识库topk最大值参数配置

1 问题说明 dify构建RAG知识库过程中&#xff0c;通过会遇到一些默认配置不能解决的问题。 比如topk&#xff0c;topk默认最大10&#xff0c;对语义模糊的检索&#xff0c;目标文档可能没进前10&#xff0c;出现在10-30区间。 所以&#xff0c;需要调整topk最大值参数。 # T…