自己封装的一个原生JS拖动方法(推荐)


Posted in Javascript onNovember 22, 2016

代码:

function drag(t,p){

  var point = p || null,
    target = t || null,
    resultX = 0,
    resultY = 0;

  (!point)? point = target : ''; //如果没有拖动点,则拖动点默认为整个别拖动元素

  function getPos(t){
    var offsetLeft = 0,
      offsetTop = 0,
      offsetParent = t;

    while(offsetParent){
      offsetLeft+=offsetParent.offsetLeft;
      offsetTop+=offsetParent.offsetTop;
      offsetParent = offsetParent.offsetParent;
    }

    return {'top':offsetTop,'left':offsetLeft};
  }

  function core(){

    var width = document.body.clientWidth || document.documentElement.clientWidth,
      height = document.body.clientHeight || document.documentElement.clientHeight; 
      maxWidth = width - target.offsetWidth,
      maxHeight = height - target.offsetHeight;

    (resultX >= maxWidth)? target.style.left = maxWidth+'px' : (resultX > 0)?target.style.left = resultX +'px': ''; //重置默认位置。
    (resultY >= maxHeight)?  target.style.top = maxHeight +'px' : (resultY > 0)?target.style.top = resultY +'px':''; //重置默认位置。

    point.onmousedown=function(e){  
      var e = e || window.event,
        coordX = e.clientX,
        coordY = e.clientY,
        posX = getPos(target).left,
        posY = getPos(target).top;

      point.setCapture && point.setCapture();  //将Mouse事件锁定到指定元素上。
      document.onmousemove=function(e){

        var ev = e || window.event,
          moveX = ev.clientX,
          moveY = ev.clientY;

        resultX = moveX - (coordX - posX); //结果值是坐标点减去被拖动元素距离浏览器左侧的边距
        resultY = moveY - (coordY - posY);

        (resultX > 0 )?((resultX < maxWidth)?target.style.left = resultX+'px' : target.style.left = maxWidth+'px') : target.style.left = '0px'; 
        (resultY > 0 )?((resultY < maxHeight)?target.style.top = resultY+'px' : target.style.top = maxHeight+'px') : target.style.top = '0px'; 

        ev.stopPropagation && ev.stopPropagation(); 
        ev.preventDefault;
        ev.returnValue = false;
        ev.cancelBubble = true;
      };
    };
    document.onmouseup=function(){  // 解决拖动时,当鼠标指向的DOM对象非拖动点元素时,无法触发拖动点的onmousedown的BUG。
      document.onmousemove = null;  
      point.releaseCapture && point.releaseCapture();  // 将Mouse事件从指定元素上移除。
    };
    point.onmouseup=function(e){
      var e = e || window.event;
      document.onmousemove = null;
      point.releaseCapture && point.releaseCapture();
    };
  }
  core();
  window.onresize = core;  
}

使用方式:

drag(t,p)
/* 
 * 说明 
 * t 表示被拖动的元素
 * p 表示拖动点
*/

// 注意:如果省略拖动点,默认可拖动的区域是整个被拖动元素

以上就是小编为大家带来的自己封装的一个原生JS拖动方法(推荐)全部内容了,希望大家多多支持三水点靠木~

Javascript 相关文章推荐
IE8 浏览器Cookie的处理
Jan 31 Javascript
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
Jan 15 Javascript
jQuery 隐藏和显示 input 默认值示例
Jun 03 Javascript
js实现div弹出层的方法
Nov 20 Javascript
js QQ客服悬浮效果实现代码
Dec 12 Javascript
Javascript中实现trim()函数的两种方法
Feb 04 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
Sep 08 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
Mar 01 Javascript
js实现千分符和保留几位小数的简单实例
Aug 01 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
Nov 22 Javascript
vue-swiper的使用教程
Aug 30 Javascript
详解vue项目中实现图片裁剪功能
Jun 07 Javascript
SelecT下拉框选中和取值的解决方法
Nov 22 #Javascript
javascript入门之window对象【新手必看】
Nov 22 #Javascript
AngularJS实现DOM元素的显示与隐藏功能
Nov 22 #Javascript
JavaScript ES6中CLASS的使用详解
Nov 22 #Javascript
AngularJS实现ajax请求的方法
Nov 22 #Javascript
js数组操作方法总结(必看篇)
Nov 22 #Javascript
jQ处理xml文件和xml字符串的方法(详解)
Nov 22 #Javascript
You might like
php discuz 主题表和回帖表的设计
2009/03/13 PHP
phpQuery让php处理html代码像jQuery一样方便
2015/01/06 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
Javascript 对象的解释
2008/11/24 Javascript
Cookie 注入是怎样产生的
2009/04/08 Javascript
jQuery 获取URL参数的插件
2010/03/04 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
2016/10/21 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
js上下视差滚动简单实现代码
2017/03/07 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
2019/11/04 jQuery
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
Python脚本实现网卡流量监控
2015/02/14 Python
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
python fabric实现远程部署
2017/01/05 Python
python 读取DICOM头文件的实例
2018/05/07 Python
对python Tkinter Text的用法详解
2018/10/11 Python
python实现连连看辅助之图像识别延伸
2019/07/17 Python
css3一个简易的 LED 数字时钟实现方法
2020/01/15 HTML / CSS
最新结婚典礼主持词
2014/03/14 职场文书
战略合作意向书
2014/07/29 职场文书
个人债务授权委托书
2014/10/17 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
教你怎么用python实现字符串转日期
2021/05/24 Python
redis 存储对象的方法对比分析
2021/08/02 Redis
Python各协议下socket黏包问题原理
2022/04/12 Python
Springboot中如何自动转JSON输出
2022/06/16 Java/Android