<div class="slider">
<div class="pagination">
<div class="pagination__track">
</div>
</div>
<div class="slides">
<div class="slide">
<div class="slide__pagination-label">today</div>
<div class="slide__content">
<div class="slide__title">today</div>
<div class="slide__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam officiis consequuntur omnis, quae impedit</div>
</div>
</div>
<div class="slide">
<div class="slide__pagination-label">2001</div>
<div class="slide__content">
<div class="slide__title">2001</div>
<div class="slide__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam officiis consequuntur omnis, quae impedit nihil suscipit reprehenderit eveniet, animi sunt ut maiores eos aliquid repudiandae tempore eum, quaerat perferendis iste.</div>
</div>
</div>
<div class="slide">
<div class="slide__pagination-label">2002</div>
<div class="slide__content">
<div class="slide__title">2002</div>
<div class="slide__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam officiis consequuntur omnis, quae impedit nihil suscipit reprehenderit eveniet, animi sunt ut maiores eos aliquid repudiandae tempore eum, quaerat perferendis iste.</div>
</div>
</div>
<div class="slide">
<div class="slide__pagination-label">2003</div>
<div class="slide__content">
<div class="slide__title">2003</div>
<div class="slide__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam officiis consequuntur omnis, quae impedit nihil suscipit reprehenderit eveniet, animi sunt ut maiores eos aliquid repudiandae tempore eum, quaerat perferendis iste.</div>
</div>
</div>
<div class="slide">
<div class="slide__pagination-label">2004</div>
<div class="slide__content">
<div class="slide__title">2004</div>
<div class="slide__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam officiis consequuntur omnis, quae impedit nihil suscipit reprehenderit eveniet, animi sunt ut maiores eos aliquid repudiandae tempore eum, quaerat perferendis iste.</div>
</div>
</div>
<div class="slide">
<div class="slide__pagination-label">2005</div>
<div class="slide__content">
<div class="slide__title">2005</div>
<div class="slide__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam officiis consequuntur omnis, quae impedit nihil suscipit reprehenderit eveniet, animi sunt ut maiores eos aliquid repudiandae tempore eum, quaerat perferendis iste.</div>
</div>
</div>
<div class="slide">
<div class="slide__pagination-label">2006</div>
<div class="slide__content">
<div class="slide__title">2006</div>
<div class="slide__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam officiis consequuntur omnis, quae impedit nihil suscipit reprehenderit eveniet, animi sunt ut maiores eos aliquid repudiandae tempore eum, quaerat perferendis iste.</div>
</div>
</div>
<div class="slide">
<div class="slide__pagination-label">2007</div>
<div class="slide__content">
<div class="slide__title">2007</div>
<div class="slide__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam officiis consequuntur omnis, quae impedit nihil suscipit reprehenderit eveniet, animi sunt ut maiores eos aliquid repudiandae tempore eum, quaerat perferendis iste.</div>
</div>
</div>
<div class="slide">
<div class="slide__pagination-label">2008</div>
<div class="slide__content">
<div class="slide__title">2008</div>
<div class="slide__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ipsam officiis consequuntur omnis, quae impedit nihil suscipit reprehenderit eveniet, animi sunt ut maiores eos aliquid repudiandae tempore eum, quaerat perferendis iste.</div>
</div>
</div>
</div>
</div>
<div class="buttons">
<button id="prev">prev</button>
<button id="next">next</button>
</div>
// fonts
// Open Sans and Poppins
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600&family=Poppins:wght@300;700&display=swap');
body {
margin: 0;
padding: 0;
color: #fdfcdc;
background: #000;
overflow: hidden;
display: flex;
flex-direction: column;
min-height: 100vh;
font-family: 'Open Sans', sans-serif;
}
.slider {
display: flex;
}
.pagination {
position: relative;
width: 30%;
margin-right: 15px;
}
.pagination__track {
display: flex;
align-items: center;
position: absolute;
left: 0;
top: 50%;
width: 100%;
height: 0;
transform-origin: 0 50%;
}
.pagination__track--transition {
transition: transform 500ms;
}
.pagination__item {
position: absolute;
left: 0;
width: 100%;
text-align: right;
transform-origin: 0 50%;
transform: rotate(0deg);
font: 18px 'Poppins', sans-serif;
line-height: 1.5;
user-select: none;
cursor: pointer;
}
.pagination__item::before {
content: '';
position: absolute;
left: 0;
top: calc(50% - 1px);
width: 100%;
height: 2px;
background: linear-gradient(to right, #fdfcdc, transparent);
}
.slides {
width: 70%;
display: flex;
}
.slide {
position: relative;
flex: 0 0 100%;
overflow: hidden;
opacity: 0;
transform: translateY(100%);
&--active {
opacity: 1;
transform: translateY(0);
}
&--next {
opacity: 0;
transform: translateY(-100%);
}
&--transition {
transition: transform 500ms, opacity 500ms linear;
}
&__title {
font: 300 142px 'Poppins', sans-serif;
letter-spacing: 0.3rem;
line-height: 1;
margin: 30px 0;
background-image: linear-gradient(45deg, #f09433 0%,#e6683c 25%,#dc2743 50%,#cc2366 75%,#bc1888 100%);
background-clip: text;
color: transparent;
background-clip: text;
text-fill-color: transparent;
}
}
.slide__pagination-label {
display: none;
}
.buttons {
position: fixed;
top: 10px;
left: 10px;
}
View Compiled
const sliderEl = document.querySelector('.slider');
const slideEls = sliderEl.querySelectorAll('.slide');
const paginationTrackEl = sliderEl.querySelector('.pagination__track');
const rotateStep = 10;
let currentSlideIdx = 3;
function initSlider() {
const pagLabelsEls = sliderEl.querySelectorAll('.slide__pagination-label');
for (let i = 0; i < pagLabelsEls.length; i++) {
const lab = pagLabelsEls[i];
const clone = lab.cloneNode(true);
clone.classList.remove('slide__pagination-label');
clone.classList.add('pagination__item');
clone.dataset.index = i;
clone.style.transform = `rotate(${i * rotateStep}deg)`;
paginationTrackEl.appendChild(clone);
}
for (let i = 0; i < slideEls.length; i++) {
const slide = slideEls[i];
slide.style.left = `${i * -100}%`;
}
slideEls[currentSlideIdx].classList.add('slide--active');
paginationTrackEl.style.transform = `rotate(${currentSlideIdx * -rotateStep}deg)`;
onNextFrame(() => paginationTrackEl.classList.add('pagination__track--transition'));
}
initSlider();
function slideTo(index) {
const totalSlides = slideEls.length;
const nextIndex = ((index % totalSlides) + totalSlides) % totalSlides;
if (nextIndex === currentSlideIdx) return;
const current = slideEls[currentSlideIdx];
const next = slideEls[nextIndex];
current.classList.replace('slide--active', 'slide--next');
current.classList.add('slide--transition');
current.addEventListener('transitionend', () => {
current.classList.remove('slide--next');
current.classList.remove('slide--transition');
}, { once: true });
next.classList.add('slide--active', 'slide--transition');
paginationTrackEl.style.transform = `rotate(${nextIndex * -rotateStep}deg)`;
currentSlideIdx = nextIndex;
}
const next = document.getElementById('next');
const prev = document.getElementById('prev');
next.addEventListener('click', () => {
slideTo(currentSlideIdx + 1);
});
prev.addEventListener('click', () => {
slideTo(currentSlideIdx - 1);
});
sliderEl.addEventListener('click', ({ target }) => {
const pagItemEl = target.closest('.pagination__item');
if (!pagItemEl) return;
const idx = Number(pagItemEl.dataset.index);
slideTo(idx);
});
// utils
function onNextFrame(cb) {
requestAnimationFrame(() => requestAnimationFrame(cb));
}
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.