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

Next.js组件中Tailwind Transition过渡效果失效问题排查

解决Next.js中Tailwind侧边栏过渡动画不生效的问题

在Next.js组件中使用Tailwind的ease-out过渡效果时,侧边栏从左到右500ms展开的动画始终不生效。开发者工具显示过渡类已正确挂载,但动画效果完全没出现。相关代码如下:

"use client"
import Image from "next/image"
import React, { useState } from 'react'
import profile from '../../assets/images/profile.png'
import { buttonprops } from "@/data/Data";
import NavLinks from "./NavLinks/NavLinks";
import { ButtonType } from "@/types/button";
import { faBars } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";


const Navbar = () => {
    const [isVisible, setIsVisible] = useState(false);
    const toggleVisibility = () => {
        console.log("item is being clicked and vlaue of visibie is " + isVisible)
        setIsVisible(!isVisible);
    };
    const handleMouseClick = () => {
        if (isVisible) {
            setIsVisible(!isVisible);
        }
    }
    return (
        <div className="flex flex-row">
            <div className={`flex border border-black `}>
                <div className="flex row border border-black md:hidden">
                    <div className="flex w-44 h-14 border items-center border-black pl-4">
                        <FontAwesomeIcon className="text-3xl" onClick={toggleVisibility} icon={faBars} />
                    </div>
                </div>

                <div className={`md:block w-44 h-screen border border-black text-white ${isVisible ? 'absolute transition w-80 duration-300 ease-in-out' : 'hidden'} `}>
                    <div className="flex flex-col items-center pt-5 pb-10 border bg-slate-200">
                        <Image src={profile} width={500} height={500} className="rounded-full w-32 h-32 border-4  border-blue-500" alt="Picture of the author" />
                    </div>

                    <div style={{ backgroundColor: '#222e50' }} className="flex flex-col h-full ">
                        {buttonprops.map((data, i) => {
                            return <NavLinks key={i} name={data.name} icon={data.icon} />;
                        })}
                    </div>
                </div>

            </div>

            <div onClick={handleMouseClick} className="border border-black w-full h-screen">
                <div className="flex border h-14 w-full border-black items-center justify-center md:hidden">
                    <div className="hi"> Data </div>
                </div>
                <div className="w-full">
                    Content
                </div>
            </div>
        </div>
    )
}

export default Navbar

问题分析与修复方案

  1. 替换hidden类,避免元素直接被移除
    hidden会设置display: none,元素从DOM流中消失,过渡动画根本无法触发。改用opacity-0 translate-x-full来隐藏,元素仍保留在DOM中,只是视觉上不可见且移出视口,过渡能正常生效。

  2. 统一基础样式,确保过渡属性持续存在
    把过渡相关的类(transition-all duration-500 ease-out)放到基础类中,不要只在显示状态添加。同时调整定位的基础设置,让状态切换时属性能平滑变化。

修改后的代码

"use client"
import Image from "next/image"
import React, { useState } from 'react'
import profile from '../../assets/images/profile.png'
import { buttonprops } from "@/data/Data";
import NavLinks from "./NavLinks/NavLinks";
import { ButtonType } from "@/types/button";
import { faBars } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";


const Navbar = () => {
    const [isVisible, setIsVisible] = useState(false);
    const toggleVisibility = () => {
        console.log("item is being clicked and vlaue of visibie is " + isVisible)
        setIsVisible(!isVisible);
    };
    const handleMouseClick = () => {
        if (isVisible) {
            setIsVisible(!isVisible);
        }
    }
    return (
        <div className="flex flex-row">
            <div className={`flex border border-black `}>
                <div className="flex row border border-black md:hidden">
                    <div className="flex w-44 h-14 border items-center border-black pl-4">
                        <FontAwesomeIcon className="text-3xl" onClick={toggleVisibility} icon={faBars} />
                    </div>
                </div>

                {/* 关键修改:统一基础样式,替换hidden为位移+透明度过渡 */}
                <div className={`md:block absolute top-0 left-0 h-screen border border-black text-white transition-all duration-500 ease-out w-44 ${isVisible ? 'translate-x-0 opacity-100' : '-translate-x-full opacity-0'} `}>
                    <div className="flex flex-col items-center pt-5 pb-10 border bg-slate-200">
                        <Image src={profile} width={500} height={500} className="rounded-full w-32 h-32 border-4  border-blue-500" alt="Picture of the author" />
                    </div>

                    <div style={{ backgroundColor: '#222e50' }} className="flex flex-col h-full ">
                        {buttonprops.map((data, i) => {
                            return <NavLinks key={i} name={data.name} icon={data.icon} />;
                        })}
                    </div>
                </div>

            </div>

            <div onClick={handleMouseClick} className="border border-black w-full h-screen">
                <div className="flex border h-14 w-full border-black items-center justify-center md:hidden">
                    <div className="hi"> Data </div>
                </div>
                <div className="w-full">
                    Content
                </div>
            </div>
        </div>
    )
}

export default Navbar

额外说明

  • 把过渡时长改为了duration-500,符合你要求的500ms展开需求
  • 使用translate-x-full和-translate-x-full实现从左到右的滑入滑出效果
  • 如果需要展开后宽度变化,可以把基础类的w-44改为w-0,显示状态添加w-80,transition-all已经包含宽度属性的过渡

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:10:33