javascript - 修复点错误以指示轮播中的幻灯片
问题描述
我几乎完成了我理想的轮播,除了我尝试添加点表示幻灯片不能按预期工作,.active
类 in.dot
行为很奇怪,看到这里是codepen。
这是我使用的 HTML:
<div class="carousel-container">
<i class="fas fa-chevron-left" id="prevBtn"></i>
<i class="fas fa-chevron-right" id="nextBtn"></i>
<div class="carousel-slide">
<img src="https://images.unsplash.com/photo-158&q=80" class="firstSlide" alt="">
...
</div>
</div>
<div class="dots">
<span class="dot active"></span>
<span class="dot"></span>
<span class="dot"></span>
<span class="dot"></span>
<span class="dot"></span>
</div>
这是我使用的 JavaScript:
/* carousel */
const carousel_slide = document.querySelector(".carousel-slide");
const carousel_images = document.querySelectorAll(".carousel-slide img");
const dots = document.querySelector(".dots");
const dot = document.querySelectorAll(".dot");
const prev_btn = document.querySelector("#prevBtn");
const next_btn = document.querySelector("#nextBtn");
// counter
let counter = 0;
let size = carousel_images[0].clientWidth;
carousel_slide.insertAdjacentHTML(
"afterbegin",
carousel_images[carousel_images.length - 1].outerHTML
);
carousel_slide.insertAdjacentHTML("beforeend", carousel_images[0].outerHTML);
carousel_slide.style.transform = `translateX(${-size * 1}px)`;
// carousel_slide.style.transform = `translateX(${-size * counter}px)`;
next_btn.addEventListener("click", () => {
if (counter >= carousel_images.length) {
setTimeout(() => {
counter = 0;
dot[counter].classList.add("active");
carousel_slide.style.transition = "none";
carousel_slide.style.transform = `translateX(${-size}px)`;
}, 300);
} else {
carousel_slide.style.transition = "all 0.3s ease-in-out";
counter++;
for (i = 0; i < dot.length; i++) {
dot[i].className = dot[i].className.replace(" active", "");
}
dot[counter].classList.add("active");
carousel_slide.style.transform = `translateX(${-size * (counter + 1)}px)`;
}
});
prev_btn.addEventListener("click", () => {
if (counter < 0) {
setTimeout(() => {
counter = carousel_images.length - 1;
carousel_slide.style.transition = "none";
carousel_slide.style.transform = `translateX(${-size * (counter + 1)}px)`;
}, 300);
} else {
carousel_slide.style.transition = "all 0.3s ease-in-out";
counter--;
for (i = 0; i < dot.length; i++) {
dot[i].className = dot[i].className.replace(" active", "");
}
dot[counter].classList.add("active");
carousel_slide.style.transform = `translateX(${-size * (counter + 1)}px)`;
}
});
而且我无法在点上添加点击事件以将我带到轮播中相应的幻灯片。感谢您的阅读和帮助。
解决方案
在查看了您的 codepen 详细信息后,我发现您的轮播在触发下一个和上一个按钮时存在问题。使用https://stackoverflow.com/questions/60577870提供的过渡效果帮助编辑此答案...
next_btn.addEventListener("click", () => {
carousel_slide.style.transition = "all 0.3s ease-in-out";
dot.forEach(e=>e.classList.remove( "active" ))
counter++;
carousel_slide.style.transform = `translateX(${-size * (counter + 1)}px)`;
if (counter >= carousel_images.length) {
setTimeout(() => {
counter = 0;
dot[counter].classList.add("active");
carousel_slide.style.transition = "none";
carousel_slide.style.transform = `translateX(${-size}px)`;
}, 300);
}else{
dot[counter].classList.add("active");
}
});
prev_btn.addEventListener("click", () => {
carousel_slide.style.transition = "all 0.3s ease-in-out";
dot.forEach(e=>e.classList.remove( "active" ))
counter--;
carousel_slide.style.transform = `translateX(${-size * (counter + 1)}px)`;
if (counter < 0) {
setTimeout(() => {
counter = carousel_images.length - 1;
dot[counter].classList.add("active");
carousel_slide.style.transition = "none";
carousel_slide.style.transform = `translateX(${-size * (counter + 1)}px)`;
}, 300);
}else{
dot[counter].classList.add("active");
}
});
只需修改两个单击事件侦听器就可以完美地工作我猜的 carousal。
要单击该点,您可以使用以下代码
dot.forEach(function(e, i){
e.addEventListener("click", (elem)=>{
dot.forEach(e=>e.classList.remove( "active" ))
counter=i; dot[counter].classList.add("active");
carousel_slide.style.transform = `translateX(${-size * (counter + 1)}px)`;
})
})
推荐阅读
- kotlin - How is blocking in a suspend function different than calling an async function?
- c++ - 将 std::async 用于内部线程内的后台任务是否正确(而不是来自主进程的线程)
- java - Couchbase 使用 Reactive Flux 批量获取文档
- mysql - SQL Select 语句获取字符串中包含一个或多个值的所有记录
- java - 无法在 Android 客户端和 Node.js socket.io 服务器之间进行通信
- python - 尝试在树莓派上使用 wxPython
- csv - 如何在 Python 中使用预训练的 BERT 问答模型进行文本提取?
- node.js - 如何在一个房间中添加多个用户,例如节点 js 中的 whatsapp 组?
- python - 通过appium的Python android:有什么方法可以检测键盘类型?
- javascript - 访问父窗口上动态添加的元素