Ajouter un bouton « retour en haut » dans les articles Docusaurus
Découvrez comment ajouter facilement un bouton « retour en haut », souvent accompagné d'une icône animée amusante, à vos articles de blog Docusaurus grâce à un composant React personnalisé et une surcharge de thème.
Traduction automatique
Cet article a plus d'un an, mais il a été relu le 30 juillet 2026 — son contenu est toujours exact.
Cet article fait partie de la série Créer des composants Docusaurus :
- Modifier la façon dont Docusaurus génère les balises img
- Surcharger la génération des balises img avec Docusaurus
- Organisez votre contenu Docusaurus avec un composant Series personnalisé
- Ajouter un bouton « retour en haut » dans les articles Docusaurus
- Créer un plugin de recherche/remplacement pour Docusaurus
- Un composant pour afficher des snippets de code dans un blog Docusaurus
- Un composant Docusaurus qui prévient le lecteur que l'article a plus d'un an
- Afficher le changelog de votre article
- Injecter de l'ASCII art dans toutes les pages HTML générées par Docusaurus
- Best Practice - Personnaliser le flux RSS de Docusaurus pour un contenu complet et des images
- Quelques vérifications sur les images de votre site Docusaurus
- Gestion des tags dans Docusaurus
- Automatiser les résumés TL;DR avec Gemini AI
- Le composant ProjectSetup - Une façon standardisée de partager des structures de projet
- Comment signaler un contenu assisté par IA dans un blog Docusaurus
- Donnez vie à vos tutoriels CLI avec un terminal machine à écrire
- Espiègleries de suricate : semer des easter eggs partout sur mon blog
- Tooltips de code assistés par l'IA dans Docusaurus — Explique-moi comme à un enfant de cinq ans
- Ajouter des réactions de lecteurs à votre blog Docusaurus
- Votre blog est illisible pour une IA. Voici la solution.
- Secouez votre téléphone, surprenez le suricate
- Ajouter un bouton « Copy as Markdown » à votre blog Docusaurus
- Ask My Blog : transformer 259 articles en 2 160 questions cherchables
- La troisième porte : une bulle de chat flottante, et la fonctionnalité que personne ne trouvait
- Dessiner une carte de mon propre blog
- Laissez vos lecteurs signaler les problèmes — un widget de feedback multi-types pour Docusaurus

Cet article est un tutoriel rapide pour ajouter un bouton « retour en haut » à votre blog Docusaurus. Il vous guide dans l'implémentation d'un composant React personnalisé <ScrollToTopButton>, avec son CSS pour la mise en forme. Vous apprendrez à surcharger le composant de thème BlogPostItem par défaut afin d'injecter automatiquement le bouton au bas de chaque article. Le guide donne aussi des astuces pour ajouter le bouton à d'autres parties de votre site, comme l'archive du blog ou vos pages personnalisées.
Sur smartphone plus encore que sur ordinateur, c'est bien pratique d'avoir un bouton Retour en haut de page pour éviter de se luxer le pouce.
Docux, un ami, a récemment développé cette fonctionnalité et j'ai été ravi de l'ajouter, d'autant qu'elle est terriblement simple à utiliser et apporte un côté fun ; c'est sympa.
Faites simplement défiler n'importe quelle page de ce blog pour voir un petit suricate apparaître en bas à droite. Cliquez dessus et prenez l'ascenseur jusqu'en haut de la page.
À quoi ça ressemble
Voici cette page même, après défilement. Le suricate se tient en bas à droite, flottant au-dessus de votre contenu :

De plus près, c'est un bouton rond qui contient l'icône que vous lui donnez :
Le bouton reste masqué tant que vous n'avez pas défilé de plus de 300 pixels ; une page courte ne l'affiche donc jamais. Deux fichiers et une surcharge, c'est ci-dessous.
Comment ça fonctionne
Docux a créé un composant Docusaurus ScrollToTopButton, c'est-à-dire un bout de Javascript avec du css ; rien de plus.
Créez les deux fichiers ci-dessous dans l'arborescence de votre blog :
import { useState, useEffect, type JSX } from "react";import clsx from "clsx";import { translate } from "@docusaurus/Translate";import styles from "./styles.module.css";import buttontop from "@site/static/img/meerkat/suricate_no_background.webp";
export default function ScrollToTopButton(): JSX.Element { const [isVisible, setIsVisible] = useState(false); const [fly, setFly] = useState(false);
useEffect(() => { const toggleVisibility = () => setIsVisible(window.scrollY > 300); window.addEventListener("scroll", toggleVisibility, { passive: true }); return () => window.removeEventListener("scroll", toggleVisibility); }, []);
const scrollToTop = () => { setFly(true); window.scrollTo({ top: 0, behavior: "smooth" });
setTimeout(() => setFly(false), 800); };
return ( <button type="button" className={clsx(styles.scrollBtn, isVisible && styles.show, fly && styles.fly)} onClick={scrollToTop} aria-label={translate({ id: "theme.common.scrollToTop", message: "Scroll to top", description: "The aria label for the scroll to top button", })} > <img src={buttontop} alt={translate({ id: "theme.common.scrollToTop", message: "Scroll to top", })} className="no-zoom" width="30" height="30" /> </button> );}This component renders a decorative button that scrolls the page back to the top when clicked. It only shows the button once you've scrolled down more than 300 pixels, and plays a brief animation when you click it. The button uses an image of a meerkat and includes proper accessibility labels for screen readers.
.scrollBtn { position: fixed; bottom: 30px; right: 30px; width: 60px; height: 60px; cursor: pointer; opacity: 0; visibility: hidden; transition: opacity 0.4s, visibility 0.4s; z-index: 1000; border: none; background: transparent; padding: 0;}
.scrollBtn img { width: 100%; height: 100%; object-fit: contain; border-radius: 50%; box-shadow: var(--mk-shadow-3); transition: transform 0.3s;}
.scrollBtn:hover img { transform: scale(1.1);}
/* Bouton visible après scroll */.scrollBtn.show { opacity: 1; visibility: visible;}
/* Animation "vol vers le haut" */.scrollBtn.fly img { animation: flyUp 0.8s ease-in forwards;}
@keyframes flyUp { 0% { transform: translateY(0) scale(1); opacity: 1; } 100% { transform: translateY(-300px) scale(0.6); opacity: 0; }}
/* The meerkat flying off the top of the page is the site's signature gesture, so it is kept — but it is pure decoration, and a reader who asked for less motion should get the plain jump. */@media (prefers-reduced-motion: reduce) { .scrollBtn.fly img { animation: none; }
.scrollBtn:hover img, .scrollBtn img { transition: none; transform: none; }}
@media (max-width: 600px) { .scrollBtn { width: 44px; height: 44px; bottom: 16px; right: 16px; }}This defines a scroll-to-top button that's hidden by default and appears when the user scrolls down. The button has a cute animation where it flies up and shrinks when clicked, but that animation is disabled for users who prefer less motion. On mobile devices, the button is made smaller and positioned closer to the corner.
Ensuite, vous devez injecter <ScrollToTopButton /> dans vos pages. Cette injection se fait en swizzlant BlogPostItem, exactement comme dans Afficher les articles liés sous nos articles Docusaurus et Ajouter des réactions de lecteurs à votre blog Docusaurus ; si vous avez déjà fait l'un des deux, vous avez déjà le fichier.
Information
Le composant importe son icône dès les premières lignes : import buttontop from "@site/static/img/meerkat/suricate_no_background.webp". Faites pointer cet import vers votre propre image carrée dans /static et c'est réglé.
Surcharger la page BlogPostItem
Suivez le chapitre « Nous devons surcharger la façon dont Docusaurus rend l'article » d'un article précédent.
Vous devez créer le fichier src/theme/BlogPostItem/index.js.
Si vous ne voulez pas les détails, ne lisez pas ce chapitre et créez simplement ce fichier :
import React from 'react';import clsx from 'clsx';import {useBlogPost} from '@docusaurus/plugin-content-blog/client';import BlogPostItemContainer from '@theme/BlogPostItem/Container';import BlogPostItemHeader from '@theme/BlogPostItem/Header';import BlogPostItemContent from '@theme/BlogPostItem/Content';import BlogPostItemFooter from '@theme/BlogPostItem/Footer';// apply a bottom margin in list viewfunction useContainerClassName() { const {isBlogPostPage} = useBlogPost(); return !isBlogPostPage ? 'margin-bottom--xl' : undefined;}export default function BlogPostItem({children, className}) { const containerClassName = useContainerClassName(); return ( <BlogPostItemContainer className={clsx(containerClassName, className)}> <BlogPostItemHeader /> <BlogPostItemContent>{children}</BlogPostItemContent> <BlogPostItemFooter /> </BlogPostItemContainer> );}Ce composant React affiche un article de blog en assemblant des sous-composants pour l'en-tête, le contenu et le pied de page. Il applique automatiquement une marge inférieure supplémentaire lorsque l'article apparaît dans une liste plutôt que sur sa propre page.
Une fois que vous l'avez, éditez-le car nous devons y injecter le code <ScrollToTopButton />.
Ci-dessous, voyez les deux lignes surlignées à ajouter :
import React from 'react';import clsx from 'clsx';import {useBlogPost} from '@docusaurus/plugin-content-blog/client';import BlogPostItemContainer from '@theme/BlogPostItem/Container';import BlogPostItemHeader from '@theme/BlogPostItem/Header';import BlogPostItemContent from '@theme/BlogPostItem/Content';import BlogPostItemFooter from '@theme/BlogPostItem/Footer';// highlight-next-lineimport ScrollToTopButton from "@site/src/components/ScrollToTopButton";
// apply a bottom margin in list viewfunction useContainerClassName() { const {isBlogPostPage} = useBlogPost(); return !isBlogPostPage ? 'margin-bottom--xl' : undefined;}export default function BlogPostItem({children, className}) { const containerClassName = useContainerClassName(); return ( <BlogPostItemContainer className={clsx(containerClassName, className)}> <BlogPostItemHeader /> <BlogPostItemContent>{children}</BlogPostItemContent> <BlogPostItemFooter /> // highlight-next-line <ScrollToTopButton /> </BlogPostItemContainer> );}Ce composant React affiche un article de blog en assemblant plusieurs sous-composants (en-tête, contenu, pied de page) dans un conteneur. Il ajoute automatiquement une marge inférieure quand l'article est affiché dans une liste plutôt que sur sa propre page, et inclut un bouton pour revenir au haut de la page.
Nous devons redémarrer Docusaurus
Comme nous venons d'introduire une surcharge, nous devons redémarrer notre serveur Docusaurus pour que les changements soient pris en compte.
Lancez npm run start
Si vous lancez Docusaurus en local, exécutez simplement npm run start dans votre console.
Si, comme moi, vous lancez Docusaurus via Docker, tuez le container et démarrez-en un nouveau.
Vous pouvez bien sûr le faire pour d'autres pages
Sur mon site, j'ai une page archive. Vous voulez y utiliser le bouton <ScrollToTopButton /> aussi ? Swizzlez simplement la page en exécutant yarn docusaurus swizzle @docusaurus/theme-classic BlogArchivePage dans une console, puis mettez à jour le fichier index.js comme illustré ci-dessus.
Si vous avez d'autres pages dans votre dossier src/pages/ (comme about.mdx, index.mdx, ...), pas besoin de swizzler d'abord : ajoutez directement les deux lignes dans ces fichiers aussi.
Conclusion
Fini les pouces luxés : un petit composant, un BlogPostItem swizzlé, et chaque article long de votre site obtient un chemin de retour vers le haut. Le plus amusant, c'est que l'icône est la vôtre ; la mienne fait signe aux lecteurs qui descendent trop loin.
Si vous constituez votre collection de composants Docusaurus, le prochain à ajouter est les articles liés sous chaque article, qui réutilise exactement le même fichier de surcharge.
Cet article fait partie de la série Créer des composants Docusaurus :
- Modifier la façon dont Docusaurus génère les balises img
- Surcharger la génération des balises img avec Docusaurus
- Organisez votre contenu Docusaurus avec un composant Series personnalisé
- Ajouter un bouton « retour en haut » dans les articles Docusaurus
- Créer un plugin de recherche/remplacement pour Docusaurus
- Un composant pour afficher des snippets de code dans un blog Docusaurus
- Un composant Docusaurus qui prévient le lecteur que l'article a plus d'un an
- Afficher le changelog de votre article
- Injecter de l'ASCII art dans toutes les pages HTML générées par Docusaurus
- Best Practice - Personnaliser le flux RSS de Docusaurus pour un contenu complet et des images
- Quelques vérifications sur les images de votre site Docusaurus
- Gestion des tags dans Docusaurus
- Automatiser les résumés TL;DR avec Gemini AI
- Le composant ProjectSetup - Une façon standardisée de partager des structures de projet
- Comment signaler un contenu assisté par IA dans un blog Docusaurus
- Donnez vie à vos tutoriels CLI avec un terminal machine à écrire
- Espiègleries de suricate : semer des easter eggs partout sur mon blog
- Tooltips de code assistés par l'IA dans Docusaurus — Explique-moi comme à un enfant de cinq ans
- Ajouter des réactions de lecteurs à votre blog Docusaurus
- Votre blog est illisible pour une IA. Voici la solution.
- Secouez votre téléphone, surprenez le suricate
- Ajouter un bouton « Copy as Markdown » à votre blog Docusaurus
- Ask My Blog : transformer 259 articles en 2 160 questions cherchables
- La troisième porte : une bulle de chat flottante, et la fonctionnalité que personne ne trouvait
- Dessiner une carte de mon propre blog
- Laissez vos lecteurs signaler les problèmes — un widget de feedback multi-types pour Docusaurus
Chargement des commentaires…





