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 相关文章推荐
jQuery实现切换页面布局使用介绍
Oct 09 Javascript
20行代码实现的一个CSS覆盖率测试脚本
Jul 07 Javascript
js使用html()或text()方法获取设置p标签的显示的值
Aug 01 Javascript
js中this用法实例详解
May 05 Javascript
JS制作手机端自适应缩放显示
Jun 11 Javascript
详解WordPress开发中get_current_screen()函数的使用
Jan 11 Javascript
Jquery鼠标放上去显示全名的实现方法
Feb 06 Javascript
详解js中Array的方法及技巧
Sep 12 Javascript
使用Javascript简单计算器
Nov 17 Javascript
JSON生成Form表单的方法示例
Nov 21 Javascript
vue.js购物车添加商品组件的方法
Sep 17 Javascript
小程序双头slider选择器的实现示例
Mar 31 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中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
php compact 通过变量创建数组
2016/11/15 PHP
jQuery find和children方法使用
2011/01/31 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
Python基于PycURL实现POST的方法
2015/07/25 Python
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
python模拟事件触发机制详解
2018/01/19 Python
Django实现分页功能
2018/07/02 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
纯css3实现效果超级炫的checkbox复选框和radio单选框
2014/09/01 HTML / CSS
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
营销与策划应届生求职信
2013/11/04 职场文书
优秀班干部事迹材料
2014/01/26 职场文书
玲玲的画教学反思
2014/02/04 职场文书
《鸿门宴》教学反思
2014/04/22 职场文书
诚信承诺书模板
2014/05/26 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
拖欠货款起诉状
2015/05/20 职场文书