← Tutti gli articoli

Tutorial

Zoom dell'immagine al passaggio del mouse — una lightbox senza libreria

Gallerie, negozi, banche di immagini — miniature ovunque. Per vedere un'immagine per intero, devi cliccare, aspettare, tornare indietro. Questa regola aggiunge un'anteprima al passaggio del mouse: passi il mouse su una miniatura, una versione più grande compare accanto al cursore. Una lightbox leggera senza alcuna libreria.

La regola

Il JavaScript della regola — pattern di URL per la galleria che usi, o * globalmente:

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'; });

Come funziona

Un solo elemento di anteprima

Creiamo esattamente un <img> e lo riutilizziamo, scambiando solo il suo src. Nessuna pulizia del DOM, nessuna perdita.

pointer-events: none

L'anteprima sta sopra la pagina. Senza pointer-events: none catturerebbe essa stessa gli eventi del mouse — il cursore «entrerebbe» nell'anteprima, mouseout si attiverebbe in modo errato e l'anteprima tremolerebbe. Con questa regola l'anteprima è trasparente al mouse.

currentSrc contro src

img.currentSrc è la versione che il browser ha effettivamente scelto da srcset — di solito più nitida di src. La usiamo per prima, con src come riserva.

position: fixed più coordinate client

position: fixed posiziona l'anteprima rispetto alla finestra, e e.clientX/clientY è la posizione del cursore rispetto alla finestra — coincidono, quindi l'anteprima segue il cursore indipendentemente dallo scroll.

Una variante — dimensione piena invece della miniatura

In molte gallerie la miniatura ha un URL come .../thumb/foto.jpg mentre la dimensione piena è .../large/foto.jpg. Sostituisci box.src con l'indirizzo riscritto:

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

Il pattern varia da sito a sito — guarda il src di una miniatura e di una foto piena, trova la differenza.

Trappole

Vedi anche

Installa JustZix — e guarda le foto senza cliccare su ognuna.

Valuta questo articolo

Nessuna valutazione — sii il primo.

Provalo tu stesso

Installa JustZix e incolla qualsiasi snippet di questo articolo. Due minuti da zero a una regola funzionante su tutti i tuoi dispositivi.

Ottieni JustZix

Funzionalità · Come funziona · Esempi · Casi d'uso