如何实现可拖拽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)`; }
关键说明
- data-url属性:每个CD的跳转地址存在自定义属性里,新增CD只需添加该属性即可,不用修改事件逻辑,扩展性强
- 区域重叠判断:用
getBoundingClientRect()获取元素坐标和尺寸,判断两个元素是否有重叠,可根据需求调整判断条件(比如要求CD完全落入区域才跳转) - 平滑拖拽保留:通过
dragover事件实时更新元素的transform值,实现跟随鼠标的平滑移动
内容的提问来源于stack exchange,提问作者electra
相关产品推荐
相关产品推荐

