<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<div class="swiper-slide">Slide 3</div>
<div class="swiper-slide">Slide 4</div>
<div class="swiper-slide">Slide 5</div>
<div class="swiper-slide">Slide 6</div>
</div>
<div class="swiper-pagination"></div>
</div>
body {
background: #eee;
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
font-size: 14px;
color: #000;
margin: 0;
padding: 0;
height: 100vh;
display: flex;
flex-direction: column;
}
.swiper-container {
width: 90vmin;
height: 45vmin;
margin: auto;
}
.swiper-slide {
text-align: center;
font-size: 18px;
background: #fff;
display: flex;
justify-content: center;
align-items: center;
}
.swiper-slide:nth-child(even) {
background: #ccc;
}
.swiper-pagination-bullet {
opacity: 1;
}
.bullet-circle {
position: absolute;
top: 50%;
left: 50%;
width: 50%;
transform-origin: 0 0;
transform: rotate(calc(var(--progress) * -180deg - 90deg + 36deg * var(--index)));
transition: transform 300ms linear;
}
.bullet-ava {
position: absolute;
width: 30px;
height: 30px;
top: -15px;
right: 30px;
line-height: 30px;
transform: rotate(calc((var(--progress) * -180deg - 90deg + 36deg * var(--index)) * -1));
transition: transform 300ms linear;
background-color: #f00;
color: #fff;
border-radius: 50%;
}
const swiperEl = document.querySelector(".swiper-container");
const swiper = new Swiper(swiperEl, {
pagination: {
el: ".swiper-pagination",
clickable: true,
renderBullet(index, className) {
return `
<div class="${className}">
<div class="bullet-dot"></div>
<div class="bullet-circle" style="--index: ${index}">
<div class="bullet-ava">${index + 1}</div>
</div>
</div>`;
}
},
on: {
progress(self, p) {
swiperEl.style.setProperty('--progress', p);
}
}
});