# 页面-组件-自由拖放

可应用于座位布置等

image-20240719173859911

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>座位表</title>
<style>
  .seat {
    width: 50px;
    height: 50px;
    background-color: #ccc;
    margin: 5px;
    display: inline-block;
    cursor: pointer;
    position: absolute;
  }
  .locked {
    background-color: #999;
  }
</style>
</head>
<body>

<h2>座位表</h2>

<div id="seatMap">
  <!-- 这里是你的座位 -->
</div>

<script>
  let isDragging = false;
  let currentSeat = null;

  // 创建座位的函数
  function createSeat(id, top, left) {
    const seat = document.createElement('div');
    seat.classList.add('seat');
    seat.dataset.id = id;
    seat.style.top = top + 'px';
    seat.style.left = left + 'px';
    seat.addEventListener('click', toggleLock);
    seat.addEventListener('mousedown', startDrag);
    return seat;
  }

  // 切换锁定状态的函数
  function toggleLock(event) {
    const seat = event.target;
    seat.classList.toggle('locked');
  }

  // 开始拖放
  function startDrag(event) {
    isDragging = true;
    currentSeat = event.target;
    const rect = currentSeat.getBoundingClientRect();
    offsetX = event.clientX - rect.left;
    offsetY = event.clientY - rect.top;
  }

  // 结束拖放
  function endDrag() {
    isDragging = false;
  }

  // 拖动时更新座位位置
  function drag(event) {
    if (isDragging && currentSeat) {
      currentSeat.style.top = (event.clientY - offsetY) + 'px';
      currentSeat.style.left = (event.clientX - offsetX) + 'px';
    }
  }

  // 生成座位表
  function generateSeatMap(numSeats) {
    const seatMap = document.getElementById('seatMap');
    for (let i = 1; i <= numSeats; i++) {
      // 初始位置设定为(i * 60, 50),以50px为间距
      const seat = createSeat(i, i * 60, 50);
      seatMap.appendChild(seat);
    }
  }

  // 生成一个简单的座位表,座位数为10
  generateSeatMap(10);

  // 添加拖放事件监听器到整个文档
  document.addEventListener('mousemove', drag);
  document.addEventListener('mouseup', endDrag);
</script>

</body>
</html>