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

如何用CSS实现菜单平滑展开?React中过渡动画不生效问题排查

问题核心原因

你使用了条件渲染逻辑{activeMenu && <nav />},当activeMenu为false时,菜单元素会直接从DOM树中被移除;当activeMenu切换为true时,菜单才会重新挂载到DOM中,且挂载时就已经带上了active类。
CSS过渡动画的触发前提是同一个DOM元素的属性/类名发生前后变化,你的逻辑中元素每次显示都是全新生成的,没有从非激活类到激活类的切换过程,因此过渡不会生效。

修复方案

1. 移除菜单的条件渲染判断

保留菜单元素始终在DOM中,仅通过类名切换控制状态,修改后的React代码如下:

import React, {useState} from "react";
export let Menu_Button = () => {
  let [activeMenu, SetActiveMenu] = useState(false);

  return (
    <div>
      <div className='button_mobile' onClick={() => SetActiveMenu(!activeMenu)}>
        <span></span>
      </div>
      {/* 删掉外层的activeMenu条件判断,始终渲染nav元素 */}
      <nav className={activeMenu ? 'menu active' : 'menu'}>
        <div><a href='#'>BBBBBBBBBB</a></div>
        <div><a href='#'>BBBBBBBBBB</a></div>
        <div><a href='#'>BBBBBBBBBB</a></div>
        <div><a href='#'>BBBBBBBBBB</a></div>
        <div><a href='#'>BBBBBBBBBB</a></div>
      </nav>
    </div>
  )
}

2. 可选CSS优化

如果要避免菜单隐藏时还能被点击触发交互,可以补充visibility和opacity属性让过渡更自然:

.menu{
  position: absolute;
  top: 100%;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: 115px;
  background-color: orange;
  transform: translateX(-100%);
  transition: all 0.3s;
  visibility: hidden;
  opacity: 0;
}

.menu.active{
  transform: translateX(0);
  visibility: visible;
  opacity: 1;
}

如果修改后偏移位置不符合预期,检查菜单的父级元素是否设置了position: relative,确保transform的偏移基准是你预期的父容器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 20:45:03