html-拖拽释放(Drag and drop) API
前言
本文总结一下html5 新增的元素拖拽功能的使用。
正文
1、H5之前的拖拽功能实现方法
JS 拖 拖 拽 功 能 的 实 现首先是三个事件,分别是 mousedown,mousemove,mouseup 当鼠标点击按下的时候,需要一个 tag 标识此时已经按下,可以执行mousemove 里面的具体方法。clientX,clientY 标识的是鼠标的坐标,分别标识横坐标和纵坐标,并且我们用 offsetX 和 offsetY 来表示元素的元素的初始坐标,移动的举例应该是:鼠标移动时候的坐标-鼠标按下去时候的坐标。也就是说定位信息为:鼠标移动时候的坐标-鼠标按下去时候的坐标+元素初始情况下的 offetLeft.还有一点也是原理性的东西,也就是拖拽的同时是绝对定位,我们改变的是绝对定位条件下的 left 以及 top等等值。
2、H5的拖拽方法介绍
(1)将元素设置为可以拖动
(2)拖动什么 - ondragstart 和 setData()
(3)放到何处 - ondragover
(4)进行放置 - ondrop
3、使用拖拽实现小功能
<style>
.wrap {
width: 300px;
margin: 0 auto;
display: flex;
flex-direction: row;
justify-content: space-between;
}
.wrap1 {
width: 100px;
height: 310px;
border: 1px solid red;
}
.wrap1:hover {
box-shadow: 4px 4px 5px 3px #999;
}
.wrap2 {
width: 100px;
height: 310px;
border: 1px solid red;
}
.wrap2:hover {
box-shadow: 4px 4px 5px 3px #999;
}
img {
width: 100px;
height: 100px;
cursor: move;
}
img:hover {
box-shadow: 4px 4px 5px 3px #999;
}
</style>
<body>
<div class="wrap">
<div class="wrap1" ondragover="dragOver(event)" ondrop="drop(event,this)">
<img src="./img/feiji1.png" draggable="true" ondragstart="dragStart(event)" id="drag1" />
<img src="./img/feiji3.png" draggable="true" ondragstart="dragStart(event)" id="drag3" />
</div>
<div id="wrap2" class="wrap2" ondragenter="dragEnter(event)" ondragover="dragOver(event)" ondrop="drop(event,this)">
<img src="./img/feiji2.png" draggable="true" ondragstart="dragStart(event)" id="drag2" />
</div>
</div>
<script>
var dragOffSetY;// 鼠标点击下的位置相对于选择元素的y轴长度
function dragStart(event) {
// 设置拖放的数据类型和值
console.log("event.offsetY", event.offsetY);
dragOffSetY = event.offsetY
event.dataTransfer.setData("Text", event.target.id);
}
function dragOver(event) {
event.preventDefault();
}
function dragEnter(event) { }
function drop(event, thisEle) {
event.preventDefault();
var data = event.dataTransfer.getData("Text");
if (thisEle.children.length * 100 - 50 > event.offsetY - dragOffSetY) {
console.log("插入");
// 判断覆盖元素的前半部分
console.log("event.offsetY - dragOffSetY", event.offsetY, dragOffSetY);
var offY = event.offsetY - dragOffSetY// 拖拽元素的起点位置
console.log("拖拽元素的起点位置", offY);
var count = Math.round(offY / 100)// 当前拖拽元素覆盖在的元素为第几个
console.log("当前覆盖元素", thisEle.children[count]);
// 前部分
if (count * 100 + 50 > offY) {
thisEle.insertBefore(document.getElementById(data), thisEle.children[count]);
} else {
thisEle.insertBefore(document.getElementById(data), thisEle.children[count + 1]);
}
} else {
console.log("追加");
event.target.appendChild(document.getElementById(data));
}
}
</script>
运行结果如下:

写在最后
以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长之路会持续更新一些工作中常见的问题和技术点。

html-拖拽释放(Drag and drop) API的更多相关文章
- (原创)[C#] 一步一步自定义拖拽(Drag&Drop)时的鼠标效果:(一)基本原理及基本实现
一.前言 拖拽(Drag&Drop),属于是极其常用的基础功能. 无论是在系统上.应用上.还是在网页上,拖拽随处可见.同时拖拽时的鼠标效果也很漂亮,像这样: 这样: 还有这样: 等等等等. 这 ...
- [Unity]背包效果-使用NGUI实现物品的拖拽效果Drag
背包效果-使用NGUI实现物品的拖拽效果Drag 效果实现如图 对象层级关系图 PacketCell - Right 对象作为单元格背景 PacketContainer 对象作为单元格容器 Packe ...
- HTML5原生拖拽/拖放⎡Drag & Drop⎦详解
前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准的一部分.我从几个方面学习并实践这个功能. 拖放的流程 ...
- HTML5原生拖拽/拖放(drag & drop)详解
前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准的一部分.我从几个方面学习并实践这个功能. 拖放的流程 ...
- HTML5拖拽/拖放(drag & drop)详解
H5中拖拽属性: draggable: auto | true | false 拖动事件: - dragstart 在元素开始被拖动时触发 - dragend 在拖动操作完成时触发 - dra ...
- HTML5拖拽功能drag
1.创建拖拽对象 给需要拖拽的元素设置draggable属性,它有三个值: true:元素可以被拖拽:false:元素不能被拖拽:auto: 浏览器自己判断元素是否能被拖拽. 2.处理拖拽事件当我们拖 ...
- D3.js 力导向图的拖拽(drag)与缩放(zoom)
不知道大家会不会跟我一样遇到这样的问题,在之前做的力导向图的基础上加上缩放功能的时候,拖动节点时整体会平移不再是之前酷炫的效果(失去了拉扯的感觉!).天啊,简直不能接受如此丑X的效果.经过不懈的努力终 ...
- 【WPF】鼠标拖拽功能DragOver和Drop
在Winform里面实现拖入功能只要设置控件AllowDrop=true; 然后实现方法 //拖入 private void txtInputPath_DragOver(object sender, ...
- html5拖拽总结
拖拽(Drag 和 drop)是 HTML5 标准的组成部分.拖拽是一种常见的特性,即抓取对象以后拖到另一个位置. Internet Explorer 9.Firefox.Opera 12.Chrom ...
随机推荐
- CSS中inherit指定继承的使用方法和auto的区别
CSS中的每个属性都有一个特定值"inherit",其含义是指定继承父元素的相应属性,使用inherit一方面在代码上能地表明要继承于父元素的样式属性,另一方面也使子元素继承了那些 ...
- test_5 排序‘+’、‘-’
题目是:有一组"+"和"-"符号,要求将"+"排到左边,"-"排到右边,写出具体的实现方法. 方法一: l=['-', ...
- Scala语言介绍一
为什么学习scala语言 Scala是基于JVM的语言,与java语言类似,java语言是基于JVM的面向对象的语言,Scala也是基于JVM,同时支持面向对象和面向函数的编程语言.Spark底层的源 ...
- JS定时器不可靠的原因及解决方案
前言 在工作中应用定时器的场景非常多,但你会发现有时候定时器好像并没有按照我们的预期去执行,比如我们常遇到的setTimeout(()=>{},0)它有时候并不是按我们预期的立马就执行.想要知道 ...
- 《剑指offer》面试题34. 二叉树中和为某一值的路径
问题描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 ...
- 龙芯 3A4000 安装 Debian10 (via debootstrap)
由于一些原因,Debian 的内核不能直接在龙芯的 cpu 上使用.据悉 Linux 5.7 kernel 改进了对龙芯的支持,不久的将来我们应该就能更愉快地在龙芯上运行 Debian 了. 感谢龙芯 ...
- HttpRunner3的用例是怎么运行起来的
在PyCharm中打开examples/httpbin/basic_test.py: 首先映入眼帘的是左上角那个绿色小箭头,点了一下,可以直接运行,意味着HttpRunner是能够直接被pytest驱 ...
- 【记录一个问题】opencv + cuda编译release版本后,链接出现奇怪的符号
链接出现以下信息: 1 /home/admin/opencv/20190610_cuda_release/lib64/libopencv_core.a(ocl.cpp.o): In function ...
- golang中的RPC开发-2
RPC简介 远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程 如果 ...
- 【程序15】成绩>=90分用A表示,60-89分用B表示, 60分以下用C表示。
利用条件运算符的嵌套来完成此题 score = int(input('input score:')) if score >= 90: grade = 'A' elif score >= 6 ...
