jQuery addClass example
Change class name on click in jQuery
by Shawn Wood
HTML
<div id="container">
<ul>
<li>About</li>
<li>Contact</li>
<li>Pricing</li>
<div class="focus first"></div>
<div class="focus second"></div>
</ul>
</div>
<script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/3.1.1/gsap.min.js'></script>
CSS
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
width: 100%;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background: #ff3636;
overflow: hidden;
}
#container {
width: 350px;
height: 350px;
display: grid;
place-items: center;
}
#container ul {
position: relative;
width: 350px;
height: 50px;
display: grid;
grid-template-columns: repeat(3, 1fr);
border-radius: 35px;
background: rgba(255, 255, 255, 0.65);
box-shadow: 0 12.5px 10px rgba(0, 0, 0, 0.08), 0 100px 80px rgba(0, 0, 0, 0.03);
overflow: hidden;
}
#container ul li {
list-style: none;
display: grid;
place-items: center;
font-family: "montserrat";
color: #ff3636;
z-index: 10;
cursor: pointer;
}
#container ul .focus {
position: absolute;
left: 0;
top: 0;
width: calc(100% / 3);
height: 100%;
border-radius: 35px;
background: #fff;
box-shadow: 0 12.5px 10px rgba(0, 0, 0, 0.015), 0 100px 80px rgba(0, 0, 0, 0.03);
}
#container ul .focus.second {
left: calc(-100% / 3);
}
JavaScript
console.clear();
const liContainer = document.querySelector("ul");
const liEls = [...document.querySelectorAll("ul li")];
const slideEl_1 = document.querySelector(".focus.first");
const slideEl_2 = document.querySelector(".focus.second");
gsap.defaults({
ease: "ease.inOut",
});
let tl = gsap.timeline();
let liRect = liContainer.getBoundingClientRect();
let slideEl_1_DefaultWidth = slideEl_1.getBoundingClientRect().width;
let slideEl_1_DefaultLeft = slideEl_1.getBoundingClientRect().left;
let slideEl_2_DefaultLeft = slideEl_2.getBoundingClientRect().left;
let startPosIndex = 1;
let reachedEnd = false;
let activeIndex = startPosIndex;
let animationDuration = 0.2;
liEls.forEach((el, index) => {
let elRect = el.getBoundingClientRect();
el.addEventListener("mousedown", () => {
if (reachedEnd && index + 1 == startPosIndex) {
tl.to(slideEl_1, animationDuration, { left: `${liRect.width}px` });
tl.to(
slideEl_2,
animationDuration,
{ left: `${elRect.left - liRect.left}px` },
`-=${animationDuration}`
);
tl.set(
slideEl_1,
{ left: `${slideEl_1_DefaultLeft - liRect.left}px` },
`+=${animationDuration}`
);
tl.set(
slideEl_2,
{ left: `${slideEl_2_DefaultLeft - liRect.left}px` },
`+=${animationDuration}`
);
}
let timesWidth = index + 1 - activeIndex + 1 <= 0 ? 1 : index + 1 - activeIndex + 1;
activeIndex = index + 1;
tl.to(slideEl_1, animationDuration, { width: `${timesWidth * slideEl_1_DefaultWidth}px` });
if (index + 1 != startPosIndex || reachedEnd == false) {
tl.to(slideEl_1, animationDuration, {
left: `${elRect.left - liRect.left}px`,
width: `${slideEl_1_DefaultWidth}px`,
});
}
if (index + 1 == liEls.length) {
reachedEnd = true;
} else {
reachedEnd = false;
}
});
});