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
相关产品推荐
相关产品推荐

