Tailwind/CSS侧边栏过渡动画失效问题求助
解决Next.js 13中Tailwind侧边栏过渡动画不生效的问题
问题根源
你将Sidebar组件定义在Nav组件内部,每次isOpen状态变化时,Nav会触发重新渲染,Sidebar会被重新定义为全新组件。React会卸载旧的侧边栏DOM元素、挂载新元素,直接中断过渡动画流程,导致看不到平滑效果。
你提到的--tw-scale-x: 1是Tailwind全局样式的默认变换变量,本身不会阻碍过渡,但组件重建时旧DOM被移除的状态变化,让你误以为是该变量的问题。
修复方案
1. 把Sidebar移出Nav组件内部
不要在函数组件内部嵌套定义另一个组件,将Sidebar提至外部或者直接在Nav中渲染JSX元素,确保组件能被React复用:
"use client"; import { Spiral as Hamburger } from "hamburger-react"; import { useState } from "react"; // 将Sidebar组件移至Nav外部 const Sidebar = ({ isOpen }: { isOpen: boolean }) => { return ( <div className={`top-0 right-0 w-[90vw] bg-pink-800 p-10 pl-20 text-white fixed h-full z-40 transition-transform ease-in-out duration-300 ${ isOpen ? "translate-x-0" : "translate-x-full" }`} > <h2 className="mt-20 text-4xl font-semibold text-white"> I am a sidebar </h2> </div> ); }; export default function Nav() { const [isOpen, setOpen] = useState(false); return ( <div className="md:hidden"> <div className="absolute top-3 right-3 z-50"> <Hamburger toggled={isOpen} toggle={setOpen} /> </div> <Sidebar isOpen={isOpen} /> </div> ); }
2. 显式指定过渡属性(可选)
虽然Tailwind的ease-in-out duration-300默认包含transition-all,但显式添加transition-transform可以确保仅针对变换属性执行过渡,避免其他样式变化的潜在干扰:
<div className="... transition-transform ease-in-out duration-300 ...">
效果验证
修改后,Sidebar组件会被React复用,状态变化时仅修改DOM类名,而非卸载重建DOM,过渡动画就能正常触发。
内容的提问来源于stack exchange,提问作者MarasyGateau
相关产品推荐
相关产品推荐

