AppCarousel
App.js
import { Heading } from '@chakra-ui/react'
import React from 'react'
import AppCarosel from '../Components/AppCarosel'
function HomePage() {
const carosel=[
'https://images.dusdusan.com/product/LrnsKmHO1672123889_1672123888510.jpg',
'https://images.dusdusan.com/product/2dt3Y3an1671097073_1671097073736.jpg',
'https://images.dusdusan.com/product/dnynjaPf1671096833_1671096833774.jpg'
]
return (
<>
<AppCarosel images={carosel}/>
<Heading>Ini apa ya?</Heading>
</>
)
}
export default HomePage
Components/AppCarosel.jsx
import React, { useState } from 'react'
import 'keen-slider/keen-slider.min.css'
import { useKeenSlider } from 'keen-slider/react'
import { Image } from '@chakra-ui/react'
import "./AppCarosel.css"
function AppCarosel(props) {
const [currentSlide, setCurrentSlide] = useState(0)
const [loaded, setLoaded] = useState(false)
const [sliderRef, instanceRef] = useKeenSlider(
{
initial: 0,
loop: true,
slideChanged(slider) {
// console.log('slide changed')
setCurrentSlide(slider.track.details.rel)
},
created() {
setLoaded(true)
},
},
[
// add plugins here
]
)
function Arrow(props) {
const disabeld = props.disabled ? " arrow--disabled" : ""
return (
<svg
onClick={props.onClick}
className={`arrow ${
props.left ? "arrow--left" : "arrow--right"
} ${disabeld}`}
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
>
{props.left && (
<path d="M16.67 0l2.83 2.829-9.339 9.175 9.339 9.167-2.83 2.829-12.17-11.996z" />
)}
{!props.left && (
<path d="M5 3l3.057-3 11.943 12-11.943 12-3.057-3 9-9z" />
)}
</svg>
)
}
return (<>
<div className="navigation-wrapper">
<div ref={sliderRef} className="keen-slider">
{props.images.map((x)=><div className="keen-slider__slide"><Image src={x}/></div>)}
</div>
{loaded && instanceRef.current && (
<>
<Arrow
left
onClick={(e) =>
e.stopPropagation() || instanceRef.current?.prev()
}
disabled={currentSlide === 0}
/>
<Arrow
onClick={(e) =>
e.stopPropagation() || instanceRef.current?.next()
}
disabled={
currentSlide ===
instanceRef.current.track.details.slides.length - 1
}
/>
</>
)}
</div>
{loaded && instanceRef.current && (
<div className="dots">
{[
...Array(instanceRef.current.track.details.slides.length).keys(),
].map((idx) => {
return (
<button
key={idx}
onClick={() => {
instanceRef.current?.moveToIdx(idx)
}}
className={"dot" + (currentSlide === idx ? " active" : "")}
></button>
)
})}
</div>
)}
</>
)
}
export default AppCarosel
Components/AppCarosel.css
body {
margin: 0;
font-family: "Inter", sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
[class^="number-slide"],
[class*=" number-slide"] {
background: grey;
display: flex;
align-items: center;
justify-content: center;
font-size: 50px;
color: #fff;
font-weight: 500;
height: 300px;
max-height: 100vh;
}
.number-slide1 {
background: rgb(64, 175, 255);
background: linear-gradient(
128deg,
rgba(64, 175, 255, 1) 0%,
rgba(63, 97, 255, 1) 100%
);
}
.number-slide2 {
background: rgb(255, 75, 64);
background: linear-gradient(
128deg,
rgba(255, 154, 63, 1) 0%,
rgba(255, 75, 64, 1) 100%
);
}
.number-slide3 {
background: rgb(182, 255, 64);
background: linear-gradient(
128deg,
rgba(182, 255, 64, 1) 0%,
rgba(63, 255, 71, 1) 100%
);
background: linear-gradient(
128deg,
rgba(189, 255, 83, 1) 0%,
rgba(43, 250, 82, 1) 100%
);
}
.number-slide4 {
background: rgb(64, 255, 242);
background: linear-gradient(
128deg,
rgba(64, 255, 242, 1) 0%,
rgba(63, 188, 255, 1) 100%
);
}
.number-slide5 {
background: rgb(255, 64, 156);
background: linear-gradient(
128deg,
rgba(255, 64, 156, 1) 0%,
rgba(255, 63, 63, 1) 100%
);
}
.number-slide6 {
background: rgb(64, 76, 255);
background: linear-gradient(
128deg,
rgba(64, 76, 255, 1) 0%,
rgba(174, 63, 255, 1) 100%
);
}
.navigation-wrapper {
position: relative;
}
.dots {
display: flex;
padding: 10px 0;
justify-content: center;
}
.dot {
border: none;
width: 10px;
height: 10px;
background: #c5c5c5;
border-radius: 50%;
margin: 0 5px;
padding: 5px;
cursor: pointer;
}
.dot:focus {
outline: none;
}
.dot.active {
background: #000;
}
.arrow {
width: 30px;
height: 30px;
position: absolute;
top: 50%;
transform: translateY(-50%);
-webkit-transform: translateY(-50%);
fill: #fff;
cursor: pointer;
}
.arrow--left {
left: 5px;
}
.arrow--right {
left: auto;
right: 5px;
}
.arrow--disabled {
fill: rgba(255, 255, 255, 0.5);
}
Last updated
Was this helpful?