以下是一个简单的实现:

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,则计算鼠标移动的距离,将对话框的位置进行相应的调整,但需要限制对话框的位置在可视区域内。最后,将鼠标的位置更新为当前位置。

最后,监听关闭按钮的点击事件,隐藏对话框

用js写一个可拖拽的对话框限制对话框在可视区域内的拖动、允许用户关闭它

原文地址: https://www.cveoy.top/t/topic/g1ek 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录