Javascript 嵌套动态高度过渡效果
试图创建一个可重用的折叠组件,但是在元素上进行平滑转换会遇到问题。因此,当单击折叠项时,我希望平滑过渡 以下是我迄今为止尝试的主要部分 index.jsJavascript 嵌套动态高度过渡效果,javascript,css,reactjs,Javascript,Css,Reactjs,试图创建一个可重用的折叠组件,但是在元素上进行平滑转换会遇到问题。因此,当单击折叠项时,我希望平滑过渡 以下是我迄今为止尝试的主要部分 index.js const Collapse = ({ title, text, child, ...props }) => { const [isOpen, setIsOpen] = useState(false); const toggleCollapse = () => setIsOpen((isOpen) => !isOpe
const Collapse = ({ title, text, child, ...props }) => {
const [isOpen, setIsOpen] = useState(false);
const toggleCollapse = () => setIsOpen((isOpen) => !isOpen);
const closeCollapse = () => setIsOpen(false);
const content = useRef(null);
const isParentOpen = props.isParentOpen;
useEffect(() => {
if (!isParentOpen) closeCollapse();
}, [isParentOpen]);
const height = !isOpen ? "0px" : `auto`; // ${content.current?.scrollHeight}px
return (
<CollapseContainer>
<CollapseButton isOpen={isOpen} onClick={toggleCollapse}>
<CollapseTitleWrapper>{title}</CollapseTitleWrapper>
</CollapseButton>
<CollapseContent ref={content} max_height={height}>
<CollapseText>
{text}
{child?.map((datumn, index) => (
<Collapse
{...datumn}
key={`collapse-child-${index}`}
isParentOpen={isOpen}
/>
))}
</CollapseText>
</CollapseContent>
</CollapseContainer>
);
};
export default Collapse;
const Collapse=({title,text,child,…props})=>{
常量[isOpen,setIsOpen]=useState(false);
常量toggleCollapse=()=>setIsOpen((isOpen)=>!isOpen);
const closeCollapse=()=>setIsOpen(false);
const content=useRef(null);
常量isParentOpen=props.isParentOpen;
useffect(()=>{
如果(!isParentOpen)closeCollapse();
},[isParentOpen]);
常量高度=!isOpen?“0px”:“自动”;//${content.current?.scrollHeight}px
返回(
{title}
{text}
{child?.map((datumn,index)=>(
))}
);
};
出口违约崩溃;
因此,我能够使用ref动态计算内容的高度,但会发生平滑转换,但我会在嵌套的子折叠中得到一个我不想要的滚动。有没有办法在高度上应用过渡:自动
以下是使用视口单位的工作原理->
100vh
另外,为了隐藏临时滚动条,我应用了overflow:hidden
toexport const CollapseContent=styled.div
您的代码笔已修改:使用以下命令获取元素的高度:
Ref.current.getBoundingClientRect().height
转换开始时,添加样式
overflow:hidden
以防止滚动条,然后创建一个函数,在转换完成时(如果需要),使用onTransitionEnd
在转换元素上调用该函数以重新激活溢出.不可能使用带有auto
关键字的CSS动画。一种可能的解决方案是使用height
而不是maxHeight
和overflow:hidden
并在动画完成时将height
设置为auto
。我建议使用WAAPI(Web动画API),因为它简化了js中动画的使用,并且不会冒泡css转换之类的事件
这里有一个例子:我认为你应该改变这个概念,这是可行的,简单的CSS动画是更优化的方式,并允许你创建自定义效果 首先,我们定义两个动画(打开和关闭):
。已打开{
动画:是打开0.3s轻松两个;
}
@关键帧处于打开状态{
从{
不透明度:0;
变换:scaleY(0);
}
到{
不透明度:1;
变换:scaleY(1);
身高:100%;
}
}
及
。已关闭{
动画:关闭0.3s,使两者都轻松;
}
@关键帧已关闭{
从{
不透明度:1;
变换:scaleY(1);
}
到{
不透明度:0;
变换:scaleY(0);
身高:0;
}
}
现在我们只需要一个处理这些动画的条件类:
<CollapseContent
ref={content}
className={isOpen ? "is-open" : "is-closed"}
>
不,您不能过渡到自动,因为许多问题都涉及到了这一点。听起来你需要在需要之前关闭溢出。那么有没有其他方法来实现这一点?@Paulie_D如果我使用onTransitionEnd事件,那么在打开手风琴时,我将能够在没有滚动和平滑过渡事件的情况下显示,但是当关闭时,它将不起作用。是否有任何方法可以实现这一点?您可以进行平滑过渡,但为此,您需要根据滚动高度来确定高度。因此,这就是如何获得动态高度并在高度上写入转换。您是否愿意安装npm包来解决此问题?我已经在几个项目中使用过这个方法:但是如果我的内容得到更多的嵌套,那么它是正确的解决方案吗?使用这个100vh将是一个正确的解决方案,因为我试图计算嵌套子对象的实际高度,以便准确。由于我们正在应用溢出隐藏,内容是否无法显示?在你提到的codesandbox上,当打开折叠时,它没有正确地设置动画,但是当关闭它时,它正确地显示原因是什么?@dev-你能在沙盒中添加一个例子说明你的意思吗?谢谢@Kiglish,有什么想法吗this@dev-这导致了404错误@Kinglish抱歉,
<CollapseContent
ref={content}
className={isOpen ? "is-open" : "is-closed"}
>