<div class="header">
<!-- <h1>Spinny Flipz</h1> -->
</div>
<section class="slider-section">
<div class="wheel">
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-1.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-2.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-3.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-4.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-5.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-6.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-7.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-1.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-2.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-3.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-4.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-5.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-6.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-7.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-1.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-2.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-3.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-4.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-5.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-6.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-7.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-1.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-2.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-3.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-4.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-5.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-6.jpg" />
</div>
<div class="wheel__card">
<img src="https://assets.codepen.io/756881/amys-7.jpg" />
</div>
</div>
</section>
<div class="scroll-down">Scroll down<div class="arrow"></div>
</div>
@import url("https://fonts.googleapis.com/css2?family=Nunito&display=swap");
@font-face {
font-family: "longline";
src: url("https://assets.codepen.io/756881/Longline+Quart+FREE.ttf")
format("truetype");
font-weight: normal;
font-style: normal;
}
body {
overflow-x: hidden;
padding: 0;
margin: 0;
height: 600vh;
width: 100vw;
font-family: "Nunito", sans-serif;
background-color: #1d1e22;
color: white;
}
h1 {
font-family: "longline";
}
.slider-section {
height: 22vh;
bottom: 0;
position: fixed;
width: 100%;
}
h1 {
font-size: 10vw;
}
.wheel {
position: absolute;
top: 0;
display: flex;
align-items: center;
justify-content: center;
width: 300vw;
height: 300vw;
max-width: 2000px;
max-height: 2000px;
left: 50%;
transform: translateX(-50%);
}
.wheel__card {
position: absolute;
top: 0;
left: 0;
width: 6%;
max-width: 200px;
aspect-ratio: 1 / 1;
cursor: pointer;
}
img {
width: 100%;
pointer-events: none;
z-index: 999;
cursor: pointer;
position: absolute;
will-change: transform;
}
.header {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 60vh;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.header img {
width: 40vw;
height: 40vw;
max-height: 350px;
max-width: 350px;
}
/* SCROLL DOWN */
.scroll-down {
position: fixed;
bottom: 20px;
left: 50%;
transform: translate(-50%, 0);
color: white;
font-weight: 400;
text-transform: uppercase;
font-size: 14px;
overflow: visible;
}
.scroll-down .arrow {
position: relative;
top: 0px;
margin: 0 auto;
width: 15px;
height: 15px;
filter: invert(1);
background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj4KPHBhdGggZmlsbD0iYmxhY2siIGQ9Ik00ODMuMiwxOTIuMmMtMjAuNS0yMC41LTUzLjUtMjAuOC03My43LTAuNkwyNTcsMzQ0LjFMMTA0LjUsMTkxLjZjLTIwLjItMjAuMi01My4yLTE5LjktNzMuNywwLjYKCWMtMjAuNSwyMC41LTIwLjgsNTMuNS0wLjYsNzMuN2wxOTAsMTkwYzEwLjEsMTAuMSwyMy40LDE1LjEsMzYuOCwxNWMxMy4zLDAuMSwyNi43LTQuOSwzNi44LTE1bDE5MC0xOTAKCUM1MDMuOSwyNDUuNyw1MDMuNywyMTIuNyw0ODMuMiwxOTIuMnoiLz4KPC9zdmc+);
background-size: contain;
}
gsap.registerPlugin(ScrollTrigger, Flip);
let wheel = document.querySelector(".wheel"),
images = gsap.utils.toArray(".wheel__card"),
cards = gsap.utils.toArray(".wheel__card"),
header = document.querySelector(".header"),
currentCard; // keep track of last clicked card so we can put it back
gsap.to(".arrow", { y: 5, ease: "power1.inOut", repeat: -1, yoyo: true });
function setup() {
let radius = wheel.offsetWidth / 2,
center = radius,
slice = 360 / images.length,
DEG2RAD = Math.PI / 180;
gsap.set(images, {
x: i => center + radius * Math.sin(i * slice * DEG2RAD),
y: i => center - radius * Math.cos(i * slice * DEG2RAD),
rotation: i => i * slice,
xPercent: -50,
yPercent: -50
});
}
setup();
window.addEventListener("resize", setup);
gsap.to(wheel, {
rotation: -360,
ease: "none",
duration: images.length,
scrollTrigger: {
start: 0,
end: "max",
scrub: 1
}
});
cards.forEach(card => card.addEventListener("click", onClickCard));
header.addEventListener("click", closeCurrentCard);
function closeCurrentCard() {
if (currentCard) {
let img = header.querySelector("img"),
state = Flip.getState(img);
currentCard.appendChild(img);
Flip.from(state, {
ease: "power1.inOut",
scale: true
});
currentCard = null;
}
}
function onClickCard(e) {
let card = e.target,
image = card.querySelector("img");
if (card !== currentCard) {
closeCurrentCard();
currentCard = card;
let state = Flip.getState(image);
header.appendChild(image);
Flip.from(state, {
duration: 0.6,
scale: true,
ease: "power1.inOut"
});
} else {
closeCurrentCard();
}
}
This Pen doesn't use any external CSS resources.