¼¼·Î ½ºÅ©·Ñ¿¡ µû¶ó Ä«µåµéÀÌ ¼øÂ÷ÀûÀ¸·Î °íÁ¤µÇ¸ç È®´ëµÇ´Â ½ºÅà ȿ°ú. GSAP ScrollTrigger¸¦ Ȱ¿ëÇÑ ÀÎÅÍ·¢Æ¼ºê µðÀÚÀÎ ¿¹Á¦ÀÔ´Ï´Ù.
ÀÌ ¿¹Á¦´Â »ç¿ëÀÚ°¡ ÆäÀÌÁö¸¦ ½ºÅ©·ÑÇÒ ¶§ Ä«µåµéÀÌ Çϳª¾¿ °íÁ¤µÇ¸é¼ ºÎµå·´°Ô È®´ëµÇ´Â ½ºÅÃ(Stacking) ¾Ö´Ï¸ÞÀÌ¼Ç È¿°ú¸¦ ±¸ÇöÇÕ´Ï´Ù. °¢ Ä«µå°¡ ȸé Áß¾Ó¿¡ µµ´ÞÇϸé Àá½Ã °íÁ¤µÇ¾ú´Ù°¡ ´ÙÀ½ Ä«µå°¡ À̾îÁö´Â ¹æ½ÄÀ¸·Î ÀÚ¿¬½º·¯¿î È帧À» º¸¿©ÁÖ¸ç, GSAPÀÇ ScrollTrigger¿Í ScrollSmoother Ç÷¯±×ÀÎÀ» Ȱ¿ëÇÏ¿© ½ºÅ©·Ñ À§Ä¡¿Í ¾Ö´Ï¸ÞÀ̼ÇÀÌ ¸Å²ô·´°Ô µ¿±âȵ˴ϴÙ.
HTML ±¸Á¶
<main>
<h1>Stacking Card</h1>
<div class="stacking">
<div class="stacking__card">
<h2>Title</h2>
<div class="stacking__content">
<p>Lorem ipsum dolor, sit amet consectetur adipisicing elit. Consequatur error, reiciendis enim nulla voluptate non aspernatur rem dicta alias perspiciatis qui nobis ratione similique incidunt magnam ut commodi quae eaque!</p>
</div>
</div>
<div class="stacking__card" style="background-color: #d6e684;">
<h2>Title</h2>
<div class="stacking__content">
<p>Lorem ipsum dolor, sit amet consectetur adipisicing elit. Consequatur error, reiciendis enim nulla voluptate non aspernatur rem dicta alias perspiciatis qui nobis ratione similique incidunt magnam ut commodi quae eaque!</p>
</div>
</div>
<div class="stacking__card" style="background-color: #4fc1ed;">
<h2>Title</h2>
<div class="stacking__content">
<p>Lorem ipsum dolor, sit amet consectetur adipisicing elit. Consequatur error, reiciendis enim nulla voluptate non aspernatur rem dicta alias perspiciatis qui nobis ratione similique incidunt magnam ut commodi quae eaque!</p>
</div>
</div>
</div>
<section class="container">
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto eum iste est aspernatur dolorum corporis hic tenetur labore voluptas dolor vitae numquam consectetur autem obcaecati quisquam ipsam eveniet, ad veritatis.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto eum iste est aspernatur dolorum corporis hic tenetur labore voluptas dolor vitae numquam consectetur autem obcaecati quisquam ipsam eveniet, ad veritatis.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto eum iste est aspernatur dolorum corporis hic tenetur labore voluptas dolor vitae numquam consectetur autem obcaecati quisquam ipsam eveniet, ad veritatis.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto eum iste est aspernatur dolorum corporis hic tenetur labore voluptas dolor vitae numquam consectetur autem obcaecati quisquam ipsam eveniet, ad veritatis.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto eum iste est aspernatur dolorum corporis hic tenetur labore voluptas dolor vitae numquam consectetur autem obcaecati quisquam ipsam eveniet, ad veritatis.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto eum iste est aspernatur dolorum corporis hic tenetur labore voluptas dolor vitae numquam consectetur autem obcaecati quisquam ipsam eveniet, ad veritatis.</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Iusto eum iste est aspernatur dolorum corporis hic tenetur labore voluptas dolor vitae numquam consectetur autem obcaecati quisquam ipsam eveniet, ad veritatis.</p>
</section>
</main>
CSS ¼Ò½º
@function pxToRem($pixel) {
@return $pixel / 16 + rem;
}
:root {
--black: #1f1f1f;
--white: #fff;
}
body {
background-color: var(--black);
color: var(--white);
}
main {
padding: pxToRem(50) 0;
}
h1 {
color: var(--white);
font-size: clamp(3.125rem, 17.321vw + -1.357rem, 12.5rem);
line-height: clamp(4.688rem, 21.363vw + -0.84rem, 16.25rem);
margin: pxToRem(100) 0;
text-align: center;
}
h2 {
font-size: clamp(1.5rem, 1.848vw + 1.022rem, 2.5rem);
line-height: clamp(2.25rem, 1.848vw + 1.772rem, 3.25rem);
}
.stacking {
position: relative;
}
.stacking__card {
background-color: var(--white);
border-radius: pxToRem(32);
color: var(--black);
display: flex;
flex-direction: column;
gap: var(--whatwedo-gap);
margin: 25vh auto;
max-width: pxToRem(1020);
padding: pxToRem(32) pxToRem(32) 0;
}
.stacking__content {
font-size: pxToRem(18);
margin: pxToRem(20) 0;
padding-bottom: pxToRem(20);
}
.container {
max-width: pxToRem(800);
margin: 0 auto;
}
p {
margin: pxToRem(20) 0;
}
JS ¼Ò½º
gsap.registerPlugin(ScrollTrigger, ScrollSmoother);
ScrollSmoother.create({
smooth: 1,
effects: true,
normalizeScroll: true
});
const cards = gsap.utils.toArray(".stacking__card");
const spacer = 50;
cards.forEach((card, index) => {
ScrollTrigger.create({
trigger: card,
start: `center-=${index * spacer} center`,
endTrigger: ".stacking",
end: `bottom center`,
pin: true,
pinSpacing: false,
// markers: true,
invalidateOnRefresh: true
});
const scaleValue = 0.85 + index * 0.05;
gsap.to(card, {
scrollTrigger: {
trigger: card,
start: `top center`,
end: `bottom center`,
scrub: true,
// markers: true,
invalidateOnRefresh: true
},
// ease: "none",
scale: scaleValue
});
});