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 相关文章推荐
FireFox JavaScript全局Event对象
Jun 14 Javascript
jQuery Clone Bug解决代码
Dec 22 Javascript
对xmlHttp对象方法和属性的理解
Jan 17 Javascript
ExtJs纵坐标值重复问题的解决方法
Feb 27 Javascript
js实现的二级横向菜单条实例
Aug 22 Javascript
基于jQuery实现仿51job城市选择功能实例代码
Mar 02 Javascript
jquery实现页面加载效果
Feb 21 Javascript
详解Javascript获取缓存和清除缓存API
May 25 Javascript
ReactNative Image组件使用详解
Aug 07 Javascript
深入浅析Vue中的slots/scoped slots
Apr 03 Javascript
用Fundebug插件记录网络请求异常的方法
Feb 21 Javascript
JS document文档的简单操作完整示例
Jan 13 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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
jquery-easyui关闭tab自动切换到前一个tab
2010/07/29 Javascript
让textarea自动调整大小的js代码
2011/04/12 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
Vue实现一种简单的无限循环滚动动画的示例
2021/01/10 Vue.js
Python的装饰器使用详解
2017/06/26 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
Python tkinter事件高级用法实例
2018/01/31 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
经济信息管理专业大学生求职信
2013/09/27 职场文书
《桥》教学反思
2014/04/09 职场文书
大学活动总结范文
2014/04/29 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
工作检讨书大全
2015/01/26 职场文书
内勤岗位职责
2015/02/10 职场文书
暑期实践个人总结
2015/03/06 职场文书
违纪开除通知书
2015/04/25 职场文书
人力资源部工作计划
2019/05/14 职场文书
redis内存空间效率问题的深入探究
2021/05/17 Redis
详解非极大值抑制算法之Python实现
2021/06/28 Python
Java实现聊天机器人完善版
2021/07/04 Java/Android
mysql 生成连续日期及变量赋值
2022/03/20 MySQL