React内联样式实现卡片左右滑入滑出动画遇阻求助
React内联样式实现滑入滑出动画解决方案
你的代码问题在于条件渲染直接挂载/卸载元素,导致transition无法生效——transition需要元素的样式属性从一个值平滑过渡到另一个,而不是元素突然出现或消失。以下是实现目标动画的修改方案:
核心思路
- 始终渲染卡片元素,通过样式属性(而非条件渲染)控制显示/隐藏状态
- 用
transform: translateX()实现左右滑动效果,搭配opacity实现淡入淡出 - 通过
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
相关产品推荐
相关产品推荐

