Musisz użyć transition-group
i wprowadzić swoją dynamiczną div i statycznych div
<transition-group name="fade">
<div v-if="switc" key="dynamic" class="animated">
...
</div>
<div key="main-content" class="animated">
...
</div>
</transition-group>
i używać tej css klas
.fade-enter,
.fade-leave-active {
opacity: 0;
transform: translateY(-10px);
}
.fade-leave-active {
position: absolute;
}
.animated {
transition: all 0.5s;
/*display: flex;*/
width: 100%;
}
Prawdziwą sztuką jest zmienić position
do absolute
przy wyjeździe, a następnie każda inna treść może zająć właściwą pozycję.
Aby dowiedzieć się więcej na temat Vue animować rzeczy proszę zobaczyć ten FLIP explanation post
I proszę zobaczyć ten skrzypce roboczą https://jsfiddle.net/bjfhth7c/4/
Edycja
Przez pomyłkę zrobiłem ustawiony display: flex;
w .animated
klasy, że sprawiał, że każdy element wewnętrzny renderował się w dziwny sposób.
Więc teraz, całkowicie usunąć .animate
klasę, a zamiast tego zastosować transition: all 0.5s
i width:100%
do każdego bezpośredniego wewnętrznego elementu .wrapper
moim ostatnim SCSS wygląda następująco:
.wrapper {
display: flex;
flex-direction: column;
>* {
transition: all 0.5s;
width:100%;
};
}
.fade-enter,
.fade-leave-active {
opacity: 0;
transform: translateY(-10px);
}
.fade-leave-active {
position: absolute;
}
Flex układ jest rozszerzyć przedmiot , ale w skrócie dla tego konkretnego przypadku, flex-direction: column
układa elementy jeden, który poprzednio był mieszkiem.
Jeśli jeden z tych elementów ma pozycję absolutną, zostanie zignorowany w układzie flex, więc wszelkie inne elementy zostaną ponownie rozdzielone na dostępnej przestrzeni.
Proszę zobaczyć ten guide o flexbox i ostatnim working fiddle nadzieję, że to pomaga.
Myślę, że to zdecydowanie najlepsza odpowiedź. Stanowi solidne rozwiązanie dla (możliwej) przyszłej zmiany wymagań. Na przykład, co powiesz na to, że po '# element2' pojawiają się inne elementy? Co powiesz na usunięty element na środku listy? Co powiesz na dodanie nowego elementu między '# element1' i' # element2'? Przejście 'max-height' jest dobrym rozwiązaniem dla konkretnego przypadku, ale jeśli jest to problem z poważnego produktu, poleciłbym go. – Leo
Dzięki @Leo i tak z tym rozwiązaniem można łatwo dodać nowe elementy div przed, po lub między już istniejącymi. Sprawdź ten inny przykład: https://jsfiddle.net/AldoRomo88/q57dtx85/ – AldoRomo88
Dziękuję za odpowiedź, wygląda dobrze, kilka problemów mam do czynienia ze względu na flex wyświetlacza, na przykład chcę mieć przycisk pełnej szerokości, ale ze względu na flex, myślę, że zachowuje się dziwnie, sprawdź [to] (https://jsfiddle.net/q57dtx85/1/). – Saurabh