【发布时间】:2016-09-26 13:31:15
【问题描述】:
我有一种情况,例如,我有一个一个接一个的小盒子,我希望用户能够切换这些元素的显示/隐藏,我让它们按我想要的方式工作,但是当相应的框被折叠/隐藏它下面的内容也不会向上折叠。
我理解为什么会这样,这是因为使用transform 它仍然为您从其原始位置转换出来的元素分配空间;但是,由于某种原因,我无法以与使用负数 margin-top 相同的方式找到另一种方法来实现它的动画效果,而不像 transform 那样流畅。
CodePen: http://codepen.io/gutterboy/pen/GqRoJY
CodePen(margin-top 版本): http://codepen.io/gutterboy/pen/WxNGVG
HTML:
<div class="foo">
<header>
Header
<a href="#" class="toggle" data-content-id="1">Toggle</a>
</header>
<div class="content-wrap">
<div id="content-1" class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cur id non ita fit? Et ille ridens: Video, inquit, quid agas; Quorum altera prosunt, nocent altera. Nulla erit controversia. Neutrum vero, inquit ille. Quis non odit sordidos, vanos, leves, futtiles?
Duo Reges: constructio interrete. Quare ad ea primum, si videtur;
</div>
</div>
</div>
<div class="foo">
<header>
Header
<a href="#" class="toggle" data-content-id="2">Toggle</a>
</header>
<div class="content-wrap">
<div id="content-2" class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cur id non ita fit? Et ille ridens: Video, inquit, quid agas; Quorum altera prosunt, nocent altera. Nulla erit controversia. Neutrum vero, inquit ille. Quis non odit sordidos, vanos, leves, futtiles?
Duo Reges: constructio interrete. Quare ad ea primum, si videtur;
</div>
</div>
</div>
<div class="foo">
<header>
Header
<a href="#" class="toggle" data-content-id="3">Toggle</a>
</header>
<div class="content-wrap">
<div id="content-3" class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cur id non ita fit? Et ille ridens: Video, inquit, quid agas; Quorum altera prosunt, nocent altera. Nulla erit controversia. Neutrum vero, inquit ille. Quis non odit sordidos, vanos, leves, futtiles?
Duo Reges: constructio interrete. Quare ad ea primum, si videtur;
</div>
</div>
</div>
CSS (SCSS):
.foo {
margin: 10px;
width: 400px;
header {
padding: 10px;
border: 1px solid #000;
border-bottom: 2px solid #000;
}
.content-wrap {
overflow-y: hidden;
transform-style: preserve-3d;
}
.content {
padding: 10px;
background-color: gray;
transform: translateY(0);
border: 1px solid #000;
border-top: none;
transition: 1s;
&.closed {
transform: translateY(-100%);
}
}
}
JS(jQuery):
$(document).ready(function() {
$('.toggle').on('click', function(e) {
e.preventDefault();
var content_id = $(this).data('content-id');
$('#content-' + content_id).toggleClass('closed');
});
});
有没有办法让下面的框在进行中的框同时折叠平滑?
还要注意,盒子的高度是可变的,因此我们不能使用height,希望避免使用非常高的max-height 之类的hacky 解决方案,并且最好避免使用任何JS 来制作动画。
【问题讨论】:
-
你用的是什么浏览器?第二个版本对我来说非常顺利。 (最新的 Chrome)
-
我假设移动所有与折叠的 div 相关的 div 可能会导致一些滞后。如果这是问题所在,那么对此无能为力。
-
@IdeaMan FireFox。但是我在 Chrome 中尝试过,结果是一样的。它向上转换的速度比向下转换快得多,当您单击以再次显示它时,它开始之前似乎存在某种形式的延迟。
标签: css sass css-animations css-transforms