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

React内联样式实现卡片左右滑入滑出动画遇阻求助

React内联样式实现滑入滑出动画解决方案

你的代码问题在于条件渲染直接挂载/卸载元素,导致transition无法生效——transition需要元素的样式属性从一个值平滑过渡到另一个,而不是元素突然出现或消失。以下是实现目标动画的修改方案:

核心思路

  1. 始终渲染卡片元素,通过样式属性(而非条件渲染)控制显示/隐藏状态
  2. 用transform: translateX()实现左右滑动效果,搭配opacity实现淡入淡出
  3. 通过transition指定过渡属性,确保样式变化平滑触发

修改后的代码

import { useState, useEffect } from "react";

export default function App() {
  const [toggle, setToggle] = useState(false);
  // 控制动画状态的变量,与toggle分离以保证过渡生效
  const [isCardVisible, setIsCardVisible] = useState(false);

  useEffect(() => {
    if (toggle) {
      // 点击显示时,触发滑入动画
      setIsCardVisible(true);
    } else {
      // 点击隐藏时,触发滑出动画
      setIsCardVisible(false);
    }
  }, [toggle]);

  return (
    <>
      <button onClick={() => setToggle(!toggle)}>toggle button</button>
      <div
        style={{
          display: "flex",
          zIndex: 1,
          marginLeft: 170,
          backgroundColor: "tomato",
          width: 200,
          height: 300,
          // 透明度过渡
          opacity: isCardVisible ? 1 : 0,
          // 左右滑动过渡:滑入时回到原位,滑出时向左移出视野
          transform: isCardVisible ? "translateX(0)" : "translateX(-100%)",
          // 指定过渡属性、时长和缓动函数
          transition: "transform 0.5s ease-in-out, opacity 0.5s ease-in-out",
          // 可选:如果希望隐藏后不占空间,添加绝对定位
          // position: "absolute",
        }}
      >
        <p style={{ margin: "0px" }}>animation</p>
      </div>
    </>
  );
}

关键细节说明

  • 避免用display: none或条件渲染控制元素显隐:这类操作会直接移除/添加DOM节点,无法触发transition
  • 分离toggle和isCardVisible状态:保证动画有足够时间完成,而不是直接卸载元素
  • 自定义过渡参数:可以调整0.5s为你需要的动画时长,ease-in-out让动画前后阶段更平缓

如果需要在滑出动画结束后完全移除元素,可以添加onAnimationEnd事件监听,在动画完成后再切换渲染状态:

// 新增useRef和动画结束处理函数
const cardRef = useRef<HTMLDivElement>(null);
const [shouldRenderCard, setShouldRenderCard] = useState(true);

const handleAnimationEnd = () => {
  if (!isCardVisible) {
    setShouldRenderCard(false);
  }
};

// 在useEffect中,当toggle为true时重新渲染卡片
useEffect(() => {
  if (toggle) {
    setShouldRenderCard(true);
    setIsCardVisible(true);
  } else {
    setIsCardVisible(false);
  }
}, [toggle]);

// 渲染时添加判断
{shouldRenderCard && (
  <div ref={cardRef} onAnimationEnd={handleAnimationEnd} style={/* ... */}>
    {/* ... */}
  </div>
)}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:01:09