Live le 29 mai

Watch Party Angular 20 🎉

Rejoignez-nous pour une soirée spéciale dédiée à Angular 20 ! On découvre ensemble les nouveautés, on discute et on réagit en direct.

Programme :

  • 19:45Apéro ! 🍻. Nous parlerons des avancées d'Angular.
  • 20:00Nous suivrons ensemble les nouveautés d'Angular 20.
Rejoindre la soirée
Skip to content

Vous souhaitez recevoir de l'aide sur ce sujet ? rejoignez la communauté Angular.fr sur Discord.

Gestion du scroll avec withInMemoryScrolling

Imaginez que vous naviguez sur un site e-commerce. Vous faites défiler une longue liste de produits, vous cliquez sur un article qui vous intéresse, puis vous revenez en arrière. Frustrant, n'est-ce pas, de vous retrouver tout en haut de la page et de devoir refaire défiler pour retrouver où vous étiez ?

C'est exactement le problème que résout withInMemoryScrolling dans Angular. Cette fonctionnalité permet de mémoriser et restaurer automatiquement la position de défilement lors de la navigation, offrant une expérience utilisateur bien plus fluide.

Qu'est-ce que withInMemoryScrolling ?

withInMemoryScrolling() est une fonctionnalité du router Angular qui configure un système de mémorisation des positions de scroll. Introduite avec les applications standalone (Angular 15), elle stocke en mémoire la position de défilement pour chaque navigation et la restaure automatiquement.

Pensez-y comme à un marque-page intelligent qui se souvient exactement où vous étiez sur chaque page de votre application.

Configuration de base

Pour utiliser withInMemoryScrolling, vous devez l'ajouter lors de la configuration de votre router dans app.config.ts :

typescript
import { ApplicationConfig } from '@angular/core';
import { provideRouter, withInMemoryScrolling } from '@angular/router';
import { routes } from './app.routes';

export const appConfig: ApplicationConfig = {
  providers: [
    provideRouter(
      routes,
      withInMemoryScrolling({
        scrollPositionRestoration: 'enabled',
        anchorScrolling: 'enabled'
      })
    )
  ]
};

Les options disponibles

scrollPositionRestoration

Cette option contrôle comment la position de scroll est restaurée :

  • 'disabled' (par défaut) : Aucune restauration automatique
  • 'top' : Toujours remonter en haut de la page
  • 'enabled' : Restaurer la position précédente lors du retour arrière, sinon aller en haut

anchorScrolling

Cette option gère le défilement vers les ancres (fragments d'URL) :

  • 'disabled' (par défaut) : Ignore les ancres dans l'URL
  • 'enabled' : Fait défiler automatiquement vers l'élément avec l'ID correspondant

Conseil

Le mode 'enabled' pour scrollPositionRestoration deviendra probablement la valeur par défaut dans les futures versions d'Angular.

Pour une documentation avec navigation par ancres :

typescript
provideRouter(
  routes,
  withInMemoryScrolling({
    scrollPositionRestoration: 'enabled',
    anchorScrolling: 'enabled'
  })
)

Attention

Lors d'un retour arrière (bouton back), anchorScrolling ne s'exécute pas. La position sauvegardée est prioritaire, ce qui est généralement le comportement souhaité.

Gestion personnalisée du scroll

Pour des cas plus complexes, vous pouvez contrôler manuellement le scroll :

typescript
import { ViewportScroller } from '@angular/common';
import { inject } from '@angular/core';

export class CustomScrollComponent {
  private viewportScroller = inject(ViewportScroller);

  /**
   * Fait défiler vers une position spécifique
   * 
   * Utile pour des cas où la restauration automatique
   * ne suffit pas (contenu chargé dynamiquement)
   * 
   * @param x - Position horizontale
   * @param y - Position verticale
   * 
   * @example
   * ```typescript
   * this.scrollToPosition(0, 500);
   * ```
   */
  scrollToPosition(x: number, y: number): void {
    this.viewportScroller.scrollToPosition([x, y]);
  }

  /**
   * Fait défiler vers un élément spécifique
   * 
   * @param elementId - ID de l'élément cible
   * 
   * @example
   * ```typescript
   * this.scrollToElement('section-contact');
   * ```
   */
  scrollToElement(elementId: string): void {
    this.viewportScroller.scrollToAnchor(elementId);
  }
}

Points à surveiller

Chargement asynchrone

Si vos données se chargent de manière asynchrone, la restauration du scroll peut se déclencher avant que le contenu soit rendu. Dans ce cas, utilisez un resolver ou attendez que les données soient chargées avant de restaurer la position.

Headers fixes

Si vous avez un header fixe, combinez withInMemoryScrolling avec withRouterConfig pour ajuster l'offset :

typescript
provideRouter(
  routes,
  withInMemoryScrolling({ scrollPositionRestoration: 'enabled' }),
  withRouterConfig({ scrollOffset: [0, 100] })
)

Query parameters

Attention aux query parameters ! Si vous mettez à jour l'URL sans changer de composant (filtres par exemple), Angular considère cela comme une nouvelle navigation et peut remonter en haut. Utilisez ViewportScroller pour un contrôle manuel dans ces cas.