js原生拖拽的两种方法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_41910848/article/details/82218243

一.mousedown、mousemove和mouseup  拖着目标元素在页面任意位置

如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒。

1.onmousedown:鼠标按下事件
2.onmousemove:鼠标移动事件
3.onmouseup:鼠标抬起事件

重点:

1、一定要绝对定位,脱离文档流才可以移动。

2、绑定拖拽的元素,移动和鼠标松开后是对document的绑定,因为移动的是整个div。

3、点击:a= 获取当前鼠标坐标、b =div距浏览器距离、c = 鼠标在div内部距离=a-b。

    移动:通过  a - c 建立鼠标与div的关系,防止鼠标超出div。

基本思路:

拖拽状态 = 0鼠标在元素上按下的时候{  

  拖拽状态 = 1  

  记录下鼠标的x和y坐标  

  记录下元素的x和y坐标  

  

 鼠标在元素上移动的时候{  

  如果拖拽状态是0就什么也不做。  

  如果拖拽状态是1,那么  

  元素y = 现在鼠标y - 原来鼠标y + 原来元素y  

  元素x = 现在鼠标x - 原来鼠标x + 原来元素x  

  }   

 鼠标在任何时候放开的时候{  

  拖拽状态 = 0  

}

贴上代码:

    <div class="box" id="drag"></div>
 
 

 
 
  1. .box{
  2. position: absolute;
  3. width: 100px;
  4. height: 100px;
  5. background: red;
  6. cursor: move;
  7. }

 


 
 
  1. window.onload = function(){
  2. var drag = document.getElementById( 'drag');
  3. // //点击某物体时,用drag对象即可,move和up是全局区域,
  4. // 也就是整个文档通用,应该使用document对象而不是drag对象(否则,采用drag对象时物体只能往右方或下方移动)
  5. drag.onmousedown = function(event){
  6. var event = event || window.event; //兼容IE浏览器
  7. // 鼠标点击物体那一刻相对于物体左侧边框的距离=点击时的位置相对于浏览器最左边的距离-物体左边框相对于浏览器最左边的距离
  8. var diffX = event.clientX - drag.offsetLeft;
  9. var diffY = event.clientY - drag.offsetTop;
  10. if( typeof drag.setCapture !== 'undefined'){
  11. drag.setCapture();
  12. }
  13. document.onmousemove = function(event){
  14. var event = event || window.event;
  15. var moveX = event.clientX - diffX;
  16. var moveY = event.clientY - diffY;
  17. if(moveX < 0){
  18. moveX = 0
  19. } else if(moveX > window.innerWidth - drag.offsetWidth){
  20. moveX = window.innerWidth - drag.offsetWidth
  21. }
  22. if(moveY < 0){
  23. moveY = 0
  24. } else if(moveY > window.innerHeight - drag.offsetHeight){
  25. moveY = window.innerHeight - drag.offsetHeight
  26. }
  27. drag.style.left = moveX + 'px';
  28. drag.style.top = moveY + 'px'
  29. }
  30. document.onmouseup = function(event){
  31. this.onmousemove = null;
  32. this.onmouseup = null;
  33. //修复低版本ie bug
  34. if( typeof drag.releaseCapture!= 'undefined'){
  35. drag.releaseCapture();
  36. }
  37. }
  38. }
  39. }

 二.HTML5元素拖拽drag与拖放drop

 元素拖拽

浏览器默认允许我们拖拽图像、文本以及链接 
让其它元素被拖动也是可以实现的 
只需要在元素标签上添加一个属性

   <div class="box1" draggable="true" id="source"></div>
 
 

拖拽事件

拖拽事件应该分为两类 
一类是被拖拽元素触发的事件 
另一类是拖放目标元素触发的事件


 
 
  1. <div class= "box1" draggable= "true" id= "source"> </div>
  2. <br>
  3. <div class="box2" id="target"></div>

拖拽元素

拖拽元素的时候,被拖拽元素会触发以下事件

  • dragstart
  • drag
  • dragend

当鼠标点中元素并且开始移动时,就会触发dragstart事件(类比mousedown) 
拖拽过程中会持续不断地触发drag事件(类比mousemove) 
松开鼠标取消拖拽时就会触发dragend事件(类比mouseup)


 
 
  1. source.ondragstart = function(event){
  2. var e = event || window.event
  3. console.log( '开始拖拽');
  4. }
  5. source.ondrag = function(){
  6. console.log( '拖拽中');
  7. }
  8. source.ondragend = function(){
  9. console.log( '拖拽结束')
  10. }

目标元素

当拖拽的元素拖到一个目标元素上时,目标元素会触发以下事件

  • dragenter
  • dragover
  • dragleave
  • drop

拖拽元素到目标上,就会触发dragenter事件(类比mouseover) 
当拖动元素在目标元素中,就会持续触发dragover事件 
离开目标元素,触发dragleave事件(类比mouseout) 
若拖放元素到了目标元素中(在目标元素中松开鼠标),就会触发drop事件而不会触发dragleave事件


 
 
  1. target.ondragenter = function(){
  2. console.log( '进入目标元素')
  3. }
  4. target.ondragover = function(event){
  5. var event = event || window.event;
  6. console.log( '在目标元素中拖拽');
  7. event.preventDefault()
  8. }
  9. target.ondragleave = function(){
  10. console.log( '拖放离开目标元素')
  11. }
  12. target.ondrop = function(event){
  13. console.log( '拖放');
  14. var e = event || window.event;
  15. }

   

注意:元素默认是不能够拖放 只要我们在目标元素的dragover事件中取消默认事件就可以解决问题

数据交换

数据交换的对象就是事件对象的属性dataTransfer 
dataTransfer的两个核心方法是setData()和getData() 
setData()用于设置数据,getData()用语接收数据

举个拖放的例子:


 
 
  1. <div class= "box1" draggable= "true" id= "source"> </div>
  2. <br>
  3. <div class="box2" id="target"></div>

 
 
  1. .box1{
  2. width: 100px;
  3. height: 100px;
  4. background: salmon
  5. }
  6. .box2{
  7. width: 300px;
  8. height: 300px;
  9. border: 1px solid black
  10. }

 
 
  1. window.onload = function(){
  2. var source = document.getElementById( 'source');
  3. var target = document.getElementById( 'target');
  4. source.ondragstart = function(event){
  5. var e = event || window.event
  6. console.log( '开始拖拽');
  7. e.dataTransfer.setData( 'text',e.target.id);
  8. }
  9. target.ondragenter = function(){
  10. console.log( '进入目标元素')
  11. }
  12. target.ondragover = function(event){
  13. var event = event || window.event;
  14. console.log( '在目标元素中拖拽');
  15. event.preventDefault()
  16. }
  17. target.ondragleave = function(){
  18. console.log( '拖放离开目标元素')
  19. }
  20. target.ondrop = function(event){
  21. console.log( '拖放');
  22. var e = event || window.event
  23. var data = e.dataTransfer.getData( 'text');
  24. e.target.appendChild( document.getElementById(data));
  25. }
  26. }

       

拖拽设置

在dataTransfer中还有两个重要的属性 
dropEffecteffectAllowed

dropEffect

dropEffect属性值为字符串,表示被拖动元素可以执行哪一种放置行为 
要使用这个属性,必须在dragenter事件处理函数中设置

  • none 不能把元素拖放至此(除文本框外全部元素的默认值)
  • move 移动到目标
  • copy 复制到目标
  • link 目标打开拖动元素(拖动元素必须是链接并有URL)

effectAllowed

effectAllowed属性值也是字符串,表示允许拖动元素哪种dropEffect 
要使用这个属性,必须在dragst事件处理函数中设置

  • uninitialized 没有设置任何拖放行为
  • none 不能由任何行为
  • copy 仅允许dropEffect值为copy
  • link 仅允许dropEffect值为link
  • move 仅允许dropEffect值为move
  • copyLink 允许dropEffect值为copy和link
  • copyMove 允许dropEffect值为copy和move
  • linkMove 允许dropEffect值为link和move
  • all 允许任意dropEffect

 

参考文章:

   https://blog.csdn.net/gongzhuxiaoxin/article/details/52894784

   https://blog.csdn.net/gongzhuxiaoxin/article/details/52894784

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值