<div class="pindicator">
<div class="bullet past">
<span class="icon">1</span>
<div class="text">Step 1</div>
</div>
<div class="bullet current">
<span class="icon">2</span>
<div class="text">Step 2</div>
</div>
<div class="bullet next future">
<span class="icon">3</span>
<div class="text">Step 3</div>
</div>
<div class="bullet future">
<span class="icon">4</span>
<div class="text">Step 4</div>
</div>
<div class="bullet future">
<span class="icon">5</span>
<div class="text">Step 5</div>
</div>
<div class="bullet future">
<span class="icon">6</span>
<div class="text">Step 6</div>
</div>
</div>
.pindicator {
background-color: white;
display: flex;
margin: 2rem auto 0;
width: 30rem;
}
.pindicator .bullet {
flex: 1;
position: relative;
text-align: center;
transform-style: preserve-3d;
}
.pindicator .bullet::before,
.pindicator .bullet::after {
content: '';
display: block;
position: absolute;
height: .5rem;
top: 1.25rem;
transform: translate3d(0,0,-1px);
}
.pindicator .bullet::before {
background-color: lightgray;
width: 100%;
}
.pindicator .bullet::after {
background-color: black;
transition: opacity .25s ease-out;
opacity: 0;
width: 100%;
}
.pindicator .bullet:first-child::before,
.pindicator .bullet:first-child::after {
left: 50%;
width: 50%;
}
.pindicator .bullet:last-child::before,
.pindicator .bullet:last-child::after {
width: 50%;
}
.pindicator .icon {
background-color: lightgray;
border-radius: 100%;
color: transparent;
cursor: pointer;
font-size: 1.5rem;
display: inline-block;
height: 2em;
line-height: 2;
text-align: center;
transition: background-color .25s ease-out;
width: 2em;
}
.pindicator .text {
color: lightgray;
font-size: .75rem;
margin-top: 1rem;
text-transform: uppercase;
transition: background-color .25s ease-out;
}
.pindicator .past .icon,
.pindicator .current .icon {
background-color: black;
color: white;
}
.pindicator .past::after,
.pindicator .current::after {
opacity: 1;
}
.pindicator .past .text,
.pindicator .current .text,
.pindicator .next .text,{
color: black;
}
View Compiled
console.clear();
(function() {
"use strict";
var bulletClasses = {
elements: {
container: ".pindicator",
bullet: ".bullet",
},
helpers: {
past: "past",
current: "current",
next: "next",
future: "future",
}
};
var bulletEls;
document.addEventListener("DOMContentLoaded", initBullets);
function initBullets() {
bulletEls = Array.prototype.slice.call(
document.body.querySelectorAll(bulletClasses.elements.bullet)
);
bulletEls.forEach(function(el) {
el.addEventListener("mousedown", function(event) {
gotoPage(bulletEls.indexOf(this) + 1);
});
el.addEventListener("touchstart", function(event) {
event.preventDefault();
gotoPage(bulletEls.indexOf(this) + 1);
});
});
}
function gotoPage(pageNum) {
bulletEls.forEach(function(e) {
e.classList.remove.apply(e.classList,
Object.keys(bulletClasses.helpers).map(function(e){
return bulletClasses.helpers[e];
})
)
});
bulletEls[pageNum - 1].classList.add(bulletClasses.helpers.current);
if(pageNum > 1) {
for(var i = 0; i < pageNum; i++) {
bulletEls[i].classList.add(bulletClasses.helpers.past);
}
}
if(pageNum < bulletEls.length) {
bulletEls[pageNum].classList.add(bulletClasses.helpers.next);
for(var i = bulletEls.length - 1; i >= pageNum; i--) {
bulletEls[i].classList.add(bulletClasses.helpers.future);
}
}
}
})();
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.