В каком-то интерфейсе я хочу делать анимацию.Так как свойство transform гораздо более оптимизировано для этого, чем другие свойства CSS, я буду использовать это.
С transform: scale (): когда соотношение сторон элемента не изменяется, нет проблем.Когда соотношение должно измениться, решение, которое я нашел, это поместить контейнер, а в этот контейнер - внутренний.Затем примените противоположное преобразование к внутреннему блоку, чтобы соотношение сохранялось во время и после анимации.
Я сделал ручку, чтобы проверить идею, и она работает, но с проблемой во время анимации: внешний вид внутреннего блокарастягивается во время анимации.Я не понимаю почему, учитывая, что время анимации одинаковое, а замедление линейное.
https://codepen.io/AdamElio/pen/PabejP
(нажмите в меню, чтобы включить анимацию)
document.querySelector('#menu').addEventListener('click', function() {
this.classList.toggle('collapsedd')
});
#menu {
margin: 30px;
padding: 15px;
background: white;
width: 150px;
overflow: hidden;
transform-origin: top center;
transition: transform .5s linear;
}
#menu.collapsedd {
transform: scaleY(.2);
}
#menu .inner {
transition: transform .5s linear;
transform-origin: top center;
}
#menu.collapsedd .inner {
transform: scaleY(5);
}
#menu .inner ul {
padding: 0;
margin: 0;
list-style: none;
}
<nav id="menu">
<div class="inner">
<h5>Menu</h5>
<ul>
<li>Link 1</li>
<li>Link 2</li>
<li>Link 3</li>
<li>Link 4</li>
</ul>
</div>
</nav>
<div id="transform"></div>