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

发布时间 - 2026-01-11 01:09:04    点击率:

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

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>

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


# js  # 拖拽  # scrollLeft  # scrollTop  # JS属性scrollTop clientHeight scrollHeight理解学习  # js浏览器滚动条卷去的高度scrolltop(实例讲解)  # js中scrollTop()方法和scroll()方法用法示例  # 深入浅析JavaScript中的scrollTop  # js scrollTop如何到达指定位置  # 卷走  # 鼠标  # 的是  # 文档  # 很好  # 错了  # 就得  # 相对于  # 大家多多  # 会跟  # 都算  # 过程中  # getPos  # scrollHeight  # function  # Document  # DOM  # documentElement 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  音乐网站服务器如何优化API响应速度?  iOS发送验证码倒计时应用  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  魔方云NAT建站如何实现端口转发?  北京企业网站设计制作公司,北京铁路集团官方网站?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  JavaScript如何实现继承_有哪些常用方法  Laravel如何处理CORS跨域请求?(配置示例)  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  简历没回改:利用AI润色让你的文字更专业  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  活动邀请函制作网站有哪些,活动邀请函文案?  百度浏览器如何管理插件 百度浏览器插件管理方法  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  简单实现Android验证码  如何在景安服务器上快速搭建个人网站?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  文字头像制作网站推荐软件,醒图能自动配文字吗?  高端建站三要素:定制模板、企业官网与响应式设计优化  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  如何注册花生壳免费域名并搭建个人网站?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  JavaScript Ajax实现异步通信  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  JavaScript中的标签模板是什么_它如何扩展字符串功能  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  高端企业智能建站程序:SEO优化与响应式模板定制开发  北京网站制作的公司有哪些,北京白云观官方网站?  Python进程池调度策略_任务分发说明【指导】  西安专业网站制作公司有哪些,陕西省建行官方网站?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  香港服务器租用费用高吗?如何避免常见误区?  如何用腾讯建站主机快速创建免费网站?  制作公司内部网站有哪些,内网如何建网站?  Firefox Developer Edition开发者版本入口  Laravel如何处理和验证JSON类型的数据库字段  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?