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

React Transition Group菜单滑动过渡失效问题排查求助

React菜单左滑入过渡失效问题解决

我在React应用中使用react-transition-group的CSSTransition组件,想要实现菜单从左向右滑入的平滑过渡效果,但该功能完全无法正常工作,找不到问题根源,请求帮助排查修复。

React代码

import { useEffect, useRef } from 'react';
import Backdrop from '../Backdrop/Backdrop';
import Navigation from '../Navigation/Navigation';
import IconToggleOn from '../NavigationIcons/IconToggleOn';
import { ContentContainer } from './Menu.styled';
import { removeBodyscroll } from '../../../utils/removeBodyScroll';
import { CSSTransition } from 'react-transition-group';

const Menu = ({ menuOpen, setMenuOpen }) => {
  useEffect(() => {
    removeBodyscroll(menuOpen);
  }, [menuOpen]);

  const nodeRef = useRef(null);

  useEffect(() => {
    const handleKeyDown = e => {
      if (e.code === 'Escape') {
        setMenuOpen(false);
      }
    };
    document.addEventListener('keydown', handleKeyDown);
    return () => {
      document.removeEventListener('keydown', handleKeyDown);
    };
  }, [setMenuOpen]);

  const handleBackdropClick = e => {
    if (e.currentTarget === e.target) {
      setMenuOpen(false);
    }
  };

  const handleLinkClick = () => {
    setMenuOpen(false);
  };

  return (
    <Backdrop handleBackdropClick={handleBackdropClick}>
      <CSSTransition
        nodeRef={nodeRef}
        in={menuOpen}
        timeout={300}
        classNames="menu"
        unmountOnExit
      >
        <ContentContainer className="menus" menuOpen={menuOpen} ref={nodeRef}>
          <Navigation status="menu" handleLinkClick={handleLinkClick} />
          <IconToggleOn />
        </ContentContainer>
      </CSSTransition>
    </Backdrop>
  );
};

export default Menu;

CSS代码

.menu-enter {
  transform: translateX(-100%);
}

.menu-enter-active {
  transform: translateX(0);
  transition: transform 300ms ease-out;
}
.menu-exit {
  transform: translateX(0);
}

.menu-exit-active {
  transform: translateX(-100%);
  transition: transform 300ms ease-out;
}

问题排查与修复方案

1. 解决样式优先级冲突

你使用的ContentContainer是styled组件,它的内置样式可能覆盖了过渡类的样式。通过提高过渡类选择器权重解决:

/* 增加.menus前缀,提升选择器优先级 */
.menus.menu-enter {
  transform: translateX(-100%);
}

.menus.menu-enter-active {
  transform: translateX(0);
  transition: transform 300ms ease-out;
}

.menus.menu-exit {
  transform: translateX(0);
}

.menus.menu-exit-active {
  transform: translateX(-100%);
  transition: transform 300ms ease-out;
}

2. 调整styled组件基础样式

确保ContentContainer的基础样式不阻挡过渡,给菜单设置正确的固定定位:

// Menu.styled.js中的ContentContainer定义
export const ContentContainer = styled.div`
  position: fixed;
  top: 0;
  left: 0;
  width: 280px;
  height: 100vh;
  background-color: #fff; /* 根据设计调整颜色 */
  z-index: 100;
  /* 不要在这里设置transform,交给过渡类控制 */
`;

3. 验证unmountOnExit的影响

unmountOnExit会在过渡结束后卸载组件,可能导致退出过渡无法完整触发。可以先临时移除该属性测试,若过渡正常,再考虑保留并确保退出动画时长与timeout参数匹配。

4. 检查Backdrop组件样式

确保Backdrop不会遮挡菜单过渡,设置合理的层级:

/* Backdrop样式示例 */
.backdrop {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0,0,0,0.5);
  z-index: 99; /* 低于菜单的z-index */
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:47:12