自己封装的一个原生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 相关文章推荐
基于jquery的获取mouse坐标插件的实现代码
Apr 01 Javascript
js禁止页面使用右键(简单示例代码)
Nov 13 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
JavaScript实现给按钮加上双重动作的方法
Aug 14 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
Oct 12 Javascript
AngularJS改变元素显示状态
Apr 20 Javascript
angular.js指令中的controller、compile与link函数的不同之处
May 10 Javascript
JS设计模式之数据访问对象模式的实例讲解
Sep 30 Javascript
通俗易懂地解释JS中的闭包
Oct 23 Javascript
基于vue.js实现的分页
Mar 13 Javascript
使用 node.js 模仿 Apache 小部分功能
Jul 07 Javascript
package.json各个属性说明详解
Mar 11 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
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
php 面向对象的一个例子
2011/04/12 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
Prototype使用指南之range.js
2007/01/10 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
详解js的六大数据类型
2016/12/27 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
vue 组件简介
2020/07/31 Javascript
Python设计模式之单例模式实例
2014/04/26 Python
使用python生成目录树
2018/03/29 Python
python自动化之Ansible的安装教程
2019/06/13 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
python切割图片的示例
2020/11/12 Python
pandas map(),apply(),applymap()区别解析
2021/02/24 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
婚礼新郎父母答谢词
2014/01/16 职场文书
留学推荐信怎么写
2014/01/25 职场文书
2014新课程改革心得体会
2014/03/10 职场文书
学生会主席演讲稿
2014/04/25 职场文书
化工见习报告范文
2014/10/31 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
SpringBoot快速入门详解
2021/07/21 Java/Android
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python
Redis Lua脚本实现ip限流示例
2022/07/15 Redis