2026.06.11 (Jeu)

✹ RĂ©sumĂ© de GPT-5.5  

Un retour sur la réduction de la friction des notes Kramdown par défaut, qui font passer du corps du texte aux références en bas de page, en conservant la structure existante tout en transformant les liens de note dans le corps en UI de popover au format [1].

DĂšs que j’ai commencĂ© Ă  utiliser les notes de bas de page sĂ©rieusement, l’inconfort est apparu.

Quand je traite d’articles externes ou de documents dans le blog, j’ajoute maintenant des footnotes Kramdown Ă  cĂŽtĂ© du passage concernĂ©. Un billet comme La pĂ©nurie inĂ©dite de bulletins de vote, la colĂšre et les dĂ©gĂąts causĂ©s par les extrĂ©mistes contenait beaucoup de faits, donc beaucoup de notes.

Mais Ă  la lecture, le flux n’était pas bon.

Quand je cliquais sur un numĂ©ro de note dans le corps, aucun popup n’apparaissait. La page descendait tout en bas, vers la section RĂ©fĂ©rences. Comme comportement par dĂ©faut, c’est correct. Kramdown crĂ©e les notes ainsi. Mais dans un long texte, on perd facilement l’endroit oĂč l’on lisait.

La forme des numéros de note était aussi maladroite.

Si seuls de petits chiffres comme 1 2 3 4 apparaissent, ils sont difficiles Ă  cliquer. Sur mobile, c’est encore pire. Taper prĂ©cisĂ©ment un petit chiffre au milieu du texte demande plus d’attention qu’il ne devrait.

J’ai donc lĂ©gĂšrement modifiĂ© le systĂšme de notes.

Dans le corps, elles apparaissent désormais sous la forme [1], [2], [3], et un clic ouvre un petit popover au lieu de déplacer la page vers le bas.

Je n’ai pas touchĂ© Ă  la structure Kramdown

Je ne voulais pas changer la syntaxe Markdown ni la maniÚre dont les footnotes sont générées.

Aujourd’hui, j’écris les notes ainsi.

Phrase du corps.[^source]

[^source]: Description de la source et lien

Cette méthode doit rester.

CĂŽtĂ© Ă©criture, j’utilise une syntaxe proche du Markdown standard, et au moment du build Jekyll, Kramdown gĂ©nĂšre le HTML des notes. La section RĂ©fĂ©rences en bas reste Ă©galement. Si je remplaçais toute cette structure, il faudrait toucher les billets existants et leurs traductions.

La rÚgle de ce travail était donc simple.

Garder le format d'écriture tel quel.
Garder les notes de bas de page générées par Kramdown.
Changer seulement l'affichage et le comportement au clic des liens de note dans le corps.

Autrement dit, conserver les donnĂ©es d’origine et le fallback, et amĂ©liorer uniquement l’expĂ©rience de lecture.

J’ai fait ressembler les numĂ©ros Ă  [1]

J’ai d’abord changĂ© le CSS.

Kramdown ajoute la classe a.footnote aux liens de note dans le corps. J’ai transformĂ© ce lien en petit bouton inline-flex, puis ajoutĂ© les crochets avec ::before et ::after.

Résultat, dans le corps, on ne voit plus seulement un chiffre, mais ceci.

[1] [2] [3]

J’ai aussi Ă©largi un peu la zone cliquable.

Si cela ressemble Ă  un gros bouton, le rythme du texte se casse. Mais si cela reste un minuscule chiffre, c’est difficile Ă  cliquer. J’ai donc ajoutĂ© une bordure et un fond trĂšs lĂ©gers, tout en gardant une taille de texte plus petite que le corps.

Comme ce blog a un mode clair et un mode sombre, je n’ai pas codĂ© les couleurs en dur. Je les ai alignĂ©es sur les variables Sass existantes.

$primary-color
$background-color
$border-color
$text-color

Ce blog charge dĂ©jĂ  customOverride.scss aprĂšs les skins claire et sombre. J’ai donc ajoutĂ© les styles de notes dans _sass/custom/customOverride.scss, sans modifier directement les fichiers originaux du thĂšme.

Le clic crée un popover

Ensuite, le JavaScript.

Auparavant, SmoothScroll était attaché à tous les liens #hash. Un lien de note est lui aussi un lien interne vers quelque chose comme #fn:..., donc le clic faisait descendre la page en douceur.

Cette fois, j’ai d’abord interceptĂ© uniquement les liens de note dans le corps.

La cible est celle-ci.

.page__content a.footnote[href^="#fn"]

Au clic, le script bloque le dĂ©placement hash par dĂ©faut, trouve le contenu dĂ©jĂ  rendu dans la liste de notes en bas, puis le clone. La note en bas contient un lien reversefootnote pour revenir au corps, mais dans le popover il n’est pas nĂ©cessaire, donc je le supprime.

Le flux est le suivant.

Clic sur une note dans le corps
-> lire le target id depuis href
-> trouver le li footnote en bas
-> cloner le contenu
-> supprimer reversefootnote
-> insérer dans le popover
-> calculer la position prĂšs du lien de note

Comme le hash ne change pas, l’URL ne se salit pas. La page ne descend pas non plus en bas.

Il y a trois maniĂšres de fermer.

Cliquer de nouveau sur la mĂȘme note
Cliquer hors du popover
Esc ou le bouton de fermeture

Pour l’usage au clavier, j’ai aussi ajoutĂ© aria-haspopup="dialog" et aria-expanded. Le popover lui-mĂȘme utilise role="dialog". Je ne dirais pas que c’est un composant d’accessibilitĂ© parfait, mais c’est dĂ©jĂ  mieux qu’une div flottante sans sĂ©mantique.

Je l’ai gardĂ© dans l’écran sur mobile

Le positionnement est important pour un popover de note.

L’afficher juste sous le lien du corps paraĂźt naturel, mais prĂšs du bord droit ou en largeur mobile, il peut facilement sortir de l’écran.

J’ai donc forcĂ© une marge Ă  l’intĂ©rieur du viewport lors du calcul de position.

Au moins 12px Ă  gauche
Au moins 12px Ă  droite
S'il manque de place en bas, afficher au-dessus
S'il manque encore de place, clamp à l'intérieur du viewport

La largeur du popover n’est pas fixe non plus.

width: min(30rem, calc(100vw - 1.5rem));

Sur desktop, il ne devient pas trop large. Sur mobile, il ne dĂ©passe pas la largeur de l’écran.

J’ai aussi ajoutĂ© max-height et overflow: auto pour les longues notes. L’idĂ©e est d’éviter qu’un titre d’article externe ou un lien trop long fasse recouvrir tout l’écran par le popover.

J’ai aussi rĂ©gĂ©nĂ©rĂ© le fichier minifiĂ©

Dans ce blog, assets/js/_main.js est la source, et le site publié lit assets/js/main.min.js.

AprĂšs avoir modifiĂ© le JS, j’ai donc rĂ©gĂ©nĂ©rĂ© le fichier minifiĂ© et la source map avec la tĂąche Rake.

bundle exec rake js

Si j’oublie cette Ă©tape, la source locale peut ĂȘtre corrigĂ©e alors que le site rĂ©el continue de servir l’ancien JavaScript. Pour ce type de travail, il faut vĂ©rifier ensemble le fichier source et le fichier dĂ©ployĂ©.

Ce que j’ai vĂ©rifiĂ©

J’ai vĂ©rifiĂ© ainsi.

node --check assets/js/_main.js
bundle exec rake js
bundle exec jekyll build

Ensuite, j’ai ouvert avec un serveur statique local un vrai billet contenant beaucoup de notes.

J’ai vĂ©rifiĂ© ceci.

Les liens de note apparaissent-ils sous forme [1] ?
Le hash de l'URL reste-t-il inchangé aprÚs le clic ?
La page évite-t-elle de sauter aux références du bas ?
Le popover apparaĂźt-il ?
Le popover contient-il le contenu de la note du bas ?
En largeur mobile, le popover reste-t-il dans l'écran ?

Sur desktop, les notes du bas Ă©taient trĂšs loin dans le document, mais aprĂšs le clic sur une note, le scroll restait prĂšs du corps du texte. En largeur mobile, le popover restait aussi dans l’écran.

C’est une petite fonction, mais la lecture change beaucoup

Ce travail n’est pas une grande fonctionnalitĂ©.

Il n’y a pas de modĂšle de donnĂ©es, pas de routing, pas de nouvelle page. Il rend simplement les liens de note existants plus lisibles et ouvre un popover au clic.

Mais la sensation de lecture change nettement.

Surtout dans un billet riche en faits, les notes ne sont pas dĂ©coratives. Quand un lecteur se demande « d’oĂč vient cette affirmation ? », il doit pouvoir vĂ©rifier immĂ©diatement. Si cette vĂ©rification l’envoie tout en bas du billet et l’oblige ensuite Ă  revenir au corps, les notes deviennent vite pĂ©nibles.

Désormais, pendant la lecture, on peut cliquer sur [1], vérifier et fermer.

La section Références en bas reste là. Ceux qui veulent parcourir toutes les sources à la fin peuvent toujours le faire.

C’est exactement le niveau que je voulais.

Garder la maniĂšre d’écrire en Markdown, prĂ©server la structure Jekyll/Kramdown, et fatiguer un peu moins les doigts et les yeux du lecteur.

MĂȘme petites, ce sont ces amĂ©liorations qui doivent continuer Ă  s’accumuler sur le blog.

Laisser un commentaire