Enterprise Blockchain

seung weon, seoΒ·2024λ…„ 6μ›” 5일
0

project

λͺ©λ‘ 보기
5/8
post-thumbnail

πŸ“‚ Enterprise Blockchain

  • ν”„λ‘œμ νŠΈ 이름: Enterprise Blockchain
  • μ‚¬μš©ν•œ μ–Έμ–΄: HTML, CSS, JavaScript, jQuery
  • μ‚¬μš©ν•œ JavaScript 라이브러리: GSAP (ScrollTrigger)

GSAPμ΄λž€?

GreenSock Animation Platform의 μ•½μžλ‘œ, JavaScriptλ₯Ό μ‚¬μš©ν•˜μ—¬ μ›Ή μ• λ‹ˆλ©”μ΄μ…˜μ„ λ§Œλ“€κΈ° μœ„ν•œ κ°•λ ₯ν•œ λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€.

gsap.set()


gsap.set()은 μ†μ„±μ˜ 초기 μƒνƒœλ₯Ό μ •μ˜ν•˜λŠ” 데 μ‚¬μš©λ˜λ©°, ν•΄λ‹Ή μƒνƒœκ°€ μ• λ‹ˆλ©”μ΄μ…˜ 없이 μ¦‰μ‹œ μ μš©λ©λ‹ˆλ‹€.

*μ΄ˆκΈ°κ°’ μ„ΈνŒ…

gsap.to()

gsap.to()λŠ” CSS 속성을 νŠΉμ • κ°’μœΌλ‘œ μ• λ‹ˆλ©”μ΄μ…˜ν™”ν•˜λŠ” 데 μ‚¬μš©λ˜λ©° λͺ©ν‘œκ°’μœΌλ‘œ 속성이 λ³€ν™”ν•˜λŠ” μ• λ‹ˆλ©”μ΄μ…˜μ„ μƒμ„±ν•©λ‹ˆλ‹€.

*이후값 μ„ΈνŒ…

gsap.from()

gsap.from()은 속성을 νŠΉμ • κ°’μ—μ„œ μ‹œμž‘ν•˜μ—¬ ν˜„μž¬ μƒνƒœλ‘œ μ• λ‹ˆλ©”μ΄μ…˜ν™”ν•˜λŠ” 데 μ‚¬μš©λ˜λ©° λͺ©ν‘œκ°’μ—μ„œ μ‹œμž‘κ°’μœΌλ‘œ 속성이 λ³€ν™”ν•˜λŠ” μ• λ‹ˆλ©”μ΄μ…˜μ„ μƒμ„±ν•©λ‹ˆλ‹€.

*μ΄μ „κ°’μœΌλ‘œ λŒμ•„κ°

gsap.fromTo()

gsap.fromTo() 속성을 μ‹œμž‘κ°’ fromμ—μ„œ λͺ©ν‘œκ°’ toκΉŒμ§€ μ• λ‹ˆλ©”μ΄μ…˜ν™”ν•˜λŠ” 데 μ‚¬μš©λ˜λ©° μ‹œμž‘κ°’κ³Ό λͺ©ν‘œκ°’을 λͺ…μ‹œμ μœΌλ‘œ μ„€μ •ν•˜μ—¬ 속성이 λ³€ν™”ν•˜λŠ” μ• λ‹ˆλ©”μ΄μ…˜μ„ μƒμ„±ν•©λ‹ˆλ‹€.

*이전값(from)μ—μ„œ 이후값(to)으둜

gsap.timeline

일련의 μ• λ‹ˆλ©”μ΄μ…˜μ„ 순차적 λ˜λŠ” λ³‘λ ¬λ‘œ μ‹€ν–‰ν•  수 μžˆλŠ” νƒ€μž„λΌμΈ(Timeline)을 μƒμ„±ν•˜λŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€.

label

timeline
.to("#animatedElement", {...},'a') - 라벨 'a'
.to("#animatedElement", {...},'a+=4') - 'a' 4초 뒀에 μ‹œμž‘

μ• λ‹ˆλ©”μ΄μ…˜μ˜ νŠΉμ • 지점을 지정해 라벨링 ν•¨μœΌλ‘œ μ• λ‹ˆλ©”μ΄μ…˜ λ™μ‹œμ— μ‹œμž‘, μ• λ‹ˆλ©”μ΄μ…˜ μ‹œμž‘ μ‹œκ°„ 지정 λ“± νƒ€μž„λΌμΈ λ‚΄μ—μ„œ μ‹œκ°„ μ»¨νŠΈλ‘€μ„ μœ μ—°ν•˜κ²Œ λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€.

position: sticky

position: stickyλŠ” CSS의 속성 쀑 ν•˜λ‚˜λ‘œ, 슀크둀이 νŠΉμ • 지점에 λ„λ‹¬ν–ˆμ„λ•Œ 화면에 κ³ μ •μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

μœ„ μ½”λ“œμ—μ„œλŠ” .sticky-element의 λΆ€λͺ¨ μš”μ†Œ .container에 500vhλΌλŠ” 높이 값을 μ£Όμ–΄μ„œ 슀크둀이 .container에 λ„λ‹¬ν–ˆμ„λ•Œ 500vh의 높이 만큼 .sticky-elementλ₯Ό κ³ μ •μ‹œν‚€κ³  μžˆλŠ” 뢀뢄을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

ScrollTrigger

ScrollTriggerλŠ” 슀크둀 μ• λ‹ˆλ©”μ΄μ…˜μ„ 닀루기 μœ„ν•œ GSAP의 ν”ŒλŸ¬κ·ΈμΈ 쀑 ν•˜λ‚˜λ‘œ 슀크둀 μ΄λ²€νŠΈμ— λ°˜μ‘ν•˜μ—¬ μš”μ†Œμ˜ μ—¬λŸ¬ 속성듀을 μ œμ–΄ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

trigger

μ–΄λ–€ μš”μ†Œκ°€ ScrollTrigger둜 μ‚¬μš©λ μ§€λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

trigger:'.container' - .container κΈ°μ€€μœΌλ‘œ

start / end

트리거의 μ–΄λŠ λΆ€λΆ„μ—μ„œ μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ‹œμž‘ν•˜κ³  끝날지λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

start:'0% 0%', - "트리거 κΈ°μ€€ μœˆλ„μš° κΈ°μ€€"
end:'100% 100%' - "트리거 κΈ°μ€€ μœˆλ„μš° κΈ°μ€€"

scrub

μ• λ‹ˆλ©”μ΄μ…˜μ˜ 진행 μƒνƒœλ₯Ό μŠ€ν¬λ‘€λ°”μ— 직접 μ—°κ²°ν•˜μ—¬ scrubber처럼 μž‘λ™ν•˜λ„λ‘ μ—°κ²°ν•©λ‹ˆλ‹€.

scrub: n - n초 뒀에 μŠ€ν¬λ‘€λ°”μ˜ μœ„μΉ˜μ— 따라 μ• λ‹ˆλ©”μ΄μ…˜μ˜ ν˜„μž¬ μƒνƒœκ°€ μ‘°μ ˆλ©λ‹ˆλ‹€.

ease

μ• λ‹ˆλ©”μ΄μ…˜μ˜ 이징 easing을 μ„€μ •ν•©λ‹ˆλ‹€. μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ‹œμž‘ν•˜κ±°λ‚˜ μ’…λ£Œλ  λ•Œμ˜ 속도λ₯Ό μ œμ–΄ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

ease:'none' - 이징 μ—†μ• κΈ°

markers

슀크둀 트리거의 μœ„μΉ˜λ₯Ό 확인할 λ•Œ μœ μš©ν•œ 마컀λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

markers:'true' - 마컀 μΆ”κ°€ν•˜κΈ°

onEnter

트리거(start)에 μœˆλ„μš°(start) νŠΈλ¦¬κ±°κ°€ λ„λ‹¬ν–ˆμ„λ•Œ μ‹€ν–‰λ©λ‹ˆλ‹€.

onEnterBack

λ°˜λŒ€ λ°©ν–₯으둜 슀크둀 ν• λ•Œ μœˆλ„μš°(end)κ°€ 트리거(end)에 λ„λ‹¬ν–ˆμ„λ•Œ μ‹€ν–‰λ©λ‹ˆλ‹€.

onLeave

트리거(end)에 μœˆλ„μš°(end) νŠΈλ¦¬κ±°κ°€ λ„λ‹¬ν–ˆμ„λ•Œ μ‹€ν–‰λ©λ‹ˆλ‹€.

onLeaveBack

λ°˜λŒ€ λ°©ν–₯으둜 슀크둀 ν• λ•Œ μœˆλ„μš°(start)κ°€ 트리거(start)에 λ„λ‹¬ν–ˆμ„λ•Œ μ‹€ν–‰λ©λ‹ˆλ‹€.

Data 속성과 ScrollTriggerλ₯Ό ν™œμš©ν•˜μ—¬ 배경색 λ°”κΎΈκΈ°

GSAP

ScrollTrigger.create({
    trigger:"[data-dark]",
    start:"0% 55%",
    end:"100% 40%",
    toggleClass:{targets:"body",className:"dark"}
})
  1. 검은색 배경이 λ“€μ–΄κ°€λŠ” μš”μ†Œλ“€μ„ <div data-dark="">둜 묢은 ν›„ "[data-dark]"λ₯Ό 트리거둜 μ§€μ •ν•˜κΈ°

  2. .dark 클래슀λ₯Ό 생성 (검은색 λ°°κ²½, 폰트 색상 λ“±)

  3. λΆ€λ“œλŸ¬μš΄ 색상 μ „ν™˜μ„ μœ„ν•΄μ„œ body에 transition μΆ”κ°€

  4. body에 toggleClassλ₯Ό μ‚¬μš©ν•˜μ—¬ start 지점에 λ„λ‹¬ν–ˆμ„λ•Œ 클래슀 .darkλ₯Ό μΆ”κ°€ν•˜κ³  end 지점에 λ„λ‹¬ν–ˆμ„λ•Œμ—λŠ” 클래슀 .darkλ₯Ό μ œκ±°ν•˜λ„λ‘ λ§Œλ“€κΈ°

횑 슀크둀 μ• λ‹ˆλ©”μ΄μ…˜ (λ§ˆμ§€λ§‰ λ‚΄μš© κ°€μš΄λ° μ •λ ¬ν•˜κΈ°)

GSAP

gsap.to('.sc-method .method-area',{
	scrollTrigger:{
		trigger:'.group-method',
        start:"0% 0%",
        end:"100% 100%",
        scrub:0,
        invalidateOnRefresh: true,
    },
    ease:'none',
    xPercent:-100,
    x:function(){
        return window.innerWidth;
    }
  1. 슀크둀트리거λ₯Ό μ‚¬μš©ν•  클래슀 .group-method에 트리거λ₯Ό 작고 start / end 지점을 μž‘μ•„μ£ΌκΈ°
    *트리거 start 지점 즉 0%μ—μ„œ μ‹œμž‘ν•˜κ³  트리거 end 지점 100%μ—μ„œ λλ‚ μˆ˜ μžˆλ„λ‘ (start:"0% 0%",end:"100% 100%")

  2. invalidateOnRefresh: trueλ₯Ό μ‚¬μš©ν•˜μ—¬ λΈŒλΌμš°μ €κ°€ μƒˆλ‘œ 고침될 λ•Œ 슀크둀 트리거λ₯Ό μ΄ˆκΈ°ν™” μ‹œν‚€κΈ° (μœˆλ„μš° 리사이징 ν• λ•Œ μƒˆλ‘œκ³ μΉ¨ ν• μˆ˜ μžˆλ„λ‘)

  3. xPercent: -100을 μ¨μ„œ xμΆ•μœΌλ‘œ -100%만큼 μ΄λ™μ‹œν‚€κΈ° (ν™”λ©΄μ—μ„œ 보이지 μ•Šκ²Œ 됨)

  4. x의 값을 ν•¨μˆ˜λ‘œ μ„€μ •ν•˜μ—¬ x의 μœ„μΉ˜λ₯Ό window.innerWidth κ°’λ§ŒνΌ xμΆ•μœΌλ‘œ λ™μ‹œμ— μ΄λ™μ‹œν‚€κΈ° (return ν•¨μˆ˜λ₯Ό μ¨μ„œ μœˆλ„μš° 리사이징 ν• λ•Œ μƒˆλ‘œκ³ μΉ¨ ν• μˆ˜ 있게 λ§Œλ“€κΈ°)

  5. xPercent: -100μ—μ„œ window.innerWidthλ₯Ό λ”ν•œ κ°’λ§ŒνΌ μ΄λ™ν–ˆμ„λ•Œ λ§ˆμ§€λ§‰ λ‚΄μš©μ΄ xμΆ•κΈ°μ€€μœΌλ‘œ μ • κ°€μš΄λ°μ— μœ„μΉ˜ν•˜κ²Œ λ©λ‹ˆλ‹€.

Sticky 이후에도 κ³ μ •λœ κ²ƒμ²˜λŸΌ 보이게 λ§Œλ“€κΈ°

μ™Όμͺ½μ— μžˆλŠ” μΉ΄λ“œκ°€ μ œμžλ¦¬μ— μžˆλŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ sticky 이후에도 κ³ μ •λœ κ²ƒμ²˜λŸΌ 보이게 ν•˜λ €λ©΄ λ‹€μŒ sticky에 μœ„μΉ˜ν•˜λŠ” μΉ΄λ“œ μš”μ†Œλ‘œ λ°”κΏ”μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

HTML

<div class="sticky-wrapper">
	<div class="group-sticky1">
		<div class="sticky-inner">
			<div class="sticky dataid">
				...
			</div>
		</div>
	</div>
    <div class="group-sticky2 hide">
		<div class="sticky-inner">
			<div class="sticky dataid">
				...
			</div>
		</div>
	</div>
</div>

CSS

.sc-dataid .group-sticky1{
    height: 500vh;
}
.sc-dataid .group-sticky1 .sticky-inner{
    height: 600vh;
}
.sc-dataid .sticky.dataid{
    position: sticky;
    top: 0;
    height: 100vh;
    display: flex;
    overflow: hidden;
}

GSAP

gsap.timeline({
    scrollTrigger:{
        trigger:'.group-sticky2',
        start:"0% 0%",
        end:"100% 100%",
        scrub:0,
        onEnter:function(){
            $('.sc-dataid .group-sticky1').addClass('hide')
            $('.sc-dataid .group-sticky2').removeClass('hide')
        },
        onLeaveBack:function(){
            $('.sc-dataid .group-sticky1').removeClass('hide')
            $('.sc-dataid .group-sticky2').addClass('hide')
        }
    },
    ease:'none'
})
  1. sticky μ»¨ν…Œμ΄λ„ˆμΈ .group-sticky1와 stickyκ°€ 적용된 .sticky.dataid 사이에 클래슀.sticky-innerλ₯Ό μΆ”κ°€ν•˜κ³  μ»¨ν…Œμ΄λ„ˆλ³΄λ‹€ 100vh 더 큰 크기의 높이 κ°’ μ£ΌκΈ°

  2. .sticky-inner에 100vh 더 큰 크기의 높이 값을 μ£Όμ—ˆμ„ λ•Œ .sticky.dataidκ°€ μ»¨ν…Œμ΄λ„ˆ 보닀 100vh 만큼 더 κ³ μ •λ˜κ²Œ 되고, hide ν΄λž˜μŠ€κ°€ μ μš©λ˜μ–΄ μˆ¨κ²¨μ§„ .group-sticky2κ°€ κ·Έ 사이에 올라였게 λ©λ‹ˆλ‹€.

  3. .group-sticky2에 onEnter ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ μŠ€νƒ€νŠΈ νŠΈλ¦¬κ±°μ— λ„λ‹¬ν–ˆμ„λ•Œ .group-sticky1에 hide 클래슀λ₯Ό λ”ν•˜μ—¬ 숨기고 λ°˜λŒ€λ‘œ .group-sticky2μ—λŠ” 클래슀λ₯Ό λΉΌμ£ΌκΈ°

  4. onLeaveBack ν•¨μˆ˜μ—λŠ” λ°˜λŒ€λ‘œ μ μš©ν•˜μ—¬ μΉ΄λ“œ μš”μ†Œμ— Sticky 이후에도 κ³ μ •λœ κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” 효과λ₯Ό 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

Top λ²„νŠΌμ˜ Position λ³€ν™” μ• λ‹ˆλ©”μ΄μ…˜

HTML

<button class="btn-top">
	<svg>...</svg>
	<span class="blind">μƒλ‹¨μœΌλ‘œ 이동</span>
</button>

CSS

.btn-top{
    position: fixed;
    display: flex;
    align-items: center;
    justify-content: center;
    right: 100px;
    bottom: 40px;
    z-index: 2;
    background-color: #111;
    width: 50px;
    height: 50px;
    opacity: 0;
    transition: opacity .5s;
}
.btn-top.change{
    position: absolute;
    bottom: 100.08px;
    opacity: 1;
}

GSAP

ScrollTrigger.create({
    trigger:'.footer',
    start:"-60.08px 100%",
    toggleClass:{targets:".btn-top",className:"change"}
})
  1. .footer κΈ°μ€€μœΌλ‘œ 슀크둀 트리거 이벀트 λ§Œλ“€κΈ° (main보닀 컨트둀 ν•˜κΈ° μš©μ΄ν•¨)

  2. 트리거 μŠ€νƒ€νŠΈ 지점을 footerμ—μ„œ 60.08px μ˜¬λΌκ°„ μœ„μΉ˜λ‘œ 작고 μœˆλ„μš° μŠ€νƒ€νŠΈ 지점은 100%둜 작기
    *60.08px은 main λ§ˆμ§€λ§‰ ν•˜λ‹¨μ˜ join us μ• λ‹ˆλ©”μ΄μ…˜ μš”μ†Œμ˜ 높이λ₯Ό κ³ λ €ν•œ κ°’

  3. .btn-top에 클래슀 .changeκ°€ μΆ”κ°€λ˜μ—ˆμ„λ•Œ CSS λ§Œλ“€κΈ°
    *μ›λž˜ fixed μ˜€μ„λ•ŒλŠ” bottom: 40pxμ˜€μœΌλ―€λ‘œ join us μ• λ‹ˆλ©”μ΄μ…˜μ˜ 높이λ₯Ό κ³ λ €ν•˜μ—¬ absolute μΌλ•ŒλŠ”bottom: 100.08px둜 μž‘μ„±

profile
to reach new possibilities

0개의 λŒ“κΈ€