В первую очередь это касается CSS.
Если элемент hr
введен в макет в transition-group
, а свойство CSS transition
связано с all
, и , position
устанавливается в absolute
во время состояния leave-active
(что приведет к тому, что элемент «исчезнет» из своего предыдущего, относительного положения в потоке макета), тогда многочисленные элементы и свойства будутпереходить одновременно, что приводит к нежелательным последствиям.
Однако, учитывая, что вопрос ищет решение без margin
и hr
поверх transition-group
, и при условии, что кнопка имеет обработчик события, например так:
<button class="filter-button" v-on:click="toggleSlider">Filters</button>
Функция toggleSlider
переключит свойство isVisible
, от которого зависит анимированный переход:
methods: {
toggleSlider() {
this.isVisible = !this.isVisible;
}
}
И с помощью CSS вместо перехода all
, просто переходсвойства, которые достигнут искомого эффекта, а именно opacity
, а с этим ответом max-height
.Путем полного удаления абсолютного позиционирования и использования относительного положения плюс z-индексации с помощью следующего CSS достигается желаемый эффект.
/* put margin spacing on the bottom of the button */
.filter-button {
margin-bottom: 25px;
}
/* add relative positioning to enforce z-indexing */
.filter-group {
position: relative;
z-index: 1;
}
/* add relative positioning to enforce z-indexing */
.filter-content {
position: relative;
z-index: 2;
}
/* hidden states */
.slide-enter,
.slide-leave-to {
opacity: 0;
max-height: 0px;
}
/* shown states - max-height can be adjusted as desired */
.slide-enter-to,
.slide-leave {
opacity: 1;
max-height: 300px;
}
/* while animating during animation entry phase */
.slide-enter-active {
transition: opacity 0.75s ease-in, max-height 0.5s ease-out;
}
/* while animating during the animation departure phase */
.slide-leave-active {
transition: opacity 0.75s ease-out, max-height 0.5s ease-out;
}
/* add padding to bottom of filters section */
.pl-5 {
padding-bottom: 25px;
}
Путем добавления поля в нижней части кнопки и секции фильтра,интервал между разделами сохраняется.
Я создал CodeSandbox , чтобы проиллюстрировать это решение.