我正在显示一个项目列表。每个项目都有一个标题和一些内容。单击标题时,每个项目的高度将展开/折叠。每个项目内容的高度是动态的。
我得到了下面的代码(见下文),它的工作。但是,在用户点击.header
和转换开始之间会有一个轻微的延迟。
这种延迟似乎是由我使用max-height: min-content
引入的。我相信浏览器需要一点时间来重新计算添加/删除.isCollapsed
类后内容的高度。
我想知道有没有更正确的方法可以达到这种效果?
如果我删除max-height: min-content
,那么.item
上的flex: 1
会使每个项目在展开时具有相同的高度。这是不期望的。我希望每件物品的高度与其内容相符。
我不想要一个需要我测量JavaScript或类似文本的解决方案。我们的目标是利用flexbox来执行转换,而不需要知道content
的高度。
$('.header').click(function() {
$(this).parent().toggleClass('isCollapsed');
});
*,
*::before,
*::after {
box-sizing: border-box;
}
html,
body {
height: 100%;
margin: 0;
}
ul,
li {
list-style: none;
margin: 0;
padding: 0;
}
.items {
display: flex;
flex-direction: column;
height: 100%;
flex: 1;
}
.item {
display: flex;
flex-direction: column;
overflow: hidden;
min-height: 48px;
transition: flex-grow 1s;
flex: 1;
max-height: min-content;
}
.header {
display: flex;
height: 48px;
padding: 16px;
align-items: center;
flex-shrink: 0;
}
.isCollapsed {
flex-grow: .001;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class='items'>
<li class='item'>
<div class='header'>Item A Header</div>
<div class='content'>Item A Content This content is</br>
really</br>
really</br>
really</br>
really</br>
long.
</div>
</li>
<li class='item'>
<div class='header'>Item B Header</div>
<div class='content'>
Item B Content This content is</br>
short.
</div>
</li>
</ul>
3条答案
按热度按时间x7rlezfr1#
在下面的代码块中,有一些提高效率的空间。
字符串
您正在使用
min-height
和flex
。但是对于flex
,实际上并不需要min-height
。试试这个:
型
我这边已经没有延迟了。
DEMO
<br>
标记(</br>
无效)。*s4chpxco2#
这是一个版本,它为不支持
min-content
的浏览器提供了一个后备。人们总是可以使用
max-height
和transition-duration
的值来实现更平滑的过渡,尽管要使其完美,并假设content
的高度不是静态的,我(今天)在没有脚本的情况下看不到这种情况。min-content
),可见过渡效果在不同视口大小上的速度不同,而max-height
版本没有。wljmcqd83#
使用flex-box:
使用网格:
注意:我知道这个问题是关于flex-grow的,但我相信它的意图更接近于“如何用css动画 accordion ”。这个问题恰好是我在谷歌上的第一个点击。我没有想到这个,但它来自https://keithjgrant.com/posts/2023/04/transitioning-to-height-auto/