【发布时间】:2021-08-23 01:59:45
【问题描述】:
试图创建一个可重用的折叠组件,但在元素上平滑过渡时出现问题。所以当点击折叠项时,我希望有一个平滑的过渡
这是我迄今为止尝试过的主要部分。
index.js
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;
所以我可以使用 ref 动态计算内容的高度,但会发生平滑过渡,但我会在嵌套的子折叠内得到一个滚动,这是我不想要的。有没有办法在 height:auto 上应用过渡。
这是工作的codesandbox
【问题讨论】:
-
不,您不能像许多 SO 问题所涵盖的那样转换到自动。听起来您需要在需要时关闭溢出。
-
那么还有其他方法可以实现吗?
-
@Paulie_D 如果我使用 onTransitionEnd 事件,那么在打开手风琴时,我将能够在没有滚动和平滑过渡事件的情况下显示,但是在关闭时它不起作用有没有办法实现这一点
-
您可以进行平滑过渡,但为此您需要根据 scrollHeight 创建高度。这就是你如何获得动态高度并在高度上编写过渡。
-
你愿意安装一个 npm 包来解决这个问题吗?我在几个项目中使用过这个:npmjs.com/package/react-animate-height
标签: javascript css reactjs