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复选框CHECKBOX全选、反选
Aug 30 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
May 20 Javascript
用jquery中插件dialog实现弹框效果实例代码
Nov 15 Javascript
jQuery aminate方法定位到页面具体位置
Dec 26 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
Jan 28 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
Feb 28 Javascript
javascript动态设置样式style实例分析
May 13 Javascript
ES6中如何使用Set和WeakSet
Mar 10 Javascript
JS实现简单的天数计算器完整实例
Apr 28 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
May 24 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
Nov 30 Javascript
浅谈layui里的上传控件问题
Sep 26 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爆绝对路径方法收集整理
2012/09/17 PHP
深入php之规范编程命名小结
2013/05/15 PHP
php计算数组不为空元素个数的方法
2014/01/27 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
js实现简单的二级联动效果
2017/03/09 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
python pdb调试方法分享
2014/01/21 Python
Python中的tuple元组详细介绍
2015/02/02 Python
python基于socket实现网络广播的方法
2015/04/29 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
使用APScheduler3.0.1 实现定时任务的方法
2019/07/22 Python
python 异步async库的使用说明
2020/05/04 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
CHARLES & KEITH澳大利亚官网:新加坡时尚品牌
2019/01/22 全球购物
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
商务英语求职自荐信范文
2013/12/24 职场文书
大学生自我鉴定范文模板
2014/01/21 职场文书
农村婚庆司仪主持词
2014/03/15 职场文书
工作态度怎么写
2015/06/25 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python