1
resposta

Como implementar animação no scroll usando Angular para transições suaves entre elementos da página?

Por favor, gostaria de saber se é viável criar uma animação que ocorra durante a rolagem da página (scroll). Por exemplo, ao preencher um formulário extenso que ocupa quase toda a altura visível do navegador, após submetê-lo, uma lista é exibida mais abaixo na página. É possível utilizar a funcionalidade de animação do navegador (Browser Animation) do Angular para suavizar o movimento da tela até essa lista?

Atualmente, estou utilizando uma solução simples para alcançar esse efeito, mas ela é bastante rígida e não apresenta transições suaves:

private setScroll(altura: number) {
    let yPosition = altura;
    window.scrollTo(0, yPosition);
}
1 resposta

E aí, meu chapa!

Sim, dá pra fazer isso de uma maneira mais maneira usando as animações do Angular. A funcionalidade que tu quer é conhecida como "scroll suave" ou "scroll smooth". O Angular tem uma biblioteca própria pra isso, chamada de @angular/animations.

Primeiro, tu precisa importar o BrowserAnimationsModule no teu módulo. Tipo assim:

import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

@NgModule({
  declarations: [
    // teus componentes aqui
  ],
  imports: [
    BrowserAnimationsModule,
    // outros módulos aqui
  ],
})
export class AppModule { }

Depois, na tua lista de estilos CSS, tu pode criar uma animação pra ser ativada no scroll. Por exemplo:

@keyframes scrollAnimation {
  from {
    opacity: 0;
    transform: translateY(-50px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.scroll-smooth {
  animation: scrollAnimation 0.5s ease-in-out;
}

E no teu componente do Angular, tu pode usar o HostListener pra detectar o scroll e adicionar a classe de animação:

import { Component, HostListener } from '@angular/core';

@Component({
  selector: 'app-tua-lista',
  templateUrl: './tua-lista.component.html',
  styleUrls: ['./tua-lista.component.css']
})
export class TuaListaComponent {

  @HostListener('window:scroll', ['$event'])
  onScroll(event: Event): void {
    const listaElement = document.getElementById('id-da-tua-lista'); // troca isso pelo id real da tua lista
    const distanciaDoTopo = listaElement.getBoundingClientRect().top;

    if (distanciaDoTopo < window.innerHeight - 50) { // ajusta esse valor de acordo com quando tu quer que a animação comece
      listaElement.classList.add('scroll-smooth');
    }
  }
}

Lembra de ajustar os valores de acordo com o teu layout e o timing da tua animação. Isso deve suavizar o scroll até a tua lista depois de submeter o formulário.

Boa sorte e bora animar esse scroll!