Componente Filtro de Galleria
toscadev
@ ToscaDevsJS
Utiliza los botones de filtro para explorar categorías específicas y descubre cómo una piel hermosa comienza aquí.
¡Desliza sobre las imágenes para apreciar cada detalle y sumérgete en la experiencia visual de nuestra galería única!"
Otros recursos
dependencias
dependencias.tsx
.imagenes {
animation: fadein 1s linear;
}
@keyframes fadein {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.image-container {
position: relative;
overflow: hidden;
}
.image-container img {
width: 100%;
height: auto;
display: block;
}
.overlay {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
opacity: 0;
transition: opacity 0.3s ease-in-out;
text-align: center;
color: white;
}
.image-container:hover .overlay {
opacity: 1;
}
Componentes
App
App/components/SectionGalery.tsx
/* eslint-disable @next/next/no-img-element */
"use client";
import { useEffect, useState } from "react";
import "./style.css";
import { GalleryData } from "@/database/database";
import { SectionTitle } from "@/components/UI";
export const GalleryData = [
{
id: 1,
titulo: "Body Treatments",
image:
"https://jthemes.net/themes/html/spamagic/files/images/gallery/img-1.jpg",
},
{
id: 2,
titulo: "Massage",
image:
"https://jthemes.net/themes/html/spamagic/files/images/gallery/img-09.jpg",
},
{
id: 3,
titulo: "Aroma Therapy",
image:
"https://jthemes.net/themes/html/spamagic/files/images/gallery/img-2.jpg",
},
{
id: 4,
titulo: "Herbs",
image:
"https://jthemes.net/themes/html/spamagic/files/images/gallery/img-5.jpg",
},
{
id: 5,
titulo: "Herbs",
image:
"https://jthemes.net/themes/html/spamagic/files/images/gallery/img-6.jpg",
},
];
// Definición de la interfaz para los datos de la galería
interface GalleryItem {
id: number;
titulo: string;
image: string;
}
export const SectionGalery = () => {
const [data, setData] = useState<GalleryItem[]>([]);
const [collection, setCollection] = useState<string[]>([]);
useEffect(() => {
setData(GalleryData);
setCollection([...new Set(GalleryData.map((item) => item.titulo))]);
}, []);
const gallery_filter = (itemData: string) => {
const filterData = GalleryData.filter((item) => item.titulo === itemData);
setData(filterData);
};
return (
<section className="mt-12 p-5 container mx-auto">
<SectionTitle
text1={"Nuestra Galería"}
text2={"Una Piel Hermosa Comienza Aquí"}
descriptions="Algunas personas reciben de la publicidad, el duelo no es puro en sí,
ni la ola de dolor. ante todo el tiempo libre, se siente halagado por
el desarrollo del casino a gran ritmor"
/>
<div className="mb-8 mt-12">
<ul className="flex flex-wrap text-center justify-center gap-6 p-5">
<li>
<button
onClick={() => setData(GalleryData)}
className="text-lg leading-4 font-semibold text-fondoSelect-claro dark:text-beige-claro transition-all duration-300 ease-in-out transform hover:scale-110"
>
Todos
</button>
</li>
{collection.map((item, index) => (
<li key={index}>
<button
onClick={() => {
gallery_filter(item);
}}
className="text-lg leading-4 font-semibold transition-all duration-300 ease-in-out transform hover:scale-110"
>
{item}
</button>
</li>
))}
</ul>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{data.map((item) => (
<article
key={item.id}
className="relative image-container overflow-hidden rounded-lg shadow-lg transition-all duration-300 ease-in-out transform hover:scale-105"
>
<img
src={item.image}
alt={item.titulo}
decoding="async"
loading="lazy"
className="aspect-square imagenes w-full h-full object-cover transition-all duration-300 ease-in-out transform hover:scale-110"
/>
<div className="absolute bottom-0 left-0 right-0 text-white p-4">
<p className=" text-xs leading-7 tracking-wide font-bold bg-beige-claro bg-opacity-50 inline-block px-2 py-1 rounded-full">
{item.titulo}
</p>
</div>
<div className="overlay">
<p className="text-white font-semibold text-lg">
Mostar Gigante {item.titulo}
</p>
</div>
</article>
))}
</div>
</section>
);
};
NOTAS DEL DESARROLLADOR
-Botones de Filtro:
Se generan botones dinámicamente para mostrar todas las categorías y permitir el filtrado de la galería por título.
-Visualización de Imágenes:
Se muestra cada imagen de la galería con su título y una descripción adicional al hacer hover sobre la imagen.
Si te gusto esta guía no dudes en compartirla o sugerir tu opinión. ❤️