Comments 20
Часто хочется анимировать появление какого-то блока неизвестных размеров, т.е. изменить его высоту с height: 0 до height: auto.
Анимируй не height, а max-height. Главное чтоб значение max-height было больше, чем элемент должен достигать. Тем самым установив элементу height: auto; max-height: 0; анимируешь уже только max-height.
<div id="menu">
<a>hover me</a>
<ul id="list">
<!-- Create a bunch, or not a bunch, of li's to see the timing. -->
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
</ul>
</div>
#menu #list {
max-height: 0;
transition: max-height 0.15s ease-out;
overflow: hidden;
background: #d5d5d5;
}
#menu:hover #list {
max-height: 500px;
transition: max-height 0.25s ease-in;
}
Живой пример: jsfiddle
2. Блок с высотой 500px будет анимироваться 200мс, а с высотой 100px уже 40мс.
Единственно правильное решение — это мерить элемент javascript'ом.
Это решение нечестное. Нужно заранее в CSS выставить max-height. Это получится только для фиксированных выпадающих меню, а у автора в проекте это используется для динамического списка точек. Придется ставить заведомо большее значение, что-то вроде 10000px.
А если вы выставите такое значение в своем демо, то заметите, что анимация выпадения сильно ускорилась. Это происходит потому, что браузер рассчитывает кадры, исходя из высоты от 0 до 10000, хотя реальная высота блока будет намного меньше.
В общем, чтобы получить нормальную анимацию, когда она всегда отрабатывает за фиксированные N секунд, нужно добавить немного Javascript.
А метод с max-height сгодится лишь для фиксированных блоков из 5 элементов, или прототипов, которые все равно придется переделывать нормально.
По анимации, могу посоветовать вот эту часть (5) еще есть остальные 4 части
Спасибо, познавательно. Особенно в части мутаций.
Я использую webpack-svgstore-plugin.
Также можно подключить директиву
<svg width="12" height="12" fill="#ccc9c6" v-svg="'mono-info'" />,
# где `v-svg` — путь к `id` в спрайте
У меня тоже были проблемы с памятью, но после добавления отписок в destroyed от части утечек памяти избавился.
В destroyed ДОМ не доступен:
Вызывается после уничтожения экземпляра Vue. К моменту вызова этого хука, все директивы экземпляра Vue уже отвязаны, все подписчики событий удалены, а все дочерние экземпляры Vue уничтожены.
Если не привязан — хоть там, хоть там.
Первый совет напомнил повсеместное использование rootScope в angular 1 приложении, что как по мне антипаттерн, от которого в последствии избавились.
Можно же вообще все в одном компоненте написать.
Простой пример — вызов модального окошка с настройками, которое вызывается из компонента каждого элемента списка и еще откуда-нибудь.
А модальное окошко я бы через плагин сделал, добавляющий всем компонентам метод для показа окошка (можно возвращать промис с результатами работы окошка).
Часто хочется анимировать появление какого-то блока неизвестных размеров, т.е. изменить его высоту с height: 0 до height: auto.
Вопрос не имеет отношение в Vue, это независимая css проблема.
Анимировать max-height невкусно, ибо (1) изчезает плавность, если взять с большим запасом, или (2) можно «подрезать» текст, если высота окажется больше значения max-height. Лично мне нравится в подобных случаях анимировать line-height+opacity, получается прикольно и вполне плавно.
5 приемов в помощь разработке на vue.js + vuex