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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:15:32