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

CSS/JS开发纸牌游戏 如何让移动的卡片始终置于最顶层

纸牌游戏卡片层级异常修复方案

问题现象

使用HTML/CSS/JavaScript开发纸牌游戏时,已实现「点击第一张卡片再点击第二张卡片,第一张卡片移动到第二张卡片位置、y轴偏移20px」的交互,但移动方块K到方块Q位置时,方块K会显示在方块Q下方,需要实现被移动卡片始终置于视觉最顶层的效果。

附原有实现代码:

原有JS代码

var x1 = '';
var x2 = '';
var y1 = '';
var y2 = '';
var img1 = '';

function move(id) {
  var id = document.getElementById(id);
  Pr('0');
  if (img1 == '') {
    Pr('1');
    img1 = id;
    Pr(img1);
    var box1 = id.getBoundingClientRect();
    x1 = box1.left + box1.width * 0.5;
    y1 = box1.top + box1.height * 0.5;
  } else if (img1 != '') {
    Pr('2');
    img2 = id;
    Pr(img2);
    var box2 = id.getBoundingClientRect();
    x2 = box2.left;
    y2 = box2.top + 20;
    img1.style.cssText = 'left:' + x2 + 'px;top:' + y2 + 'px;';

  };

  Pr('x1 = ' + x1 + ' | y1 = ' + y1 + ' | x2 = ' + x2 + ' | y2 = ' + y2);
};

function Pr(str) {
  console.log(str)
};

原有CSS代码

.card {
  height: 100px;
  position: fixed;
}

原有HTML代码

<div style='position:relative;'>
  <img class='card' style='left:150px;' id='KD' onclick='move("KD")' src='Cards/Diamonds/K.png'>
  <img class='card' id='QD' src="Cards/Diamonds/Q.png" onclick='move("QD")' style=''>
</div>

问题原因

设置了position: fixed/absolute/relative的定位元素,堆叠顺序由z-index属性控制:DOM结构中后渲染的元素默认层级更高,原有代码移动卡片时没有修改被移动卡片的z-index,因此DOM中靠前的方块K移动后,层级依然低于后渲染的方块Q,就会显示在下方。

修复方法

维护一个全局层级计数器,每次移动卡片时将计数器自增,赋值给被移动卡片的z-index属性,保证被移动卡片的层级永远高于其他所有卡片,即可实现置顶效果。同时补充移动完成后清空选中卡片的逻辑,修复原有交互的逻辑漏洞。

修改后JS代码

var x1 = '';
var x2 = '';
var y1 = '';
var y2 = '';
var img1 = '';
// 全局层级计数器,初始值设为较高值避免和页面其他元素冲突
let maxZIndex = 100;

function move(id) {
  var currentCard = document.getElementById(id);
  Pr('0');
  if (img1 == '') {
    Pr('1');
    img1 = currentCard;
    Pr(img1);
    var box1 = currentCard.getBoundingClientRect();
    x1 = box1.left + box1.width * 0.5;
    y1 = box1.top + box1.height * 0.5;
  } else if (img1 != '') {
    Pr('2');
    img2 = currentCard;
    Pr(img2);
    var box2 = currentCard.getBoundingClientRect();
    x2 = box2.left;
    y2 = box2.top + 20;
    // 提升被移动卡片的层级到最高
    maxZIndex++;
    img1.style.cssText = `left:${x2}px;top:${y2}px;z-index:${maxZIndex};`;
    // 移动完成后清空选中的第一张卡片,支持下一次选卡移动
    img1 = '';
  };

  Pr('x1 = ' + x1 + ' | y1 = ' + y1 + ' | x2 = ' + x2 + ' | y2 = ' + y2);
};

function Pr(str) {
  console.log(str)
};

CSS和HTML代码无需修改,原有.card类已经设置了position: fixed,z-index属性可以正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:09:49