页面布局
<section aria-label="图片列表">
<div class="carousel" data-carousel>
<button class="carousel-button prev" data-carousel-button="prev">
上一张
</button>
<button class="carousel-button next" data-carousel-button="next">
下一张
</button>
<ul data-slides>
<li class="slide" data-active>
<img src="./images/demo1.jpg" alt="示例图片1" />
</li>
<li class="slide">
<img src="./images/demo2.jpg" alt="示例图片2" />
</li>
<li class="slide">
<img src="./images/demo3.jpg" alt="示例图片3" />
</li>
<li class="slide">
<img src="./images/demo4.jpg" alt="示例图片4" />
</li>
<li class="slide">
<img src="./images/demo5.jpg" alt="示例图片5" />
</li>
</ul>
</div>
</section>
交互代码
const buttons = document.querySelectorAll("[data-carousel-button]");
buttons.forEach((button) => {
button.addEventListener("click", () => {
const offset = button.dataset.carouselButton === "next" ? 1 : -1;
const slides = button
.closest("[data-carousel]")
.querySelector("[data-slides]");
const activeSlide = slides.querySelector("[data-active]");
let newIndex = [...slides.children].indexOf(activeSlide) + offset;
if (newIndex < 0) newIndex = slides.children.length - 1;
if (newIndex >= slides.children.length) newIndex = 0;
slides.children[newIndex].dataset.active = true;
delete activeSlide.dataset.active;
});
});
样式
*,
*::before,
*::after {
box-sizing: border-box;
}
body,
ul,
li {
margin: 0;
padding: 0;
}
.carousel {
width: 100vw;
height: 100vh;
position: relative;
}
ul {
list-style: none;
}
.slide {
position: absolute;
inset: 0;
opacity: 0;
transition: 200ms opacity ease-in-out;
transition-delay: 200ms;
}
.slide > img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
}
.slide[data-active] {
opacity: 1;
z-index: 1;
transition-delay: 0ms;
}
.carousel-button {
position: absolute;
background: none;
border: none;
font-size: 12px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
border-radius: 0.25rem;
padding: 0.5rem;
background-color: rgba(0, 0, 0, 0.1);
z-index: 2;
}
.carousel-button:hover,
.carousel-button:focus {
color: #fff;
background-color: rgba(0, 0, 0, 0.2);
}
.carousel-button:focus {
outline: 1px solid black;
}
.prev {
left: 1rem;
}
.next {
right: 1rem;
}
完整代码
完整代码示例下载