JS实现拖拽功能

拖拽功能是我们日常项目中常用的效果,今天我们就来研究一下如何实现简单的拖拽功能。
想实现拖拽功能其实很简单,主要需要三个事件:
1、mousedown:鼠标按下
2、mousemove:鼠标移动
3、mouseup:鼠标抬起

思路很简单,鼠标按下的时候,记录下鼠标按下时的x,y,即e.clientX和e.clientY,还有记录下当前div的坐标位置即div.offsetLeft及div.offsetTop。当鼠标移动时,再次记录下鼠标当前的x,y,
此时div坐标分别为:
x=现在的鼠标位置x-开始按下的鼠标位置x+div的原始坐标x
y=现在的鼠标位置y-开始按下的鼠标位置y+div的原始坐标y
最后当鼠标抬起时,解绑。

下面上代码:

  function drag(el){
            el.addEventListener('mousedown',function(e){  
                let start = {
                    x:e.clientX,
                    y:e.clientY
                }
                let startPos = {
                    x:css(el,'left'),
                    y:css(el,'top')
                }
                function move(e){
                    let dis = {
                        x:e.clientX-start.x,
                        y:e.clientY-start.y
                    }

                let x = dis.x+startPos.x;
                let y = dis.y+startPos.y;

                //边界处理,取大小值
                x=  Math.max(0,x);
                x = Math.min(x,document.documentElement.clientWidth-box.clientWidth);
  
                y = Math.max(0,y);
                y = Math.min(y,document.documentElement.clientHeight-box.clientHeight);

              
                el.style.left = x+'px';
                el.style.top = y+'px';

                    
    
                 e.preventDefault();
                }
                document.addEventListener('mousemove',move);
                document.addEventListener('mouseup',function(){
                    document.removeEventListener('mousemove',move);
                      
            },{
                once:true
            });
        })
    
        }
        

是不是很简单啊,下面扩展一下碰撞检测的方法:

function isContact(el1,el2){
            //获取四条边的位置
            let el1Pos = el1.getBoundingClientRect();
            let el2Pos = el2.getBoundingClientRect();
            if(//碰上
                el1Pos.right>el2Pos.left&&
                el1Pos.left<el2Pos.right&&
                el1Pos.bottom>el2Pos.top&&
                el1Pos.top<el2Pos.bottom
            ){
                return true;
            }else{
                return false;
            }
        }

这里很好理解,简单解释一下getBoundingClientRect():
该方法是返回元素的大小及其相对于视口的位置,包含四个只读属性:left、right、top、bottom。

详细可以参考MDN上对该方法的介绍:https://developer.mozilla.org/zh-CN/docs/Web/API/Element/getBoundingClientRect

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 好的,这次来看看用纯js如何实现拖拽运动。源码已上传到github,需要的可以下载 https://github...
    江海大初学者阅读 5,611评论 1 4
  • 在前端技术日新月异,飞速发展的当下,涌现出了很多优秀的开源框架以及优秀的开源组件,这些都是优秀的前端开发者的技术成...
    小兴nice阅读 4,113评论 0 14
  • 前言 本文依据半年前本人的分享《浅谈js拖拽》撰写,算是一篇迟到的文章。 基本思路 虽然现在关于拖拽的组件库到处都...
    lanberts阅读 2,488评论 0 0
  • 拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等,效果还是蛮不错的。下面讲解一下拖拽的...
    kismetajun阅读 1,588评论 0 12
  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,543评论 1 11