β header κΈμμ λ³κ²½
β GSAPμ gsap.utils.toArray
β GSAPμ .fromTo()
$(window).scroll(function() {
// νμ¬ μ€ν¬λ‘€ μμΉ κ°μ Έμ€κΈ°
let scrollPosition = $(window).scrollTop();
// μ€ν¬λ‘€ μκ³κ° μ€μ (μμ λ³κ²½ μ§μ )
let scrollThreshold = 100; // νμμ λ°λΌ μ΄ κ°μ μ‘°μ
// μ€ν¬λ‘€ μμΉκ° μκ³κ°μ λμλμ§ νμΈ
if (scrollPosition > scrollThreshold) {
// `fill` μμ±μ blackμΌλ‘ λ³κ²½
$("path").css("fill", "black");
// `<a>` νκ·Έμ `color` μμ±μ blackμΌλ‘ λ³κ²½
$(".header a").css("color", "black");
} else {
// `fill` μμ±μ λ€μ whiteλ‘ λ³κ²½
$("path").css("fill", "white");
// `<a>` νκ·Έμ `color` μμ±μ λ€μ whiteλ‘ λ³κ²½
$(".header a").css("color", "white");
}
});
κ°μ ν΄λμ€λ₯Ό κ°μ§κ³ μλ μμλ€μ λμΌν μ λλ©μ΄μ
μΌλ‘ μ μ©νκ³ μΆμ΄μ μμλ΄€λλ° GSAPμμ λ³΄ν΅ toArray()
λ₯Ό μ¬μ©νλ κ²
κ°μλ€.
toArray()
λ GSAP λΌμ΄λΈλ¬λ¦¬μμ μ 곡λλ μ νΈλ¦¬ν° λ©μλ μ€ νλμ΄λ€.
κ°μ ν΄λμ€λ₯Ό κ°μ§ μ¬λ¬ μμλ€μ μ ννμ¬ λ°°μ΄λ‘ λ³ννκ³ κ·Έ λ°°μ΄μ λν΄ μΌκ΄μ μΌλ‘ μ λλ©μ΄μ μ μ μ©ν μ μλ€. μ΄κ²μ μ½λλ₯Ό λ κ°κ²°νκ² λ§λ€μ΄μ£Όκ³ , μ¬λ¬ μμμ λν΄ μΌκ΄μ μΌλ‘ μ λλ©μ΄μ μ μ‘°μνκ±°λ μ μ©νλ λ° ν¨μ¨μ μ΄λ€. π
πμ¬μ΄νΈ - https://gsap.com/docs/v3/GSAP/UtilityMethods
κΈ°λ³Έ μ¬μ©λ²μ βββ
const elements = gsap.utils.toArray(".myElements");
gsap.to(elements, {
opacity: 1,
duration: 1,
stagger: 0.2, // μμλ€ κ°μ κ°κ²© μ€μ
});
μ΄λ° μμΌλ‘ μμ±νλ©΄ λλ€.
νμ§λ§, λ³΄ν΅ λ¨λ μ μΌλ‘ μ¬μ©νκΈ° 보λ€λ λ°°μ΄ λ©μλμ κ°μ΄ μ μ©ν΄μ μ¬μ©νλκ² κ°λ€.
λ°°μ΄ λ©μλ - forEach
β, map
, filter
, reduce
λ±...
gsap.utils.toArray('.section-img-box img').forEach((img)=>{
gsap.set(img,{
scale:1.2,
yPercent:-5,
}),
gsap.to(img,{
scrollTrigger:{
trigger:img.closest(".section-img-box"),
start:"0% 100%",
end:"100% 0%",
scrub:true,
},
scale:1,
yPercent:0,
});
});
forEach
λ₯Ό μ¬μ©νμ¬ λͺ¨λ .section-img-box img
μ μ λλ©μ΄μ
μ μ©νλ©΄μ, .section-img-box img
ν΄λμ€λ₯Ό κ°μ§ λͺ¨λ μμλ₯Ό λ°λ³΅νκ³ κ° μμμ λν΄ μ λλ©μ΄μ
μ μ€μ νμλ€.
λ¬Έμ λ°μβ triggerλ₯Ό ".section-img-box"
λ§ μ€μ νλλ μ μ²΄κ° μ μ©μ΄ μλμλ€.
closest()
λ₯Ό μ μ©νλλ λ¬Έμ κ° ν΄κ²°λμλ€.
closest()
λ DOM νΈλ¦¬μμ νΉμ 쑰건μ λ§μ‘±νλ κ°μ₯ κ°κΉμ΄ μ‘°μ μμλ₯Ό μ°Ύλ JavaScriptμ λ©μλμ΄λ€. μ΄ λ©μλλ νΉμ μμμ λΆλͺ¨ μμλ κ·Έ μ΄μμ μμ μμλ€μ νμν λ μ μ©νλ€.
closest()
λ©μλλ μΈμλ‘ μ£Όμ΄μ§ μ νμλ 쑰건μ λ§μ‘±νλ κ°μ₯ κ°κΉμ΄ μμ μμλ₯Ό μ°Ύμμ€λλ€. μ΄λ ν΄λΉ μμλΆν° μμ μμλ‘ μ¬λΌκ°λ©΄μ 쑰건μ λ§μ‘±νλ 첫 λ²μ§Έ μμλ₯Ό λ°ννκ³ , λ§μ½ 쑰건μ λ§μ‘±νλ μμκ° μλ€λ©΄ nullμ λ°ν
μ£Όλ‘closest()
λ μ΄λ²€νΈ μ²λ¦¬λ νΉμ μμλ₯Ό μ°Ύμ κ·Έμ λ°λ₯Έ λμμ μνν λ μ¬μ©λ©λλ€. νΉμ μμμ λΆλͺ¨ μμ μ€μμ κ°μ₯ κ°κΉμ΄ νΉμ ν΄λμ€λͺ μ κ°μ§ μμλ νΉμ νκ·Έλ₯Ό κ°μ§ μμλ₯Ό μ°Ύλ λ° μ μ©νκ² νμ©
μ΄λ² νλ‘μ νΈμμλ fromToλ₯Ό μ¬μ©νμ¬ νμ΄λμΈ νμ΄λμμν¨κ³Όλ₯Ό μ¬μ©ν΄λ³΄μλ€.
gsap.utils.toArray('.section-inner').forEach(text=>{
const tl = gsap.timeline({
scrollTrigger: {
trigger: text,
start: "0 80%",
end: "70% center",
scrub: 1,
}
});
// κ° μμλ₯Ό μνλ μμλλ‘ λνλκ² μ€μ
tl.fromTo(text.querySelector('.title'), { autoAlpha: 0, y: 10 }, { autoAlpha: 1, y: 0, duration:0.5, ease: "none" })
.fromTo(text.querySelector('.subtitle'), { autoAlpha: 0, y: 10 }, { autoAlpha: 1, y: 0, duration:0.5, ease: "none" })
.fromTo(text.querySelector('.description'), { autoAlpha: 0, y: 10 }, { autoAlpha: 1, y: 0, duration:0.5, ease: "none" })
.fromTo(text.querySelector('.amount-price-group'), { autoAlpha: 0, y: 10 }, { autoAlpha: 1, y: 0, duration:0.5, ease: "none" });
});
λ¨Όμ , gsap.timeline
μ λ³μ tl
λ‘ μ μ₯
κ·Έ λ€ .section-inner
μ μμ ν΄λμ€λ€ .title
, .subtitle
, .description
, .amount-price-group
μ
gsap.from
μ ν΄λΉνλ μ λλ©μ΄μ
μ λ¨Όμ μμ± ν λ€{ autoAlpha: 0, y: 10 }
gsap.to
μ { autoAlpha: 1, y: 0, duration:0.5, ease: "none" })
λ₯Ό μμ±ν΄ 쀬λ€.
autoAlpha
λ CSSμ opacity
μ κ°μ΄ μμμ ν¬λͺ
λλ₯Ό μ μ΄νλ λ° μ¬μ©λλ μμ±μ΄λ€.
κ·ΈλΌ, λκ° λ€λ₯ΌκΉ???π€π€π€
autoAlpha
λ GSAPμμλ§ μ 곡νλ μμ±μΌλ‘, μμμ ν¬λͺ λλ₯Ό μ‘°μ νλ©΄μ λμμ μμλ₯Ό 보μ΄κ±°λ μ¨κΈΈ μ μλ€.
autoAlpha
λ₯Ό μ¬μ©νλ©΄ μμλ₯Ό ν¬λͺ νκ² λ§λ€λ©΄μ CSSμ visibility μμ±μ μ‘°μ νμ¬ μμλ₯Ό νλ©΄μμ μ¨κΈΈ μ μμ΅λλ€. ν¬λͺ λκ° 0μ΄λ©΄ μμλ νλ©΄μμ 보μ΄μ§ μμ§λ§,visibility: hidden
μμ±μ΄ μ μ©λμ΄ λ μ΄μμμμ 곡κ°μ μ°¨μ§νμ§ μλλ€λ λ»
μν©μ λ°λΌ λ€λ₯΄κ² μ§λ§,
λ²νΌ(buttonνκ·Έ)μ΄λ λ§ν¬(aνκ·Έ)μ²λΌ μ¬μ©μμμ μνΈμμ©μ΄ μλ μμμ λν΄μλ autoAlpha
λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ κ² κ°λ€.
λν, λ μ΄μμμμ 곡κ°μ μ°¨μ§νλ©΄ μλλ λΆλΆμ autoAlpha
λ₯Ό μ¨μ£Όμ~