← Tous les articles

Tutoriels

Zoom d'image au survol — une lightbox sans bibliothèque

Galeries, boutiques, banques d'images — des vignettes partout. Pour voir une image en entier, vous devez cliquer, attendre, revenir. Cette règle ajoute un aperçu au survol : vous survolez une vignette, une version plus grande surgit près du curseur. Une lightbox légère sans aucune bibliothèque.

La règle

Le JavaScript de la règle — motif d'URL pour la galerie que vous utilisez, ou * globalement :

const box = document.createElement('img');
box.style.cssText =
  'position:fixed;pointer-events:none;z-index:99999;max-width:40vw;' +
  'max-height:80vh;box-shadow:0 8px 32px rgba(0,0,0,.4);' +
  'border-radius:8px;display:none';
document.body.appendChild(box);
addEventListener('mouseover', (e) => {
  const img = e.target.closest('img');
  if (!img) return;
  box.src = img.currentSrc || img.src;
  box.style.display = 'block';
});
addEventListener('mousemove', (e) => {
  box.style.left = (e.clientX + 24) + 'px';
  box.style.top = (e.clientY + 24) + 'px';
});
addEventListener('mouseout', () => { box.style.display = 'none'; });

Comment ça marche

Un seul élément d'aperçu

On crée exactement un <img> et on le réutilise, en n'échangeant que son src. Aucun nettoyage du DOM, aucune fuite.

pointer-events: none

L'aperçu se place au-dessus de la page. Sans pointer-events: none, il capterait lui-même les événements souris — le curseur « entrerait » dans l'aperçu, mouseout se déclencherait mal et l'aperçu clignoterait. Avec cette règle, l'aperçu est transparent à la souris.

currentSrc contre src

img.currentSrc est la version que le navigateur a réellement choisie dans srcset — généralement plus nette que src. On l'utilise en premier, avec src en repli.

position: fixed plus coordonnées client

position: fixed place l'aperçu par rapport à la fenêtre, et e.clientX/clientY est la position du curseur par rapport à la fenêtre — ils correspondent, donc l'aperçu suit le curseur quel que soit le défilement.

Une variante — taille réelle au lieu de la vignette

Dans beaucoup de galeries, la vignette a une URL comme .../thumb/photo.jpg tandis que la taille réelle est .../large/photo.jpg. Remplacez box.src par l'adresse réécrite :

box.src = (img.currentSrc || img.src).replace('/thumb/', '/large/');

Le motif diffère d'un site à l'autre — regardez le src d'une vignette et d'une photo entière, trouvez la différence.

Pièges

À voir aussi

Installez JustZix — et regardez les photos sans cliquer sur chacune.

Notez cet article

Aucune note — soyez le premier.

Essayez vous-même

Installez JustZix et collez n'importe quel snippet de cet article. Deux minutes de zéro à une règle fonctionnelle sur tous vos appareils.

Obtenir JustZix

Fonctionnalités · Comment ça marche · Exemples · Cas d'usage