自己封装的一个原生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 相关文章推荐
ExtJs3.0中Store添加 baseParams 的Bug
Mar 10 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
Mar 14 Javascript
js时间比较示例分享(日期比较)
Mar 05 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
Mar 06 Javascript
javascript实现点击后变换按钮显示文字的方法
May 13 Javascript
让JavaScript中setTimeout支持链式操作的方法
Jun 19 Javascript
自学实现angularjs依赖注入
Dec 20 Javascript
JS实现小球的弹性碰撞效果
Nov 11 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
Aug 12 Javascript
浅谈javascript错误处理
Aug 11 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
Sep 27 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
Nov 16 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调用VC编写的COM组件实例
2014/03/29 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
AJAX的使用方法详解
2017/04/29 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
Javascript设计模式之装饰者模式详解篇
2017/01/17 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
vue2.0 路由模式mode=&quot;history&quot;的作用
2018/10/18 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
Python selenium文件上传方法汇总
2020/11/19 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
详解Python的三种拷贝方式
2020/02/11 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
校园广播稿精选
2014/10/01 职场文书
党建工作整改措施
2014/10/28 职场文书
人事专员岗位职责
2015/02/03 职场文书
理想国读书笔记
2015/06/25 职场文书
七一表彰大会简报
2015/07/20 职场文书
离职告别感言
2015/08/04 职场文书
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
世界十大狙击步枪排行榜
2022/03/20 杂记