javascript - HTML元素拖动的约束问题
问题描述
我以限制是父容器的方式制作了用于在我的反应应用程序周围拖动元素的脚本。我实现了我想要的,但不是以我想要的方式。我希望当我达到限制时阻止该轴尝试更进一步,以避免脚本计算和返回 div 的这种烦人的影响。
const drag = (id) => {
const element = document.getElementById(id);
const parent = element.parentNode;
let newState = { x: 0, y: 0 };
let oldState = { x: 0, y: 0 };
const dragElement = (e) => {
e = e || window.event;
e.preventDefault();
oldState.x = e.clientX;
oldState.y = e.clientY;
document.onmouseup = stopDrag;
document.onmousemove = startDrag;
};
const startDrag = (e) => {
e = e || window.event;
e.preventDefault();
newState.x = oldState.x - e.clientX;
newState.y = oldState.y - e.clientY;
oldState.x = e.clientX;
oldState.y = e.clientY;
const handleX = () => {
let x = 0;
if (element.offsetLeft < 0) {
x = 0;
} else if (element.offsetLeft + element.offsetWidth > parent.offsetWidth) {
x = parent.offsetWidth - element.offsetWidth;
} else {
x = element.offsetLeft - newState.x;
}
return `${x}px`;
};
const handleY = () => {
let y = 0;
if (element.offsetTop < 0) {
y = 0;
} else if (element.offsetTop + element.offsetHeight > parent.offsetHeight) {
y = parent.offsetHeight - element.offsetHeight;
} else {
y = element.offsetTop - newState.y;
}
return `${y}px`;
};
element.style.top = handleY();
element.style.left = handleX();
};
const stopDrag = () => {
document.onmouseup = null;
document.onmousemove = null;
};
if (document.getElementById(element.id + "Header")) {
document.getElementById(element.id + "Header").onmousedown = dragElement;
} else {
element.onmousedown = dragElement;
}
};
drag("test");
.parent {
display: flex;
justify-content: center;
align-items: center;
position: absolute;
inset: 16px;
background: red;
}
.draggable {
position: absolute;
width: 50px;
height: 50px;
background: green;
}
<div class="parent">
<div class="draggable" id="test"></div>
</div>
解决方案
推荐阅读
- lumen - Lumen trait DatabaseTransactions 似乎覆盖了测试中的连接设置
- python - 如何将值除以月份中的天并在 Pandas 中创建天列?
- php - WordPress中的“调用未定义函数”
- docker - nginx 仅服务/但不服务任何其他文件
- javascript - React Native - 浮动(或弹出)屏幕问题
- vue.js - Azure APIM 在预检和从 axios 发出的 GET 请求时返回空响应正文,状态代码为 200
- r - 如何在 R/Shiny 中为每个用户仅显示一次(模态)弹出窗口?
- elasticsearch - 如何使 Elasticsearch 与排名模型一起工作?
- asp.net-mvc - Google reCAPTCHA 令牌为空
- c++ - 如何让 CMake 用两种不同的语言编译相同的输入文件?