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

鼠标悬停时Div覆盖绝对定位元素的问题排查

问题:右侧悬浮Div覆盖居中绝对定位Div的层级问题

我用MUI Box开发组件:两个蓝色Div置于居中的红色绝对定位Div后方,要求后方Div边缘可见。设置鼠标悬停时Div缩放至1.2倍,左侧蓝色Div表现正常,但右侧蓝色Div悬停时会跑到红色居中Div前方,挡住它。技术栈为Material UI + Framer Motion。

代码如下:

<div className="App">
  <Box
    sx={{
      display: "flex",
      flexDirection: "row",
      width: "100%",
      height: "500px",
      justifyContent: "space-around",
    }}
  >
    <Box
      component={motion.div}
      whileHover={{
        scale: 1.2,
      }}
      sx={{
        display: "block",
        width: "40%",
        height: "40%",
        backgroundColor: "blue",
      }}
    />
    <Box
      component={motion.div}
      sx={{
        width: "60%",
        height: "30%",
        position: "absolute",
        backgroundColor: "red",
      }}
      initial={{
        opacity: 1,
        scale: 1,
      }}
      whileHover={{
        scale: 1.1,
      }}
      animate={{}}
      transition={{
        duration: 0.5,
        ease: "easeInOut",
      }}
    />
    <Box
      component={motion.div}
      whileHover={{
        scale: 1.2,
      }}
      sx={{
        display: "block",
        width: "40%",
        height: "40%",
        backgroundColor: "blue",
      }}
    />
  </Box>
</div>

问题原因

DOM结构中右侧蓝色Div排在红色绝对定位Div之后,默认堆叠层级更高。当右侧Div缩放时,就会覆盖在红色Div上方;而左侧Div在红色Div之前,默认层级更低,缩放后不会覆盖。

解决方法

给红色绝对定位Div设置更高的z-index,确保它始终处于两个蓝色Div上层:

修改后的红色Box代码:

<Box
  component={motion.div}
  sx={{
    width: "60%",
    height: "30%",
    position: "absolute",
    backgroundColor: "red",
    zIndex: 1, // 添加层级控制
  }}
  initial={{
    opacity: 1,
    scale: 1,
  }}
  whileHover={{
    scale: 1.1,
  }}
  animate={{}}
  transition={{
    duration: 0.5,
    ease: "easeInOut",
  }}
/>

也可以给两个蓝色Div设置zIndex: 0,效果一致。调整后无论哪个Div缩放,红色Div都会保持在最上层。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:35:00