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类型的数据库字段
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?

