You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现可拖拽CD碰撞控制台区域后跳转对应页面?

多CD拖拽跳转整合方案

核心思路

  • 给每个CD标签绑定专属跳转地址,用data-url属性存储,方便区分不同CD的跳转目标
  • 保留原有平滑拖拽的逻辑,在拖拽结束时校验CD是否落入控制台目标区域
  • 校验通过后,读取当前CD的data-url完成跳转

调整后代码示例

HTML部分

<!-- 控制台目标区域 -->
<div id="console-area" class="console">
  <img src="控制台图片路径" alt="控制台">
</div>

<!-- 多个CD元素,每个带专属data-url -->
<div class="cd" draggable="true" data-url="游戏1页面地址">
  <img src="CD1图片路径" alt="游戏1CD">
</div>
<div class="cd" draggable="true" data-url="游戏2页面地址">
  <img src="CD2图片路径" alt="游戏2CD">
</div>

CSS部分(保留平滑拖拽的视觉反馈)

.console {
  width: 300px;
  height: 200px;
  border: 2px dashed #ccc;
  margin: 20px auto;
}
.cd {
  width: 100px;
  height: 100px;
  cursor: grab;
  position: absolute;
  /* 自定义CD样式 */
}
.cd.dragging {
  opacity: 0.7;
  cursor: grabbing;
}

JS部分(整合平滑拖拽+区域判断+跳转)

// 获取控制台区域和所有CD元素
const consoleArea = document.getElementById('console-area');
const cds = document.querySelectorAll('.cd');

// 给每个CD绑定拖拽事件
cds.forEach(cd => {
  let posX = 0, posY = 0, initialX = 0, initialY = 0;

  // 开始拖拽
  cd.addEventListener('dragstart', function(e) {
    initialX = e.clientX - posX;
    initialY = e.clientY - posY;
    this.classList.add('dragging');
  });

  // 拖拽中实现平滑跟随
  cd.addEventListener('dragover', function(e) {
    e.preventDefault();
    posX = e.clientX - initialX;
    posY = e.clientY - initialY;
    setTranslate(posX, posY, this);
  });

  // 拖拽结束,判断是否在控制台区域
  cd.addEventListener('dragend', function() {
    this.classList.remove('dragging');
    // 获取两个元素的位置信息
    const consoleRect = consoleArea.getBoundingClientRect();
    const cdRect = this.getBoundingClientRect();

    // 判断CD是否与控制台区域重叠
    const isOverlap = !(
      cdRect.right < consoleRect.left ||
      cdRect.left > consoleRect.right ||
      cdRect.bottom < consoleRect.top ||
      cdRect.top > consoleRect.bottom
    );

    if (isOverlap) {
      // 跳转至当前CD对应的页面
      window.location.href = this.dataset.url;
    }
  });
});

// 辅助函数:设置元素位置实现平滑拖拽
function setTranslate(xPos, yPos, el) {
  el.style.transform = `translate(${xPos}px, ${yPos}px)`;
}

关键说明

  1. data-url属性:每个CD的跳转地址存在自定义属性里,新增CD只需添加该属性即可,不用修改事件逻辑,扩展性强
  2. 区域重叠判断:用getBoundingClientRect()获取元素坐标和尺寸,判断两个元素是否有重叠,可根据需求调整判断条件(比如要求CD完全落入区域才跳转)
  3. 平滑拖拽保留:通过dragover事件实时更新元素的transform值,实现跟随鼠标的平滑移动

内容的提问来源于stack exchange,提问作者electra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:17:17