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 Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
Feb 24 Javascript
使用jquery 简单实现下拉菜单
Jan 14 Javascript
JavaScript数组方法总结分析
May 06 Javascript
js实现拖拽功能
Mar 01 Javascript
基于Vue实例对象的数据选项
Aug 09 Javascript
基于 Vue 实现一个酷炫的 menu插件
Nov 14 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
Feb 01 Javascript
vue项目中api接口管理总结
Apr 20 Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 Javascript
vue视频播放暂停代码
Nov 08 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
May 20 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获取字符串的编码格式的方法(函数)
2013/06/21 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
javascript 短路法代码精简
2009/08/20 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
js实现点击生成随机div
2020/01/16 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
Python图像灰度变换及图像数组操作
2016/01/27 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
python实现批量修改图片格式和尺寸
2018/06/07 Python
python梯度下降法的简单示例
2018/08/31 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
基于pandas中expand的作用详解
2019/12/17 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
世界最大的票务市场:viagogo
2017/02/16 全球购物
小学教师节活动方案
2014/01/31 职场文书
职业规划实施方案
2014/06/10 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书