aeworks.tech/lab/imagen-pixeles
← AE Lab

La imagen que se monta con píxeles

14 oct 2026· nivel avanzadocanvaspartículasfísica

Un escaparate de producto que se construye con cientos de píxeles que vuelan y encajan en su sitio. Pasa el dedo por encima y se apartan como si los empujaras; al cambiar de producto, se desmontan y forman el siguiente.

// CÓMO ESTÁ HECHO

  1. Cada producto se dibuja con trazos de canvas en un lienzo invisible y se lee con getImageData: cada celdilla opaca se convierte en un píxel con su color y su destino.
  2. Los píxeles se reutilizan entre productos: se barajan los destinos, faltantes nacen en sitios aleatorios y los que sobran salen volando y se desvanecen.
  3. Un muelle con rozamiento lleva cada píxel a su destino, con un retraso escalonado de izquierda a derecha y un empujón inicial hacia fuera al desmontar.
  4. El puntero (ratón o dedo con pointer events) aplica una fuerza de repulsión que cae al cuadrado con la distancia; el muelle los devuelve solos.
  5. Presupuesto de partículas por pantalla (celdas más grandes si se pasa) para ir a 60 fps en móvil, y un dedo fantasma en curva de Lissajous para el modo demostración.

// EL CÓDIGO

<canvas id="lienzo" aria-hidden="true"></canvas>

<main class="app">
  <header class="cabecera">
    <span><b>AE</b> Lab · Escaparate de píxeles</span>
    <span class="contador" id="contador">0 píxeles</span>
  </header>

  <div class="escenario" id="escenario" role="img" aria-label="Producto"></div>

  <section class="ficha" id="ficha" aria-live="polite">
    <span class="categoria" id="categoria"></span>
    <h1 class="nombre" id="nombre"></h1>
    <p class="texto" id="texto"></p>
    <div class="compra">
      <span class="precio" id="precio"></span>
      <button class="siguiente" id="siguiente" type="button">
        Siguiente producto
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
      </button>
    </div>
    <div class="puntos" id="puntos" aria-label="Elegir producto"></div>
    <div class="progreso" aria-hidden="true"><i id="barraProgreso"></i></div>
    <p class="pista">Pasa el <b>ratón</b> o el <b>dedo</b> por encima<span class="solo-teclado"> · <b>← →</b> para cambiar</span></p>
  </section>
</main>