用js写一个可拖拽的对话框限制对话框在可视区域内的拖动、允许用户关闭它
以下是一个简单的实现:
HTML:
<div id="dialog">
<div class="title-bar">
<span class="title">对话框</span>
<button class="close-btn">X</button>
</div>
<div class="content">
<p>这是一个可拖拽的对话框。</p>
</div>
</div>
CSS:
#dialog {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 300px;
height: 200px;
border: 1px solid #ccc;
background-color: #fff;
}
.title-bar {
position: relative;
height: 30px;
background-color: #f0f0f0;
border-bottom: 1px solid #ccc;
}
.title {
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
}
.close-btn {
position: absolute;
top: 0;
right: 0;
width: 30px;
height: 30px;
border: none;
background-color: transparent;
cursor: pointer;
}
.content {
height: calc(100% - 30px);
padding: 10px;
overflow-y: auto;
}
JS:
var dialog = document.getElementById('dialog');
var titleBar = dialog.querySelector('.title-bar');
var closeBtn = dialog.querySelector('.close-btn');
var isDragging = false;
var mouseX = 0;
var mouseY = 0;
titleBar.addEventListener('mousedown', function(e) {
isDragging = true;
mouseX = e.clientX;
mouseY = e.clientY;
});
document.addEventListener('mousemove', function(e) {
if (isDragging) {
var deltaX = e.clientX - mouseX;
var deltaY = e.clientY - mouseY;
var dialogRect = dialog.getBoundingClientRect();
var left = dialogRect.left + deltaX;
var top = dialogRect.top + deltaY;
var maxX = window.innerWidth - dialogRect.width;
var maxY = window.innerHeight - dialogRect.height;
left = Math.max(0, Math.min(left, maxX));
top = Math.max(0, Math.min(top, maxY));
dialog.style.left = left + 'px';
dialog.style.top = top + 'px';
mouseX = e.clientX;
mouseY = e.clientY;
}
});
document.addEventListener('mouseup', function() {
isDragging = false;
});
closeBtn.addEventListener('click', function() {
dialog.style.display = 'none';
});
解释:
首先通过JavaScript获取对话框及其子元素的引用,并定义一些变量用于拖拽操作。
然后,监听对话框标题栏的鼠标按下事件,将isDragging变量设为true,记录当前鼠标的位置。
接着,监听整个文档的鼠标移动事件,如果isDragging为true,则计算鼠标移动的距离,将对话框的位置进行相应的调整,但需要限制对话框的位置在可视区域内。最后,将鼠标的位置更新为当前位置。
最后,监听关闭按钮的点击事件,隐藏对话框
原文地址: https://www.cveoy.top/t/topic/g1ek 著作权归作者所有。请勿转载和采集!