Acceso

Comparador de Imágenes Antes y Después

toscadev

@ ToscaDevsJS


Comparador de Imágenes Antes y Después:

Este componente permite a los usuarios comparar imágenes antes y después de algún tipo de cambio.

desliza para ver cambios

App
App/components/BeforeAfterImageCompare.tsx

/* eslint-disable @next/next/no-img-element */
"use client";
import { useState } from "react";

export const BeforeAfterImageCompare = () => {
  const [sliderPosition, setSliderPosition] = useState<number>(50);
  const [isDragging, setIsDragging] = useState<boolean>(false);

  const handleMove = (
    event: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>
  ) => {
    if (!isDragging) return;

    const rect = event.currentTarget.getBoundingClientRect();
    const clientX = event.type.includes("touch")
      ? (event as React.TouchEvent<HTMLDivElement>).touches[0].clientX
      : (event as React.MouseEvent<HTMLDivElement>).clientX;
    const x = Math.max(0, Math.min(clientX - rect.left, rect.width));
    const percent = Math.max(0, Math.min((x / rect.width) * 100, 100));

    setSliderPosition(percent);
  };

  const handleStart = (
    event: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>
  ) => {
    setIsDragging(true);
    event.preventDefault(); // Prevent scrolling on touch devices
  };

  const handleEnd = () => {
    setIsDragging(false);
  };

  return (
    <div
      className="w-full relative "
      onTouchEnd={handleEnd}
      onMouseUp={handleEnd}
    >
      <div
        // aspect-[70/45]
        className="relative  w-full  md:max-w-[600px]  m-auto overflow-hidden select-none"
        onTouchMove={handleMove}
        onMouseMove={handleMove}
        onTouchStart={handleStart}
        onMouseDown={handleStart}
      >
        <img
          alt="Image after"
          loading="lazy"
          decoding="async"
          className=" object-cover h-full rounded-lg"
          src="https://creamz.wpengine.com/wp-content/uploads/2023/09/home-two-one-after-image-3.jpg"
        />

        <div
          // aspect-[70/45]
          className="absolute  top-0 left-0 right-0 w-full md:max-w-[600px]  m-auto overflow-hidden select-none"
          style={{ clipPath: `inset(0 ${100 - sliderPosition}% 0 0)` }}
        >
          <img
            loading="lazy"
            decoding="async"
            className=" object-cover h-full rounded-lg"
            alt="Image Before"
            src="https://creamz.wpengine.com/wp-content/uploads/2023/09/home-two-one-before-image-4.jpg"
          />
        </div>

        <div
          className="absolute top-0 bottom-0 w-1 bg-white dark:bg-black cursor-ew-resize"
          style={{
            left: `calc(${sliderPosition}% - 1px)`,
          }}
        >
          <div className="bg-white dark:bg-black absolute rounded-full h-3 w-3 -left-1 top-[calc(50%-5px)]" />
        </div>
      </div>
    </div>
  );
};

NOTAS DEL DESARROLLADOR

-Estado del componente: br

Utiliza el hook useState de React para gestionar dos estados: sliderPosition y isDragging. sliderPosition: Almacena la posición del control deslizante que se utiliza para comparar las imágenes. Inicialmente, está configurado en un 50%, lo que sugiere que las dos imágenes se mostrarán en partes iguales. isDragging: Indica si el usuario está arrastrando el control deslizante.

-Manejo de eventos:

Define tres funciones de manejo de eventos: handleMove, handleStart, y handleEnd. handleMove: Actualiza la posición del control deslizante en función de la posición del ratón o del toque del usuario. handleStart: Inicia el proceso de arrastre y previene el comportamiento predeterminado (scrolling en dispositivos táctiles). handleEnd: Finaliza el proceso de arrastre.

-Renderizado del componente:

El componente utiliza un contenedor div que ocupa el ancho completo y es relativo. Dentro de este contenedor, hay otro div que contiene dos imágenes apiladas una encima de la otra, y un control deslizante entre ellas. El control deslizante es una barra vertical que el usuario puede arrastrar horizontalmente para revelar más de una de las imágenes. Se utilizan eventos táctiles y de ratón para gestionar el arrastre del control deslizante.

-Imágenes: Las dos imágenes están embebidas en el componente. La primera imagen representa el estado "después" y la segunda imagen representa el estado "antes". La posición del control deslizante determina cuánto de cada imagen se muestra. Estilo:


Si te gusto esta guía no dudes en compartirla o sugerir tu opinión. ❤️


Regresar al Blog.

© Copyright 2024 ToscaDevJS.