Implementar un comparador de imágenes deslizante usando HTML, CSS y JavaScript, ideal para mostrar diferencias entre dos imágenes superpuestas.
En muchas ocasiones necesitamos mostrar la diferencia entre dos versiones de una imagen — ya sea para resaltar un cambio, una edición, o simplemente para ilustrar un antes y después. Crearemos un componente que permite deslizar una barra vertical para revelar la imagen de fondo, comparándola visualmente con otra que está por encima.
Esto se puede resolver de controlada usando HTML, CSS y algo de JavaScript. Vamos a verlo paso a paso.
Creamos un contenedor con dos imágenes. La segunda imagen irá dentro de otro contenedor que limitaremos en ancho. La barra deslizante se coloca encima.
<div class="comparison-container"> <img src="imagen1.jpg" alt="Antes"> <div class="img-overlay-container"> <img src="imagen2.jpg" alt="Después" class="img-overlay"> </div> <div class="slider-bar"></div></div>
.img-overlay-container
: contenedor que controla cuánto de la imagen superior se muestra..img-overlay
: imagen superior..slider-bar
: barra que se puede mover horizontalmente para cambiar la comparación.A continuación, los estilos esenciales para posicionar todo correctamente. Añadimos algunas reglas clave que no conviene pasar por alto.
.comparison-container { position: relative; width: 600px; height: 400px; overflow: hidden; user-select: none;}
.comparison-container img { width: 100%; height: 100%; object-fit: cover; object-position: 0 50%; display: block;}
.img-overlay-container { position: absolute; top: 0; left: 0; height: 100%; width: 50%; overflow: hidden;}
.img-overlay { width: 100%; height: 100%; object-fit: cover; object-position: 0 50%; display: block;}
.slider-bar { position: absolute; top: 0; left: 50%; width: 8px; height: 100%; background-color: #ffdd00; cursor: ew-resize; transform: translateX(-50%); z-index: 10;}
Algunos detalles a considerar:
user-select: none
evita seleccionar texto accidentalmente al arrastrar.object-position: 0 50%
asegura que la imagen se alinee correctamente si no es del mismo tamaño exacto que el contenedor..img-overlay
simplemente es la imagen superior.El comportamiento es directo: al hacer clic y arrastrar la barra, modificamos el ancho del contenedor .img-overlay-container
y reposicionamos la barra.
const container = document.querySelector('.comparison-container');const overlay = container.querySelector('.img-overlay-container');const slider = container.querySelector('.slider-bar');
let isDragging = false;
slider.addEventListener('mousedown', () => { isDragging = true;});
window.addEventListener('mouseup', () => { isDragging = false;});
window.addEventListener('mousemove', (e) => { if (!isDragging) return;
const rect = container.getBoundingClientRect(); let offsetX = e.clientX - rect.left;
if (offsetX < 0) offsetX = 0; if (offsetX > rect.width) offsetX = rect.width;
const percentage = (offsetX / rect.width) * 100;
overlay.style.width = `${percentage}%`; slider.style.left = `${percentage}%`;});
El código es claro y directo. Rastrear el movimiento del mouse y ajustar estilos en tiempo real.
Puedes ver el ejemplo en funcionamiento:
<!DOCTYPE html><html lang="en">
<head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Control deslizante de comparación de imágenes</title> <style> .comparison-container { position: relative; width: 600px; height: 400px; overflow: hidden; user-select: none; }
.comparison-container img { width: 100%; height: 100%; object-fit: cover; object-position: 0 50%; display: block; }
.img-base { -webkit-filter: grayscale(100%); filter: gray; }
.img-overlay-container { position: absolute; top: 0; left: 0; height: 100%; width: 50%; overflow: hidden; }
.img-overlay { width: 100%; height: 100%; object-fit: cover; object-position: 0 50%; display: block; }
.slider-bar { position: absolute; top: 0; left: 50%; width: 8px; height: 100%; background-color: #ffdd00; cursor: ew-resize; transform: translateX(-50%); z-index: 10; } </style></head>
<body> <p> Arrastra la línea vertical para ver el efecto. </p>
<div class="comparison-container"> <img src="https://images.unsplash.com/photo-1597198399495-ff26429c4ad9?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Antes" class="img-base"> <div class="img-overlay-container"> <img src="https://images.unsplash.com/photo-1597198399495-ff26429c4ad9?q=80&w=3540&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Después" class="img-overlay"> </div> <div class="slider-bar"></div> </div>
<script> const container = document.querySelector('.comparison-container'); const overlay = container.querySelector('.img-overlay-container'); const slider = container.querySelector('.slider-bar');
let isDragging = false;
slider.addEventListener('mousedown', () => { isDragging = true; });
window.addEventListener('mouseup', () => { isDragging = false; });
window.addEventListener('mousemove', (e) => { if (!isDragging) return;
const rect = container.getBoundingClientRect(); let offsetX = e.clientX - rect.left;
if (offsetX < 0) offsetX = 0; if (offsetX > rect.width) offsetX = rect.width;
const percentage = (offsetX / rect.width) * 100;
overlay.style.width = `${percentage}%`; slider.style.left = `${percentage}%`; }); </script></body>
</html>
Un comparador de imágenes deslizante es sencillo de implementar y puede aportar valor visual en ciertos escenarios.
Con HTML, CSS y un poco de JavaScript logramos un control absoluto que puede integrarse fácilmente en cualquier sitio web. Además, podemos extenderlo o modificarlo cuando surja la necesidad — sin mayores complicaciones.