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

Chakra UI中Stack/div组件hover时transition过渡不生效如何解决

过渡失效原因

你的代码过渡不生效核心是两个写法问题:

  • 你只在hover状态给元素加了transition属性,非hover状态下该属性为空,元素没有常驻的过渡规则,状态切换时自然不会触发动画
  • 非hover状态的top值设置为空字符串'',不是明确的可计算长度值,浏览器无法在两个状态之间做插值过渡
  • 额外注意:isHovering初始值设为空字符串虽然能靠JS隐式转换运行,但最好初始值就设为布尔值false,避免隐式转换带来的意外问题

修复原有写法

把过渡属性设为常驻,非hover状态的top值明确设为0即可:

const Card = () => {
  const [isHovering, setHovering] = useState(false)

  const handleMouseEnter = () => setHovering(true)
  const handleMouseLeave = () => setHovering(false)

  return (
    <Stack
      style={{
        position: 'relative',
        top: isHovering ? '-10px' : '0',
        transition: 'top ease 0.5s'
      }}
      onMouseEnter={handleMouseEnter}
      onMouseLeave={handleMouseLeave}
    >
      {/* 卡片内容 */}
    </Stack>
  )
}

更推荐的Chakra UI原生方案

Chakra UI自带样式系统原生支持伪类状态和过渡配置,完全不需要手动绑定鼠标事件、维护hover状态,代码更简洁也更不容易出问题:

const Card = () => {
  return (
    <Stack
      position="relative"
      top="0"
      transition="top ease 0.5s"
      _hover={{
        top: "-10px"
      }}
    >
      {/* 卡片内容 */}
    </Stack>
  )
}

如果需要同时加其他hover效果(比如阴影变化),直接扩展对应属性即可,把transition设为all ease 0.5s就能覆盖所有属性的过渡:

<Stack
  position="relative"
  top="0"
  boxShadow="sm"
  transition="all ease 0.5s"
  _hover={{
    top: "-10px",
    boxShadow: "lg"
  }}
>
  {/* 卡片内容 */}
</Stack>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:36:29