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

React中@szhsin/react-menu被PlayerCardMini遮挡的问题求助

解决React菜单被PlayerCard遮挡的问题

问题场景

使用React.js与@szhsin/react-menu开发阵型编辑功能,右键点击PlayerCardMini时弹出的菜单(MenuItem和MenuButton)始终被其他PlayerCardMini遮挡,调整z-index无效。

核心原因

菜单组件被嵌套在PlayerCardMini内部,而PlayerCardMini设置了position: relative和z-index: 2。所有PlayerCardMini属于同一堆叠上下文,内部元素的z-index仅能在当前父元素的堆叠层级内生效,无法突破其他兄弟PlayerCardMini的层级遮挡。

解决方案:使用React Portal脱离堆叠上下文

将菜单通过React Portal挂载到DOM根节点外的独立容器,脱离PlayerCardMini的堆叠上下文,确保菜单层级高于所有卡片。

步骤1:添加Portal容器

在public/index.html中,在#root同级添加专门挂载菜单的容器:

<body>
  <div id="root"></div>
  <div id="menu-portal"></div> <!-- 新增菜单容器 -->
</body>

步骤2:修改PlayerCardMenu组件使用Portal

在PlayerCardMini.js中导入ReactDOM,并将菜单包裹在Portal中:

import ReactDOM from 'react-dom';

// ...其他代码

const PlayerCardMenu = () => {
  const menuPortal = document.getElementById('menu-portal');
  if (!menuPortal) return null;

  return ReactDOM.createPortal(
    <Menu 
      menuButton={<MenuButton
        className="menu-button"
        style={{ 
          position: 'absolute',
          left: `${menuState.x}px`, 
          top: `${menuState.y}px`,
          margin: 0
        }}     
      >Edit</MenuButton>}
      onClose={handleCloseMenu}
      className="szh-menu"
    >
      <MenuItem onClick={() => {
          if (isQueue) {
              console.log('Player being removed from queue at index: ', index);
              removePlayer(setFunction, index);
          } else {
              removePlayer(position);
          }
          handleCloseMenu();
      }}>
          Remove Player
      </MenuItem>
      {!isQueue && <MenuItem onClick={() => handleSwitch()} disabled={!canSwitch}>Switch Player</MenuItem>}
      <MenuItem onClick={toggleStatsPopup}>Show Stats Menu</MenuItem>
      <MenuItem onClick={handleCloseMenu}>Exit</MenuItem>
    </Menu>,
    menuPortal
  );
}

// ...其他代码

步骤3:调整菜单样式

修改PlayerCardMini.css中的菜单相关样式,确保Portal后的菜单正确定位且层级最高:

.szh-menu {
  position: absolute !important;
  z-index: 1000 !important;
}

.menu-button {
  border-radius: 10px;
  color: white;
  background-color: #007BFF;
  padding: 10px 20px;
  border: none;
  cursor: pointer;
  transition: background-color 0.3s ease;
  z-index: 1001;
}

/* 移除原PlayerCardMini内的菜单样式,因为现在菜单在外部容器 */
/* .player-card-mini .szh-menu { ... } 删掉这部分 */

步骤4:清理冗余代码

删除PlayerCardMini.js中原本用于挂载菜单的冗余容器:

// 移除这一行:<div id="player-card-menu-portal"></div>

原理说明

React Portal允许将组件渲染到DOM树中的任意位置,菜单被挂载到独立容器后,不再受PlayerCardMini的堆叠上下文限制。此时设置的z-index会相对于整个页面的堆叠上下文生效,自然就能覆盖所有PlayerCardMini元素。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:33:12