To develop an Image Carousel in react using hooks.
- Create a react project using npx-create-react-app project name
- Create the required components for carousel like slidercontent.js, slider.js, arrows.js and dots.js
- Import the required images from internet for the slides.
- Include those images in the components using import command.
- Create a .css file for the carousel outlook.
- Launch the program using npm start
- End the program.
import First from "../assets/img1.jpeg";
import Second from "../assets/img2.jpg";
import Third from "../assets/img5.jpeg";
import Fourth from "../assets/img6.jpeg";
export default [
{
title: "First Slide",
description: "This is the first slider Image of our carousel",
urls: First,
},
{
title: "Second Slide",
description: "This is the second slider Image of our carousel",
urls: Second,
},
{
title: "Third Slide",
description: "This is the Third slider Image of our carousel",
urls: Third,
},
{
title: "Fourth Slide",
description: "This is the Fourth slider Image of our carousel",
urls: Fourth
},
];
import React from "react";
function SliderContent({ activeIndex, sliderImage }) {
return (
<section>
{sliderImage.map((slide, index) => (
<div
key={index}
className={index === activeIndex ? "slides active" : "inactive"}
>
<img className="slide-image" src={slide.urls} alt="" />
<h2 className="slide-title">{slide.title}</h2>
<h3 className="slide-text">{slide.description}</h3>
</div>
))}
</section>
);
}
export default SliderContent;
import React, { useEffect, useState } from "react";
import SliderContent from "./slidercontent";
import Dots from "./dots";
import Arrows from "./arrows";
import sliderImage from "./imageslider";
import "./slider.css";
const len = sliderImage.length - 1;
function Slider(props) {
const [activeIndex, setActiveIndex] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setActiveIndex(activeIndex === len ? 0 : activeIndex + 1);
}, 5000);
return () => clearInterval(interval);
}, [activeIndex]);
return (
<div className="slider-container">
<SliderContent activeIndex={activeIndex} sliderImage={sliderImage} />
<Arrows
prevSlide={() =>
setActiveIndex(activeIndex < 1 ? len : activeIndex - 1)
}
nextSlide={() =>
setActiveIndex(activeIndex === len ? 0 : activeIndex + 1)
}
/>
<Dots
activeIndex={activeIndex}
sliderImage={sliderImage}
onclick={(activeIndex) => setActiveIndex(activeIndex)}
/>
</div>
);
}
export default Slider;
import React from "react";
function Dots({ activeIndex, onclick, sliderImage }) {
return (
<div className="all-dots">
{sliderImage.map((slide, index) => (
<span
key={index}
className={`${activeIndex === index ? "dot active-dot" : "dot"}`}
onClick={() => onclick(index)}
></span>
))}
</div>
);
}
export default Dots;
import React from "react";
function Arrows({ prevSlide, nextSlide }) {
return (
<div className="arrows">
<span className="prev" onClick={prevSlide}>
❮
</span>
<span className="next" onClick={nextSlide}>
❯
</span>
</div>
);
}
export default Arrows;
* {
box-sizing: border-box;
margin: 0;
}
:root {
--heights: 50vh;
--widths: 100%;
}
.slider-container {
height: var(--heights);
width: var(--widths);
position: relative;
margin: auto;
overflow: hidden;
}
.active {
display: inline-block;
}
.inactive {
display: none;
}
.slides {
height: var(--heights);
width: var(--widths);
position: relative;
}
.slide-image {
width: 100%;
height: 100%;
position: absolute;
object-fit: cover;
}
.slide-title,
.slide-text {
width: 100%;
height: 100%;
color: white;
font-size: 50px;
position: absolute;
text-align: center;
top: 40%;
z-index: 10;
}
.slide-text {
top: 65%;
font-size: 2rem;
}
.prev,
.next {
color: transparent;
cursor: pointer;
z-index: 100;
position: absolute;
top: 50%;
width: auto;
padding: 1rem;
margin-top: -3rem;
font-size: 40px;
font-weight: bold;
border-radius: 0px 5px 5px 0px;
}
.slider-container:hover .prev,.slider-container:hover .next {
color: black
}
.slider-container:hover .prev:hover,
.slider-container:hover .next:hover {
color: white;
background-color: rgba(0, 0, 0, 0.6);
transition: all 0.5s ease-in;
}
.next {
right: 0;
border-radius: 5px 0px 0px 5px;
}
.all-dots {
width: 100%;
height: 100%;
position: absolute;
display: flex;
top: 85%;
justify-content: center;
z-index: 200;
}
.dot {
cursor: pointer;
height: 1.5rem;
width: 1.5rem;
margin: 0px 3px;
background-color: transparent;
/* background-color: rgba(0, 0, 0, 0.3); */
border-radius: 50%;
display: inline-block;
}
.slider-container:hover .dot:hover {
background-color: rgba(255, 255, 255, 0.5);
}
/* .active-dot {
background-color: rgba(255, 255, 255, 0.5);
} */
.slider-container:hover .dot{
background-color: rgba(0, 0, 0, 0.3);
}
.slider-container:hover .active-dot{
background-color: rgba(255, 255, 255, 0.5);
}
.play-pause {
color: black;
}
import Slider from "./components/slider";
function App() {
return <Slider />;
}
export default App;
![image](https://private-user-images.githubusercontent.com/93427376/244916635-989da404-a8c8-4e0f-829e-118d60d8dd11.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIxNjI4MjIsIm5iZiI6MTcyMjE2MjUyMiwicGF0aCI6Ii85MzQyNzM3Ni8yNDQ5MTY2MzUtOTg5ZGE0MDQtYThjOC00ZTBmLTgyOWUtMTE4ZDYwZDhkZDExLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI4VDEwMjg0MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk0ZWI4NGRjNGFiZmFiZmE2NWYzMDAwZDQxYzY0NDY2ZGY0MjhhNGYyOWY5N2UxNTMxZjIxNzJlMjI2ZGMwZjYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.9ius_1a4P5_mAWdqjpN94SBu9gplP6IJx8hm07CzRF4)
![image](https://private-user-images.githubusercontent.com/93427376/244916628-933ac2ce-0ef7-4b2f-ab96-f718bb97475e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIxNjI4MjIsIm5iZiI6MTcyMjE2MjUyMiwicGF0aCI6Ii85MzQyNzM3Ni8yNDQ5MTY2MjgtOTMzYWMyY2UtMGVmNy00YjJmLWFiOTYtZjcxOGJiOTc0NzVlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI4VDEwMjg0MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThkZTE0M2E5NjNlZmEzNjhmZDBkMDk5YTJkMjQ4ZjU2YzRmOTZkZWRjNTViYzEzZmVhMzI4ZTA4ODRiZWY4YjQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Nw4ebKZRc3PpMToFiOJVafo61npWgi3x5Ec-D9a_pks)
![image](https://private-user-images.githubusercontent.com/93427376/244916644-1f599cf1-59f6-4645-9a45-bf6866042ea7.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIxNjI4MjIsIm5iZiI6MTcyMjE2MjUyMiwicGF0aCI6Ii85MzQyNzM3Ni8yNDQ5MTY2NDQtMWY1OTljZjEtNTlmNi00NjQ1LTlhNDUtYmY2ODY2MDQyZWE3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI4VDEwMjg0MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg3YTEyMmUyOWIwYTI3Yjc5M2JhNWVhZjdiMmY0OTFkZDFiZWVhODQ1YTFiZGJkYmY2NjQxNzA3MzY4MzY1NWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.56sr18fLew7QEC5d5KwC6mSe-tD4xbjN--LYz47SFg0)
![image](https://private-user-images.githubusercontent.com/93427376/244916660-54cbad2b-5601-4eee-8939-6471eda4c37c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIxNjI4MjIsIm5iZiI6MTcyMjE2MjUyMiwicGF0aCI6Ii85MzQyNzM3Ni8yNDQ5MTY2NjAtNTRjYmFkMmItNTYwMS00ZWVlLTg5MzktNjQ3MWVkYTRjMzdjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI4VDEwMjg0MlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU1MzQ5NzQ5NTJlMGQxYjI1MDdmYzg3NmU0YjFlNTU1YjZmNjcxNTkyNTM5ODllZTY1N2MzZDRkMGU2NjRlMDcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.fsBJwdUop1qYQvoSyBTBeYeSERBkBKqCWQxFwkHtR2k)
Thus an Carousel application using react is created successfully.