μ μκΈ°κ° | 22.06.19 ~ 22.06.21 (3μΌ μμ) |
μ¬μ© μΈμ΄ | html, scss, jquery |
μ¬μ© νλ¬κ·ΈμΈ | gsap |
λΆλ₯ | pc, mobile, ν΄λ‘ μ½λ© |
π mouse μ’ν κ° κ΅¬νκΈ°
$(document).mousemove(function(e){ mouseX = (e.clientX * 100)/innerWidth + "vw"; mouseY = (e.clientY * 100)/innerHeight + "vh"; })
π¬ λ§μ°μ€ 컀μλ₯Ό λ°λΌλ€λλ €λ©΄ 컀μ μμΉλ₯Ό μμμΌνλ―λ‘ μ»€μμμΉλ₯Ό
clientX, clientY
λ₯Ό μ΄μ©νμ¬ Xμ’νμ Yμ’νλ₯Ό ꡬνμ΅λλ€.
π‘ λ§μ°μ€ μ’νλ₯Ό μμλΌ μ μλ μ¬λ¬κ°μ§ λ°©λ²!
- screenX, screenY
- μ¬μ©μ λͺ¨λν° νλ©΄μ κΈ°μ€μΌλ‘ ν μ’νλ₯Ό νμν©λλ€.- pageX, pageY
- μ 체 λ¬Έμλ₯Ό κΈ°μ€μΌλ‘ ν μ’νλ₯Ό νμν©λλ€.- clientX, clientY
- λΈλΌμ°μ μμ μ¬μ©μμκ² μΉνμ΄μ§κ° 보μ¬μ§λ μμμ κΈ°μ€μΌλ‘ Β Β μ’νλ₯Ό νμν©λλ€. (μ€ν¬λ‘€λ°κ° μμ§μ΄λλΌλ λμΌν κ°μ κ°μ§)- offsetX, offsetY
- μ’νλ₯Ό μΆλ ₯νλλ‘ νλ μ΄λ²€νΈκ° κ±Έλ €μλ μμ κΈ°μ€μΌλ‘ μ’νλ₯Ό Β Β νμν©λλ€.
π gsap setμ μ΄μ©νμ¬ κ³ μ
<div class="cursor"></div>
.cursor { position: fixed; top: -6px; left: -15px; width: 13px; height: 13px; border: 1px #1d1d1d; border-radius: 100%; background-color: hsla(0,0%,100%,.01); backdrop-filter: invert(100%); transform: none; transition: width .3s, height .3s; pointer-events: none; z-index: 100; }
$(document).mousemove(function(e){ mouseX = (e.clientX * 100)/innerWidth + "vw"; mouseY = (e.clientY * 100)/innerHeight + "vh"; gsap.set('.cursor', { x: mouseX, y: mouseY }) })
π¬ ν΄λΉ μμλ₯Ό html, css μΈν νκ³ cursor ν΄λμ€λ₯Ό λ£μ΄ μ€ ν,
gsap.set
μ μ΄μ©ν΄μx: mouseX
,y: mouseY
λ‘ μμ±νμμ΅λλ€.
π¬ work-area
μμμ κ°λ©΄ μμ΄ μ μ¬μ§κ³Ό κ°μ΄ λ³κ²½λ©λλ€.
<div class="cursor"> <div class="cursor-transform see-case hide">SEE CASE</div> </div>
π¬
cursor
μμsee-case
div
νκ·Έλ₯Ό μμ±νμ¬ μ μμ 'SEE CASE' κΈμλ₯Ό νμμλ μ보μ΄κ²hide
ν΄λμ€λ₯Ό μ£Όμ΄ μ¨κ²¨μ£Όκ³work-area
μμμ λ€μ΄κ° λhide
λ₯Ό μ κ±°νμ¬ λ³΄μ΄λλ‘ μ€κ³λ₯Ό νμ΅λλ€.if(e.target.closest('.work-area') != null) { $('.cursor').addClass('cursor-work').children('.see-case').removeClass('hide') }
π¬ μμ λΆν° λΆλͺ¨ μμκΉμ§ μ§μ ν μ νμμ λ§μ‘±ν λκΉμ§ νμνλ
closest
λ©μλλ₯Ό μ΄μ©νμ¬e.target
μ΄work-area
쑰건μ λ§μ‘±νλ©΄cursor
μcursor-work
ν΄λμ€λ₯Ό μΆκ°νμ¬ μ cssλ₯Ό λ³κ²½ν΄μ£Όκ³ ,see-case
μhide
λ₯Ό μ κ±° ν΄μ£Όμμ΅λλ€. κ·Έ ν,gsap.to
μ μ΄μ©νμ¬ μκΉ κ΅¬ν΄μ€ mouseX κ°κ³Ό mouseYκ°μ μ€μ ν΄μ£Όμ΄transition
μ΄ μ μ©λκ² νμμ΅λλ€.
βlink-talk
μμ 컀μ λ³κ²½
else if (e.target.closest('.link-talk') != null) { $('.cursor').addClass('cursor-talk').children('.email').removeClass('hide') }
π¬ νμ΄μ§ νλ¨μ
link-talk
ꡬκ°μμλ 컀μκ° λ³κ²½λλ μ΄λ²€νΈκ° μκΈ° λλ¬Έμ λ§μ°¬κ°μ§λ‘ λ§ν¬μ μ ν΄μ£Όκ³else if
λ₯Ό μ¬μ©ν΄μ λκ°μ΄ ꡬνμ ν΄μ£Όμμ΅λλ€.
βa
,btn
ꡬκ°μμ 컀μ λ³κ²½
else if(e.target.closest('a, button') != null) { gsap.to('.cursor', { scale: 3, }) }
π¬
a
,btn
ꡬκ°μ²λΌ ν΄λ¦νλ ꡬκ°μμλ 컀μκ° μ»€μ§λ μ΄λ²€νΈκ° μμ΄μgsap.to
μ μ΄μ©νμ¬scale
μ μ‘°μ νμμ΅λλ€.else { $('.cursor').removeClass('cursor-talk') $('.cursor').removeClass('cursor-work') $('.cursor span').addClass('hide'); gsap.to('.cursor', { scale: 1, }) }
π¬ κ·Έ μΈ κ΅¬κ°μμλ λͺ¨λ
cursor
μμμ λͺ¨λ ν΄λμ€λ₯Ό μ κ±°νκ³scale
λ μμ볡κ·νμ¬ μμ±νμμ΅λλ€!
π μ΅μ’ μ½λ
$(document).mousemove(function(e){
mouseX = (e.clientX * 100)/innerWidth + "vw";
mouseY = (e.clientY * 100)/innerHeight + "vh";
gsap.set('.cursor', {
x: mouseX,
y: mouseY
})
if(e.target.closest('.work-area') != null) {
$('.cursor').addClass('cursor-work').children('.see-case').removeClass('hide')
} else if (e.target.closest('.link-talk') != null) {
$('.cursor').addClass('cursor-talk').children('.email').removeClass('hide')
} else if(e.target.closest('a, button') != null) {
gsap.to('.cursor', {
scale: 3,
})
} else {
$('.cursor').removeClass('cursor-talk')
$('.cursor').removeClass('cursor-work')
$('.cursor span').addClass('hide');
gsap.to('.cursor', {
scale: 1,
})
}
})
β λ§μ°μ€λ₯Ό λ°λΌλ€λλ μ΄λ―Έμ§
$('.playing-item').mousemove(function(e){
var ratio = 100 / $(this).width();
var imgX = e.offsetX * ratio *.4 - 20;
gsap.to($(this).children('img'), {
xPercent: imgX,
ease: Power1.easeOut,
})
})
π¬ μ΄ λΆλΆλ 컀μμ λΉμ·νκ² μ’νκ°μ μ΄μ©νμ¬ μ΄λ―Έμ§κ° μ΅μ xμΆμΌλ‘ -20%, μ΅λ 20%λ‘ λΉμ¨μ ꡬνμ¬ κ΅¬ννμμ΅λλ€.
π¬ work-area
ꡬκ°μμλ 컀μκ° λ³κ²½λλ μ΄λ²€νΈ λΏλ§ μλλΌ κ°λ‘μ€ν¬λ‘€λ‘ μ νλλ μ΄λ²€νΈλ μμ΅λλ€. μ΄λ, gsap
νλ¬κ·ΈμΈμΌλ‘ pin
μ μ΄μ©ν΄ xμΆμ μ‘°μ νμ¬ κ΅¬νμ΄ κ°λ₯νμ΅λλ€!
π gsap pinμΌλ‘ κ°λ‘μ€ν¬λ‘€ ꡬν
gsap.to('.sc-work .work-area', { xPercent: -92 * ($('.work-item').length - 1), scrollTrigger: { pin: '.sc-work', trigger:'.work-area', start:"top top", end:"+=900%", scrub: .5, }, })
π¬
work-area
μμwork-item
λ€μ΄ μμΌλ―λ‘work-area
κ° xμΆμΌλ‘ μμ§μ΄λ©΄ κ°λ‘μ€ν¬λ‘€μ λ§λ€ μ μμ΅λλ€.
π¬ κ°work-item
λ€μ λμ΄κ°92%
μ΄κ³work-item
λ€μ κ°μμ1
μ λΉΌλ©΄ λ§μ§λ§work-item
μ΄ λ³΄μ¬μ§ ν λ€μ μΈλ‘ μ€ν¬λ‘€μ΄ κ°λ₯ν©λλ€.
show = gsap.utils.toArray('.show'); show.forEach((show) => { gsap.fromTo(show,{ y: 50, opacity: 0 },{ y: 0, opacity: 1, scrollTrigger: { trigger: show, start: 'top bottom', end: 'bottom-=20% top', toggleActions: 'play reverse play reverse', }, }) })
π gsap.utils.toArray
π¬ μ μμ νλ©΄μ λλ‘λ κ°μ ν¨κ³Όλ₯Ό κ°μ§ 컨ν μΈ λ€μ΄ λ§μμ μ΄κ±Έ λ°°μ΄λ‘ λ¬Άμ΄ μλμν€κ² νλ©΄ ν¨μ¨μ μ΄λΌκ³ μκ°νμ΅λλ€. κ·Έλμ gsapμμ λ°°μ΄λ‘ λ³νμμΌμ£Όλgsap.utils.toArray
λ₯Ό μ΄μ©νμ¬ μ μνμμ΅λλ€.
π¬ νΉμ μμμ λλ¬νμ λy
κ°κ³Όopacity
μ‘°μ μ gsapλ₯Ό μ΄μ©ν΄ μμ±ν μ½λμ λλ€. μ΄ ν¨κ³Όλ₯Ό μΈ μ»¨ν μΈ λ€μ΄ λ무λλ λ§μμ κ°κ°show
ν΄λμ€λ₯Ό μΆκ°νκ³gsap.utils.toArray
λ₯Ό μ΄μ©νμ¬forEach
λ‘ λ°λ³΅λ¬Έμ λ리λ κ° μμλ§λ€ gsapλ₯Ό μμ¨λ ν¨μ¨μ μΌλ‘ μμ±ν μ μμμ΅λλ€!
π toggleActions
π¬ μ€ν¬λ‘€μ μμ§μ΄λ©΄ gsapκ° μλμ νμ§λ§ λ€μ λλμκ° λλ λ§μ§λ§ ν¨κ³Όλ₯Ό κΈ°μ μΌλ‘ λ©μΆ°μμ΅λλ€. λ€μ λλμκ° λμλ ν¨κ³Όλ₯Ό μ€ννκΈ° μν΄μScrollTrigger
μ λΆκ°μ΅μ μΈtoggleActions
μ μ΄μ©νμ¬ μ μ©νμμ΅λλ€.toggleActions: 'play none none none' //toggleActions: "onEnter, onLeave, onEnterBack, onLeaveBack"
π¬
toggleActions
λ₯Ό μ μ©νμ§ μμ κ²½μ° μΌλ°μ μΈ μΈν μ λλ€.
- toggleActions
- 첫λ²μ§Έ μμλ
onEnter
λ‘scrollTrigger
μstart
λΆλΆμ λ€μ΄μend
μμ μ κΉμ§ μ€νλ©λλ€.- λλ²μ§Έ μμλ
onLeave
λ‘end
μμ μ λΉ μ Έλκ° λ μ€νλ©λλ€.- μΈλ²μ§Έ μμλ
onEnterBack
μΌλ‘ μ΄λ―ΈonEnter
κ° μ€νλ μμ μμ λ€μonEnter
λΆλΆμΌλ‘ λ€μ΄μ¬ λ μ€νλ©λλ€.- λ§μ§λ§ μμλ
onLeaveBack
μΌλ‘ λ€μ κ·Έ λΆλΆμ λ²μ΄λκ² λλ©΄ μ€νλ©λλ€.π¬ μ μνλ©΄μ μ§μ μ μ©νtoggleActions: 'play reverse play reverse',
show
λΆλΆμtoggleActions
λ₯Ό λ³΄κ² λλ©΄ μμμ λ€μ΄μ¬ λ μ μμ μΌλ‘play
κ° λκ³end
μμ μ λΉ μ Έλκ° λ μ€νλλ ν¨κ³Όκ° λ°λλ‘ λμκ°κ² λ§λ€μμ΅λλ€. κ°μ ν¨κ³Όλ₯ΌonEnterBack
κ³ΌonLeaveBack
μλ μ μ©νμ¬ κ° νΉμ μ€ν¬λ‘€ μ‘μ μ λ°λΌ ν¨κ³Όμ‘μ μ μ€ μ μμμ΅λλ€.
π¬position: sticky
λ μ€ν¬λ‘€ μμΉκ° μκ³μ μ μ΄λ₯΄λ©΄position: fixed
μ κ°μ΄ κ³ μ μνκ° λ©λλ€.
π¬ pcνλ©΄μμ κ°λ‘μ€ν¬λ‘€λ‘ μμ§μ΄λ 컨ν μΈ λ€μ λͺ¨λ°μΌ νλ©΄μμλwork-item
κ°κ°position: sticky
μμ±μ μ£Όμ΄μ λ³κ²½νμμ΅λλ€.