Carrusel receptivo usando React
- Carrusel receptivo usando React Slick
- Carrusel receptivo usando ganchos de reacción
- Carrusel receptivo usando React Material-UI
- Conclusión
El carrusel React es un efecto que nos permite mostrar elementos en forma de diapositivas. De esta manera, podemos mostrar fácilmente varios elementos sin necesidad de desplazarnos hacia arriba y hacia abajo en la página, ya que los elementos que deseamos ver se desentrañan uno tras otro.
Este impresionante diseño es ideal para sitios web de comercio electrónico. Es una buena manera de mostrar productos de una sola vez.
Además, para alguien que tiene la intención de crear una cartera, el efecto carrusel es excelente para permitir que los visitantes del sitio web vean los servicios ofrecidos sin estrés.
Hay diferentes formas en que podemos utilizar este efecto deslizante en React. Podemos usar el carrusel con botones de flecha, para que los usuarios puedan hacer clic manualmente hacia adelante o hacia atrás para ver los elementos.
Podríamos hacerlo automático, donde los elementos se muestran automáticamente desde el principio hasta el final y luego comienza de nuevo, como un bucle.
Entonces, en el futuro, veamos diferentes métodos para llamar a esta función dentro del marco React.
Carrusel receptivo usando React Slick
Este ejemplo utiliza la dependencia react-slick
para funcionar. Después de crear una nueva carpeta de proyecto, procedemos a la carpeta de proyecto dentro de nuestra terminal e instalamos la biblioteca. Usaremos npm install react-slick --save
para instalar.
También necesitamos instalar el slick-carousel
de React; esto nos permitirá configurar el CSS y las fuentes del carrusel. Instalaremos esta dependencia con npm install slick-carousel
.
Luego crearemos dos carpetas: una es para el carrusel y la otra es para el aspecto CSS. Crearemos la carpeta Componentes; dentro de él, crearemos el Slider.js
.
Luego creamos otra carpeta; llamaremos a esto css
. Y crearemos el archivo App.scss
dentro de él.
Luego, después de eso, procedemos al archivo Slider.js
e ingresamos estos códigos:
Fragmento de código (Slider.js
):
import React from 'react';
import Slider from "react-slick";
import "slick-carousel/slick/slick.css";
import "slick-carousel/slick/slick-theme.css";
function ImageSlider() {
let settings = {
dots: true,
infinite: true,
speed: 500,
slidesToShow: 3,
slidesToScroll: 1,
cssEase: "linear"
}
return (
<Slider {...settings}>
<div className="card-wrapper">
<div className="card">
<div className="card-image">
<img src="images/1.jpg" />
</div>
<ul className="social-icons">
<li><a href="#"><i className="fa fa-facebook"></i></a></li>
<li><a href="#"><i className="fa fa-instagram"></i></a></li>
<li><a href="#"><i className="fa fa-twitter"></i></a></li>
<li><a href="#"><i className="fa fa-dribbble"></i></a></li>
</ul>
<div className="details">
<h2>BMW <span className="job-title">M5</span></h2>
</div>
</div>
</div>
<div className="card-wrapper">
<div className="card">
<div className="card-image">
<img src="images/2.png" />
</div>
<ul className="social-icons">
<li><a href="#"><i className="fa fa-facebook"></i></a></li>
<li><a href="#"><i className="fa fa-instagram"></i></a></li>
<li><a href="#"><i className="fa fa-twitter"></i></a></li>
<li><a href="#"><i className="fa fa-dribbble"></i></a></li>
</ul>
<div className="details">
<h2>Graphic <span className="job-title">Design</span></h2>
</div>
</div>
</div>
<div className="card-wrapper">
<div className="card">
<div className="card-image">
<img src="images/3.png" />
</div>
<ul className="social-icons">
<li><a href="#"><i className="fa fa-facebook"></i></a></li>
<li><a href="#"><i className="fa fa-instagram"></i></a></li>
<li><a href="#"><i className="fa fa-twitter"></i></a></li>
<li><a href="#"><i className="fa fa-dribbble"></i></a></li>
</ul>
<div className="details">
<h2>Embrace<span className="job-title">Your Darkness</span></h2>
</div>
</div>
</div>
<div className="card-wrapper">
<div className="card">
<div className="card-image">
<img src="images/4.jpg" />
</div>
<ul className="social-icons">
<li><a href="#"><i className="fa fa-facebook"></i></a></li>
<li><a href="#"><i className="fa fa-instagram"></i></a></li>
<li><a href="#"><i className="fa fa-twitter"></i></a></li>
<li><a href="#"><i className="fa fa-dribbble"></i></a></li>
</ul>
<div className="details">
<h2>ML <span className="job-title">Fashion</span></h2>
</div>
</div>
</div>
</Slider>
)
}
export default ImageSlider
Creamos componentes que incluyen los datos y las imágenes de los elementos que queremos usar, y luego envolvemos todo esto dentro de la etiqueta <Slider></Slider>
. Esta es la biblioteca de carrusel que instalamos anteriormente.
A continuación, vamos a la carpeta App.js
para escribir estos bits de código:
Fragmento de código (App.js
):
import ImageSlider from "./Components/Slider";
import "./css/App.css"
function App() {
return (
<div className="container mt-5 carousel">
<h1 className="slider_title">React Image Carousel</h1>
<ImageSlider />
</div>
);
}
export default App;
Debido a que el carrusel es un tipo de diseño de efectos para páginas web, el aspecto CSS es una parte muy importante de la configuración. Haremos mucho CSS para controlar cómo se mueve cada imagen y cuánto tarda en transitar.
Fragmento de código (App.scss
):
* {
margin: 0;
padding: 0;
}
body {
display: block;
width: 100%;
height: 100vh;
overflow: hidden;
font-family: "Raleway", sans-serif;
position: relative;
background: #333;
}
.slider_title {
font-size: 5vw;
color: tomato;
text-transform: uppercase;
text-align: center;
margin-bottom: 2vw;
}
.card-wrapper {
position: relative;
width: 100%;
padding: 0 10px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.card-wrapper:active, .card-wrapper:hover, .card-wrapper:focus {
outline: none;
border: none;
}
.card {
width: 100%;
height: 450px;
border-radius: 16px;
overflow: hidden;
cursor: pointer;
position: relative;
}
.card .card-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 2;
background-color: #000;
-webkit-transition: .5s;
transition: .5s;
}
.card .card-image img {
width: 100%;
height: 100%;
-o-object-fit: cover;
object-fit: cover;
}
.card:hover img {
opacity: .4;
-webkit-transition: .5s;
transition: .5s;
}
.card:hover .card-image {
-webkit-transform: translateY(-100px);
transform: translateY(-100px);
-webkit-transition: all .9s;
transition: all .9s;
}
.social-icons {
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
z-index: 3;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.social-icons li {
list-style: none;
}
.social-icons li a {
position: relative;
display: block;
width: 50px;
height: 50px;
line-height: 50px;
text-align: center;
background: #fff;
font-size: 23px;
color: #333;
font-weight: bold;
margin: 0 6px;
-webkit-transition: .4s;
transition: .4s;
-webkit-transform: translateY(200px);
transform: translateY(200px);
opacity: 0;
}
.card:hover .social-icons li a {
-webkit-transform: translateY(0px);
transform: translateY(0px);
opacity: 1;
}
.social-icons li a:hover {
background: #000;
-webkit-transition: .2s;
transition: .2s;
}
.social-icons li a:hover .fa {
color: #fff;
}
.social-icons li a .fa {
-webkit-transition: .8s;
transition: .8s;
}
.social-icons li a .fa:hover {
-webkit-transform: rotateY(360deg);
transform: rotateY(360deg);
color: #fff;
}
.card:hover li:nth-child(1) a {
-webkit-transition-delay: .1s;
transition-delay: .1s;
}
.card:hover li:nth-child(2) a {
-webkit-transition-delay: .2s;
transition-delay: .2s;
}
.card:hover li:nth-child(3) a {
-webkit-transition-delay: .3s;
transition-delay: .3s;
}
.card:hover li:nth-child(4) a {
-webkit-transition-delay: .4s;
transition-delay: .4s;
}
.details {
position: absolute;
bottom: 400px;
left: 0;
background: #fff;
width: 100%;
height: 120px;
z-index: 1;
padding: 10px;
-webkit-transition: .6s;
transition: .6s;
}
.details h2 {
margin: 30px 0;
padding: 0;
text-align: center;
}
.details h2 .job-title {
font-size: 16px;
line-height: 2;
color: #333;
font-weight: 300;
display: block;
}
.card:hover .details {
bottom: 0;
}
.carousel .slick-dots {
bottom: -2.5vw;
}
.carousel .slick-dots li button {
width: 20px;
height: 20px;
border: 1px solid #fff;
border-radius: 20px;
}
.carousel .slick-dots li button:before {
position: absolute;
top: 50%;
left: 50%;
width: 10px;
height: 10px;
border-radius: 10px;
content: "";
text-align: center;
opacity: .5;
color: #000;
background-color: #fff;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
-webkit-transition: all .3s ease-in-out;
transition: all .3s ease-in-out;
}
.carousel .slick-dots li.slick-active button, .carousel .slick-dots li:hover button {
border-color: tomato;
}
.carousel .slick-dots li.slick-active button:before, .carousel .slick-dots li:hover button:before {
background-color: tomato;
opacity: 1;
}
.carousel .slick-prev, .carousel .slick-next {
width: 50px;
height: 50px;
background-color: #fff;
}
.carousel .slick-prev:hover, .carousel .slick-prev:focus, .carousel .slick-next:hover, .carousel .slick-next:focus {
color: #fff;
outline:
none;
background: #fff;
}
.carousel .slick-prev:before, .carousel .slick-next:before {
color: #000;
font-family: "Raleway", sans-serif;
}
.carousel .slick-next {
right: -55px;
}
.carousel .slick-prev {
left: -55px;
}
También establecemos el tamaño de la imagen dentro del CSS. También configuramos cómo mostrar la información agregada a las imágenes y la fuente.
Producción:
Carrusel receptivo usando ganchos de reacción
En este ejemplo, utilizaremos el gancho useState
de React, ya que ayuda a cambiar entre valores, lo que sucede con el efecto carrusel.
Después de crear un nuevo proyecto de reacción, necesitamos instalar la biblioteca react-icons
usando npm install react-icons
. Esta dependencia nos proporcionará los iconos de flecha izquierda y derecha que usaremos para deslizarnos entre las imágenes.
Luego navegamos a la carpeta src
dentro de las carpetas del proyecto y creamos una nueva carpeta llamada components
. Crearemos dos archivos dentro de él, a saber: SliderData.js
e ImageSlider
.
Procedemos al aspecto de codificación, primero con el ImageSlider.js
:
Fragmento de código (ImageSlider.js
):
import React, { useState } from 'react';
import { SliderData } from './SliderData';
import { FaArrowAltCircleRight, FaArrowAltCircleLeft } from 'react-icons/fa';
const ImageSlider = ({ slides }) => {
const [current, setCurrent] = useState(0);
const length = slides.length;
const nextSlide = () => {
setCurrent(current === length - 1 ? 0 : current + 1);
};
const prevSlide = () => {
setCurrent(current === 0 ? length - 1 : current - 1);
};
if (!Array.isArray(slides) || slides.length <= 0) {
return null;
}
return (
<section className='slider'>
<FaArrowAltCircleLeft className='left-arrow' onClick={prevSlide} />
<FaArrowAltCircleRight className='right-arrow' onClick={nextSlide} />
{SliderData.map((slide, index) => {
return (
<div
className={index === current ? 'slide active' : 'slide'}
key={index}>
{index === current && (
<img src={slide.image} alt='travel image' className='image' />
)}
</div>
);
})}
</section>
);
};
export default ImageSlider;
Aplicando la función useState
, configuramos nextSlide
para aumentar, es decir, pasar al siguiente elemento, mientras que prevSlide
hace exactamente lo contrario. Luego llamamos al detector de eventos onClick
para activar estas funciones cada vez que se haga clic en sus flechas correspondientes.
Avanzando, nos dirigimos a SliderData.js
. Aquí es donde hacemos una matriz de las imágenes que queremos mostrar con el efecto carrusel.
Fragmento de código (SliderData.js
):
export const SliderData = [
{
image:
'https://images.unsplash.com/photo-1546768292-fb12f6c92568?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1350&q=80'
},
{
image:
'https://images.unsplash.com/photo-1501446529957-6226bd447c46?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=1489&q=80'
},
{
image:
'https://images.unsplash.com/photo-1483729558449-99ef09a8c325?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=1350&q=80'
},
{
image:
'https://images.unsplash.com/photo-1475189778702-5ec9941484ae?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=1351&q=80'
},
{
image:
'https://images.unsplash.com/photo-1503177119275-0aa32b3a9368?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=1350&q=80'
}
];
Luego nos dirigimos a App.js
y agregamos un poco de código:
Fragmento de código (App.js
):
import './App.css';
import ImageSlider from './components/ImageSlider';
import { SliderData } from './components/SliderData';
function App() {
return <ImageSlider slides={SliderData} />;
}
export default App;
El CSS mencionado anteriormente juega un papel vital para garantizar que el efecto de carrusel funcione como se desea, por lo que nos dirigimos al archivo App.css
y hacemos algunos ajustes:
Fragmento de código (App.css
):
.slider {
position: relative;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.image {
width: 1000px;
height: 600px;
border-radius: 10px;
}
.right-arrow {
position: absolute;
top: 50%;
right: 32px;
font-size: 3rem;
color: #000;
z-index: 10;
cursor: pointer;
user-select: none;
}
.left-arrow {
position: absolute;
top: 50%;
left: 32px;
font-size: 3rem;
color: #000;
z-index: 10;
cursor: pointer;
user-select: none;
}
.slide {
opacity: 0;
transition-duration: 1s ease;
}
.slide.active {
opacity: 1;
transition-duration: 1s;
transform: scale(1.08);
}
El efecto carrusel debería funcionar excelentemente cuando colocamos todos estos códigos como se indica.
Producción:
Carrusel receptivo usando React Material-UI
React Material-UI es una biblioteca de características que implementaremos para configurar las flechas de navegación para el carrusel de reacción, luego usaremos los ganchos de estado de reacción para terminar el trabajo.
Después de crear un nuevo proyecto, instalamos material-UI con npm install @material-ui/core
y npm install @material-ui/icons
.
Ahora nos dirigimos a src
y creamos 3 carpetas, Components
, Helpers
e Images
. Crearemos Carousel.js
y Carousel.css
dentro de la carpeta Components
.
Crearemos CarouselData.js
dentro de la carpeta Helpers
y colocaremos las imágenes dentro de la carpeta Images
. Comenzamos con la carpeta Carousel.js
e ingresamos estos códigos:
Fragmento de código (Carousel.js
):
import React, { useState } from "react";
import "./Carousel.css";
import { images } from "../Helpers/CarouselData";
import ArrowBackIosIcon from "@material-ui/icons/ArrowBackIos";
import ArrowForwardIosIcon from "@material-ui/icons/ArrowForwardIos";
function Carousel() {
const [currImg, setCurrImg] = useState(0);
return (
<div className="carousel">
<div
className="carouselInner"
style={{ backgroundImage: `url(${images[currImg].img})` }}
>
<div
className="left"
onClick={() => {
currImg > 0 && setCurrImg(currImg - 1);
}}
>
<ArrowBackIosIcon style={{ fontSize: 30 }} />
</div>
<div className="center">
<h1>{images[currImg].title}</h1>
<p>{images[currImg].subtitle}</p>
</div>
<div
className="right"
onClick={() => {
currImg < images.length - 1 && setCurrImg(currImg + 1);
}}
>
<ArrowForwardIosIcon style={{ fontSize: 30 }} />
</div>
</div>
</div>
);
}
export default Carousel;
Aquí es donde configuramos todas las operaciones de navegación usando el useState
para definir qué sucede cuando hacemos clic en cualquiera de las flechas, lo que activa el detector de eventos onClick
.
Luego configuramos el CSS correspondiente usando el Carousel.css
:
Fragmento de código (Carousel.css
):
.carousel {
width: 60%;
height: 700px;
background-color: black;
}
.carouselInner {
height: 100%;
width: 100%;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
display: flex;
}
.carouselInner .left {
flex: 5%;
height: 100%;
background-color: rgb(0, 0, 0, 0.6);
display: grid;
place-items: center;
color: white;
cursor: pointer;
}
.carouselInner .center {
flex: 80%;
height: 100%;
display: grid;
place-items: center;
font-family: Arial, Helvetica, sans-serif;
text-align: justify;
text-align-last: center;
}
h1 {
font-size: 5rem;
}
p {
font-size: 2rem;
}
h1, p {
background-color: rgb(255, 255, 255, 0.8);
padding: 20px;
border-radius: 9px;
}
.carouselInner .right {
flex: 5%;
height: 100%;
background-color: rgb(0, 0, 0, 0.6);
display: grid;
place-items: center;
color: white;
cursor: pointer;
}
En la carpeta Helpers
, tenemos el archivo CarouselData.js
. Como su nombre lo indica, el archivo alberga las imágenes y otra información que queremos mostrar en la página web.
Fragmento de código (CarouselData.js
):
import City from "../Images/city.jpg";
import Salvador from "../Images/salvador.jpg";
import Ubc from "../Images/ubc.jpg";
export const images = [
{ title: "San Diego",
subtitle: "This is San Diego",
img: City,
},
{
title: "Salvador, Brazil",
subtitle: "The Best City in the World",
img: Salvador,
},
{
title: "UBC (Vancouver)",
subtitle: "The University of British Columbia",
img: Ubc,
},
];
Por último, hacemos un poco de codificación en App.js
. Este archivo se asegura de que nuestro proyecto se represente bien.
Fragmento de código (App.js
):
import "./App.css";
import Carousel from "./Components/Carousel";
import React from "react";
function App() {
return (
<div className="App">
<Carousel />
</div>
);
}
export default App;
Producción:
Conclusión
El efecto carrusel embellece las páginas web sin importar la intención para la que se utilice. Y el marco React proporciona una plataforma muy flexible para explorar numerosas formas de poner en marcha los efectos de diapositivas en nuestras aplicaciones web.
Fisayo is a tech expert and enthusiast who loves to solve problems, seek new challenges and aim to spread the knowledge of what she has learned across the globe.
LinkedIn