Tenho usado a seguinte animação há algum tempo e ela funciona bem para expandir/recolher um elemento:
const expanded = style({ height: '*', opacity: 1 });
const collapsed = style({ height: 0, opacity: 0 });
const animation = animate(`300ms cubic-bezier(0.4, 0.0, 0.2, 1)`);
export const expandCollapse = trigger('expandCollapse', [
transition(':enter', [collapsed, animation, expanded]),
transition(':leave', [animation, collapsed]),
]);
E isso funciona muito bem para animar um elemento quando ele é exibido ou oculto via *ngIf
:
<div *ngIf="isExpanded" @expandCollapse>
<!-- Content Here -->
</div>
Aparentemente, nunca usei isso com conteúdos que usam um gap
, porque quando faço a animação "encaixa" no começo e no fim. Pensei que poderia resolver isso também animando a gap
propriedade, mas sem sorte:
const expanded = style({ height: '*', gap: '*', opacity: 1 });
const collapsed = style({ height: 0, gap: 0, opacity: 0 });
Como posso amenizar isso?
Aqui está um StackBlitz que demonstra o comportamento atual.
O problema que você está enfrentando é porque as alterações de CSS grid ou flex gap não são automaticamente animáveis com animações básicas de CSS ou Angular. A propriedade gap não é diretamente suportada para transações suaves em muitos navegadores, levando ao efeito de encaixe.
Para corrigir isso, você pode usar uma solução alternativa na qual você anima explicitamente o espaço usando propriedades de margem ou preenchimento, que são totalmente animáveis.
Deixe-me dar-lhe o código atualizado.
Modifique os estilos:
Atualize o HTML:
Adicionar CSS (opcional)