Хотя это сложный способ JS, решение проблемы можно решить следующим образом:
В нем используются два элемента div, один внешний и один внутренний.Внешний div используется в качестве переходного контейнера ограничения представления для внутреннего div, в то время как внутренний div содержит фактические текстовые узлы.
Высота внутреннего div скачет, как в коде вопроса, так как его высота соответствует его содержимому,Этот прыжок скрыт внешним div, который имеет статическую жестко заданную высоту.После добавления текстовых узлов высота внешнего элемента обновляется, чтобы соответствовать внутренней (размер границы в настоящее время не учитывается при расчете).Так как он имеет CSS transition
для свойства height
, он плавно увеличивается до целевого размера.
function updateDiv() {
outer.style.height = inner.clientHeight + 'px';
}
const inner = document.querySelector('div.inner');
const outer = document.querySelector('div.outer');
document.querySelector('button')
.addEventListener(
'click',
() => {
inner.appendChild(document.createTextNode(' How to animate this change in height?'));
updateDiv();
});
updateDiv();
div.outer {
background-color: lightblue;
border: 1px solid black;
width: 100px;
overflow: hidden;
height: 0;
transition: height 1s;
}
div.inner {
background-color: purple;
width: 100%;
height: fit-content;
}
<button type="button">toggle</button>
<div class="outer">
<div class="inner">
some text<br /> even more text<br /> so much text
</div>
</div>