JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)


Posted in Javascript onMay 17, 2017

限制范围的拖拽,要求被拖拽的对象必须在客户区可见范围!

div是body的子元素,div的left/top是针对body的,不是针对可见客户区的,所以在拖拽的过程中不得不考虑被卷走的部分,因为网页文档可能很大,无论宽度还是高度都可能大于客户区,等于客户区大小就很好处理,大于的话就得考虑scrollTop和scrollLeft,否则div会跟鼠标脱离,因为距离都算错了。

/*切记:凡是clientX/Y 的 一定记得卷走的部分*/
document.body是DOM中Document对象里的body节点,
document.documentElement是文档对象根节点(html)的引用,
document.documentElement.scrollHeight网页整体高度
function getPos(ev) {
  var st = document.documentElement.scrollTop || document.body.scrollTop;
  var sl = document.documentElement.scrollLeft || document.body.scrollLeft;
  return {x:sl+ev.clientX, y:st+ev.clientY};
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>客户区可见范围限制拖拽</title>
  <style type="text/css">
    * {
      padding: 0;
      margin: 0;
    }
    #div1 {
      width: 100px;
      height: 100px;
      background: orange;
      position: absolute;
    }
  </style>
</head>
<body style="width: 200000px;height: 200000px;">
  <div id="div1"></div>

  <script type="text/javascript">
    var oDiv = document.getElementById('div1');
    function getStyle(obj, attr) {
      if (obj.currentStyle) {
        return obj.currentStyle[attr];
      } else {
        return getComputedStyle(obj, null)[attr];
      }
    }

    //getPos得到的是鼠标当前位置距离页面最左/上边的距离,包括被卷走的部分
    function getPos(ev) {
      var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
      var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
      return {
        x : scrollLeft + ev.clientX,
        y : scrollTop + ev.clientY
      };
    }
    function getScrollPos() {
      var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
      var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
      return {
        x : scrollLeft,
        y : scrollTop
      };   
    }
    oDiv.onmousedown = function(ev) {
      var oEvent = ev || event;
      var pos = getPos(oEvent);
      var disX = pos.x - parseInt(getStyle(oDiv, 'left'));
      var disY = pos.y - parseInt(getStyle(oDiv, 'top'));
      document.onmousemove = function(ev) {
        var oEvent = ev || event;
        var l = oEvent.clientX - disX;
        var t = oEvent.clientY - disY;
        if (l < 0) {
          l = 0;
        } else if (l > document.documentElement.clientWidth - oDiv.offsetWidth) {
          l = document.documentElement.clientWidth - oDiv.offsetWidth;
        }

        if (t < 0) {
          t = 0;
        } else if (t > document.documentElement.clientHeight - oDiv.offsetHeight) {
          t = document.documentElement.clientHeight - oDiv.offsetHeight;
        }

        l = l + getScrollPos().x;//最后left是相对于body的,加上卷走的部分scrollLeft;
        t = t + getScrollPos().y;//加上卷走的高度scrollTop

        // oDiv.style.left = l + 'px';
        // oDiv.style.top = t + 'px';

        oDiv.style.cssText = ';left:' + l + 'px;top:' + t + 'px;';
      };

      document.onmouseup = function() {
        document.onmousemove = null;
        document.onmouseup = null;
      };
    };
  </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Mootools 1.2教程(2) DOM选择器
Sep 14 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
Mar 10 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
Jan 03 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
Jan 06 Javascript
javascript中使用new与不使用实例化对象的区别
Jun 22 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
Jan 13 Javascript
jQuery实现底部浮动窗口效果
Sep 07 Javascript
js实现交通灯效果
Jan 13 Javascript
Bootstrap模态窗口源码解析
Feb 08 Javascript
通过命令行创建vue项目的方法
Jul 20 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
Nov 20 Javascript
详解如何使用React Hooks请求数据并渲染
Oct 18 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
May 17 #Javascript
Angular.JS中的this指向详解
May 17 #Javascript
websocket+node.js实现实时聊天系统问题咨询
May 17 #Javascript
JavaScript简单拖拽效果(1)
May 17 #Javascript
node.js连接MongoDB数据库的2种方法教程
May 17 #Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
May 17 #Javascript
Vue.js鼠标悬浮更换图片功能
May 17 #Javascript
You might like
PHP 采集心得技巧
2009/05/15 PHP
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
发一个php简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
jQuery使用手册之一
2007/03/24 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
Python fileinput模块使用实例
2015/05/28 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
python实现汉诺塔算法
2021/03/01 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
幼儿园2014年度工作总结
2014/11/10 职场文书
报案材料怎么写
2015/05/25 职场文书
解约证明模板
2015/06/19 职场文书
教研活动主持词
2015/07/03 职场文书
2015年物流客服工作总结
2015/07/27 职场文书
党员心得体会范文2016
2016/01/23 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL