I have this carousel with card divs wrapped inside an href so users can click the card. Right now I can only slide the card but it's not clickable.
If I remove pointer-events: none; from .inner-slider then the card is clickable, but I cannot slide the carousel smoothly and it's all jumpy when I tried to slide it.
How can I fix this?
let sliderContainer = document.querySelector(".slider-container");
let innerSlider = document.querySelector(".inner-slider");
let banner = document.querySelector(".banner");
let pressed = false;
let startX;
let x;
let bannerOpacity = banner.style.opacity
let oldx = 0
sliderContainer.addEventListener("mousedown", (e) => {
pressed = true;
startX = e.offsetX - innerSlider.offsetLeft;
sliderContainer.style.cursor = "grabbing";
});
// sliderContainer.addEventListener("mouseenter", () => {
// sliderContainer.style.cursor = "grab";
// });
sliderContainer.addEventListener("mouseleave", () => {
sliderContainer.style.cursor = "default";
});
sliderContainer.addEventListener("mouseup", () => {
sliderContainer.style.cursor = "grab";
pressed = false;
});
window.addEventListener("mouseup", () => {
// pressed = false;
});
sliderContainer.addEventListener("mousemove", (e) => {
if (!pressed) return;
console.log(`e.pageX:${e.pageX};oldx:${oldx};op:${banner.style.opacity}`);
console.log(banner.style.opacity + 1);
if (e.pageX > oldx && banner.style.opacity < 1) {
banner.style.opacity = parseFloat(banner.style.opacity) + 0.01;
console.log('right');
} else if (e.pageX < oldx && banner.style.opacity > 0) {
console.log('left');
banner.style.opacity -= 0.01
}
e.preventDefault();
x = e.offsetX;
innerSlider.style.left = `${x - startX}px`;
oldx = e.pageX;
checkBoundary();
});
const checkBoundary = () => {
let outer = sliderContainer.getBoundingClientRect();
let inner = innerSlider.getBoundingClientRect();
if (parseInt(innerSlider.style.left) > 150) {
innerSlider.style.left -= 10;
// bannerOpacity -= 0.01
}
if (inner.right < outer.right) {
innerSlider.style.left = `-${inner.width - outer.width}px`;
}
};
.card {
height: 300px;
width: 400px;
border-radius: 5px;
}
.banner {
z-index: 2;
height: 300px;
width: 200px;
border-radius: 5px;
background-color: red;
}
.card:nth-child(odd) {
background-color: blue;
}
/* .card:first-child {
visibility: hidden;
} */
.card:nth-child(even) {
background-color: rgb(0, 183, 255);
}
.slider-container {
width: 80%;
height: 350px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
overflow: hidden;
}
.inner-slider {
width: 150%;
display: flex;
gap: 10px;
pointer-events: none;
position: absolute;
top: 0;
left: 250px;
}
<div class="slider-container">
<div class="banner" style="opacity: 1;"></div>
<div class="inner-slider">
<!-- <div class="card"></div> -->
<a href="google.com">
<div class="card"></div>
</a>
<a href="https://www.google.com/">
<div class="card"></div>
</a>
<a href="https://www.google.com/">
<div class="card"></div>
</a>
<a href="https://www.google.com/">
<div class="card"></div>
</a>
<a href="https://www.google.com/">
<div class="card"></div>
</a>
</div>
</div>
CodePen Link: https://codepen.io/mjkno1/pen/zYWPjEw