【发布时间】:2018-06-10 05:35:21
【问题描述】:
我的需求很简单,但我找不到合适的解决方案。
我创建元素并将它们作为项目列表添加到 DOM,每个新元素都添加在旧元素之前。我希望“顺利”添加新元素。每个元素的height 是动态的,因此必须是 CSS 规则。
我认为我必须使用 CSS animations 和 keyframes,从我读到的内容我不能使用 transitions,因为有时 it is not rendered by the browser。我不想使用 Javascript,所以我更喜欢避免使用 setTimeout() 或 jQuery 的解决方案。我确信这可以使用现代 CSS 正确完成,但我仍然需要找到正确的方法。
我有一个解决方案的开始(见下文),但在 CSS 中仍然有 max-height: 1000px 硬编码,我想避免这种情况,但我不知道该怎么做,因为将其替换为 auto 或 unset 会破坏动画(请参阅帖子末尾的 GIF)。
你将如何实现一个优雅的过渡来像这样向 DOM 添加新元素(不一定使用我提供的代码)?
function addElement() {
let dynamicHeight = Math.ceil(Math.random() * 30) + 100;
let newElem = `<div class='elem' style='height: ${dynamicHeight}px'></div>`;
let elements = document.getElementById("elements");
elements.insertAdjacentHTML("afterbegin", newElem);
}
let button = document.getElementById("button")
button.addEventListener("click", addElement);
.elem {
background-color: blue;
margin: 5px;
animation-duration:0.5s;
animation-name: slidein;
}
@keyframes slidein {
from {
max-height: 0px;
transform: scale(0);
opacity: 0;
}
to {
max-height: 1000px;
transform: scale(1);
opacity: 1;
}
}
<button id="button">Add element</button>
<div id="elements"></div>
【问题讨论】:
-
你试过使用 height: auto; ?
-
@ManuelBlanco 是的,我尝试过使用
auto、unset和100%,但对所有人来说都是“笨拙”。 -
@ibrahimmahrir “减少第二个动画的时间”是什么意思?我怎样才能做到这一点? “笨拙”的效果来自于旧元素“跳下”而不是平稳地移动到底部。
-
@Delgan 啊!我懂了。那么你要么使用
max-height或javascript,否则这是不可能的:你不能动画或从数字到非数字值的转换,反之亦然。 -
我一直觉得使用
max-height滑动元素可能被高估了,因为它只会达到计算的高度。如果滑动是线性的,那么会有突然性,但缓动可以消除高估max-height的抖动可能(未测试)
标签: javascript css css-transitions css-animations