ν‹°μŠ€ν† λ¦¬ λ·°

lodash.js

πŸ“Œ _.throttle(ν•¨μˆ˜,μ‹œκ°„)

μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜μ˜ 수λ₯Ό 계산해쀀닀.

 

ν”„λ‘œμ νŠΈκ°€ λ¬΄κ±°μ›Œμ§€λ©΄ 화면을 μŠ€ν¬λ‘€ν•  λ•Œ ν•¨μˆ˜λ₯Ό 많이 μ‹€ν–‰ν•˜λŠ”κ²Œ λΆ€λ‹΄μŠ€λŸ¬μšΈ 수 μžˆλ‹€.

0.3초 λ‹¨μœ„λ‘œ λΆ€ν•˜λ₯Ό μ€˜μ„œ ν•¨μˆ˜κ°€ 우λ₯΄λ₯΄ μ‹€ν–‰λ˜λŠ” 것을 λ°©μ§€ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©

ex) ν™”면이 슀크둀 될 λ•Œ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜μ˜ 개수λ₯Ό μΌμ • μ‹œκ°„μ— ν•œ λ²ˆμ”©λ§Œ μ‹€ν–‰λ˜λ„λ‘ μ œν•œμ„ κ±Έμ—ˆλ‹€.

window.addEventListener('scroll', _.throttle( function () {
    console.log('scroll')
}, 300));

gsap cdn

μžλ°”μŠ€ν¬λ¦½νŠΈ μ• λ‹ˆλ©”μ΄μ…˜ 라이브러리

 

πŸ“Œ gsap.to(μš”μ†Œ, μ§€μ†μ‹œκ°„, μ˜΅μ…˜)

μš”μ†Œμ™€ μ• λ‹ˆλ©”μ΄μ…˜ μ§€μ†μ‹œκ°„, μ–΄λ–€ μ• λ‹ˆλ©”μ΄μ…˜μ„ μ μš©ν• κ±΄μ§€μ— λŒ€ν•œ μ—¬λŸ¬κ°€μ§€ μ˜΅μ…˜μ„ λͺ…μ‹œν•  수 μžˆλ‹€.

μš”μ†Œμ—λŠ” css μ„ νƒμžλ₯Ό μž‘μ„±ν•΄λ„ μ™Όλ‹€.

 

1️⃣ 예제 1 ) μš”μ†Œκ°€ μžμ—°μŠ€λŸ½κ²Œ μ‚¬λΌμ§€κ²Œ

μš”μ†Œκ°€ 0.6μ΄ˆλ™μ•ˆ μ• λ‹ˆλ©”μ΄μ…˜ μ²˜λ¦¬κ°€ λ˜λ©΄μ„œ, opacityκ°€ 0으둜 점점점 투λͺ…ν•΄μ§„λ‹€.

const badgeEl = document.querySelector('header .badges');

gsap.to(badgeEl, .6, {
    opacity: 0,
})

 

ν•˜μ§€λ§Œ! opacity : 0 은 μš”μ†Œκ°€ 투λͺ…ν•΄μ§„ 것 뿐이고, μš”μ†ŒλŠ” κ·ΈλŒ€λ‘œμ—¬μ„œ 마우슀 클릭이 κ°€λŠ₯ν•œ μƒνƒœκ°€ λœλ‹€.

πŸ‘‰ display 속성도 μΆ”κ°€ν•΄μ€€λ‹€.

// 전체 μ½”λ“œ
const badgeEl = document.querySelector('header .badges');

window.addEventListener('scroll', _.throttle( function () {
    if(window.scrollY > 500 ) {
        gsap.to(badgeEl, .6, {
            opacity: 0,
            display: 'none',
        })
    } else {
        gsap.to(badgeEl, .6, {
            opacity: 1,
            display: 'block',
        })
    }
}, 300));

 

 

2️⃣ 예제 2 ) μš”μ†Œκ°€ μžμ—°μŠ€λŸ½κ²Œ λ‚˜νƒ€λ‚˜κ²Œ

opacity : 0 μ΄μ—ˆλ˜ μš”μ†Œλ“€μ„ 각 μš”μ†Œμ— μ§€μ—°μ‹œκ°„μ„ μΆ”κ°€ν•˜μ—¬ 순차적으둜 λ‚˜νƒ€λ‚˜κ²Œν•œλ‹€.

const fadeEls = document.querySelectorAll('.visual .fade-in');
fadeEls.forEach(function(fadeEl, index){
    gsap.to(fadeEl, 1, {
        delay : (index + 1) * .7,
        opacity : 1
    })
})

 

 

3️⃣ 예제 3 ) μš”μ†Œκ°€ λ‘₯λ‘₯ λ– λ‹€λ‹ˆλŠ” 효과 μ£ΌκΈ°

function floatingObject(selector, delay, size) {
    gsap.to(
        selector,                   // μ„ νƒμž
        random(1.5, 2.5),           // μ• λ‹ˆλ§€μ΄μ…˜ λ™μž‘ μ‹œκ°„
        {
            y: size,                // yμΆ•μœΌλ‘œ 20만큼 μ΄λ™ν•˜λŠ” μ• λ‚΄λ§€μ΄μ…˜
            repeat: -1,             // λ¬΄ν•œ 반볡
            yoyo: true,             // μž¬μƒλœ μ• λ‹ˆλ§€μ΄μ…˜μ„ λ’€λ‘œ λ‹€μ‹œ μž¬μƒ
            ease: Power1.easeInOut,
            delay: random(0,delay)
        }
    )
}

floatingObject('.floating1', 1, 15)
floatingObject('.floating2', .5, 15)
floatingObject('.floating3', 1.5, 20)

 

4️⃣ 예제 4 ) νŽ˜μ΄μ§€ μƒλ‹¨μœΌλ‘œ 이동

const toTopEl = document.querySelector('#to-top');
toTopEl.addEventListener('click', function(){
    gsap.to(window, .7, {
        scrollTo: 0
    })
})

 

SwiperJS 

ν•˜λ“œμ›¨μ–΄ 가속 μ „ν™˜κ³Ό μ—¬λŸ¬ κΈ°λ³Έ λ™μž‘μ„ κ°–μΆ˜ μŠ¬λΌμ΄λ“œ 라이브러리

new Swiper( μš”μ†Œ, μ˜΅μ…˜ )

 

πŸ“Œ μ˜΅μ…˜

- direction : λ°©ν–₯

- autoplay: μžλ™ μ‹€ν–‰

   { delay : μ§€μ†μ‹œκ°„ } 

- loop : 반볡

- slidesPreView : ν•œλ²ˆμ— 보여쀄 μŠ¬λΌμ΄λ“œ 개수

- spaceBetween : μŠ¬λΌμ΄λ“œ 사이 μ—¬λ°±

- centeredSlides: 1번 μŠ¬λΌμ΄λ“œκ°€ κ°€μš΄λ° 보이기

- pagination

  - el : νŽ˜μ΄μ§€ 번호 μš”μ†Œ μ„ νƒμž

  - clickable : μ‚¬μš©μžμ˜ νŽ˜μ΄μ§€ 번호 μš”μ†Œ μ œμ–΄ κ°€λŠ₯ μ—¬λΆ€

- navigation

  - preEl : 이전 μŠ¬λΌμ΄λ“œ

  - nextEl : λ‹€μŒ μŠ¬λΌμ΄λ“œ

new Swiper('.promotion .swiper', {
    loop: true,
    slidesPerView: 3, 
    spaceBetween: 10,
    centeredSlides: true,
    autoplay: {
        delay: 5000
    },
    pagination : {
        el: '.promotion .swiper-pagination',
        clickable: true,    //  μ‚¬μš©μžμ˜ νŽ˜μ΄μ§€ 번호 μš”μ†Œ μ œμ–΄ κ°€λŠ₯ μ—¬λΆ€
    },
    navigation: {
        prevEl: '.promotion .swiper-prev',
        nextEl: '.promotion .swiper-next',
    }
})

Youtube API

Youtube λ™μ˜μƒμ„ μ œμ–΄ν•  수 μžˆλ‹€.

https://developers.google.com/youtube/iframe_api_reference?hl=ko

 

iframe μ‚½μž…μ— λŒ€ν•œ YouTube Player API μ°Έμ‘° λ¬Έμ„œ  |  YouTube IFrame Player API  |  Google for Developers

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— YouTube ν”Œλ ˆμ΄μ–΄λ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€.

developers.google.com

 

유튜브 μ˜μƒμ΄ 좜λ ₯될 μœ„μΉ˜μ— μš”μ†Œλ₯Ό μƒμ„±ν•œλ‹€.

 <div class="youtube__cover"></div>

 

μ˜΅μ…˜μ„ μ§€μ •ν•˜κ³  μ‹€ν–‰ν•œλ‹€.

// This code loads the IFrame Player API code asynchronously.
var tag = document.createElement('script');

tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

//    This function creates an <iframe> (and YouTube player)
//    after the API code downloads.
function onYouTubeIframeAPIReady() {
    new YT.Player('player', {
      videoId: 'dLgC4yhZ578',
        playerVars: {          // μ˜μƒμ„ μž¬μƒν•˜κΈ° μœ„ν•œ λ³€μˆ˜λ“€
          autoplay: true,     // μžλ™ μž¬μƒ 유무
          loop: true,         // 반볡 μž¬μƒ 유무
          playLists: 'dLgC4yhZ578'    // 반볡 μž¬μƒν•  유튜브 μ˜μƒ ID
      },
      events: {
          onReady: function(event) {
              event.target.mute();    // μŒμ†Œκ±°
          }
      }
    });
}

ScrollMagic

슀크둀과 μš”μ†Œμ˜ μƒν˜Έ μž‘μš©μ„ μœ„ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€.
λŒ€ν‘œμ μœΌλ‘œ μ–΄λ–€ μš”μ†Œκ°€ ν˜„μž¬ 화면에 λ³΄μ΄λŠ” μƒνƒœμΈμ§€λ₯Ό 확인할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

new ScrollMagic.Scene().setClassToggle()

Scene : νŠΉμ •ν•œ μš”μ†Œλ₯Ό κ°μ‹œν•˜λŠ” μ˜΅μ…˜μ„ μ§€μ •ν•΄μ£ΌλŠ” λ©”μ„œλ“œ

setClassToggle : 클래슀 속성을 μ§€μ • (toggle λ°©μ‹μœΌλ‘œ)

πŸ‘‰ νŠΉμ •ν•œ μ„Ήμ…˜μ΄ 화면에 보이기 μ‹œμž‘ν•  λ•Œ μ• λ‹ˆλ©”μ΄μ…˜μ„ 좔가해쀄 수 μžˆλ‹€.

 

1️⃣ Scene μ˜΅μ…˜

- triggerElement : λ³΄μ—¬μ§μ˜ μ—¬λΆ€λ₯Ό κ°μ‹œν•  μš”μ†Œλ₯Ό μ§€μ •

- triggerHook : νŠΈλ¦¬κ±°κ°€ μ‹œμž‘λ˜λŠ” 지점

 

triggerHook: .8

 

 

 

 

 

0.8 μ΄λΌλŠ” 뷰포트의 지점에 걸리면 νŠΈλ¦¬κ±°κ°€ λœλ‹€

 

 

κ°μ‹œν•˜λŠ”μ˜΅μ…˜μ„ 톡해 ν•΄λ‹Ήν•˜λŠ” μš”μ†Œκ°€ 화면에 보여진닀라고 νŒλ‹¨μ΄ 되면 κ·Έ 밑에 μžˆλŠ” setClassToggleμ΄λΌλŠ” λ©”μ„œλ“œλ₯Ό μ‹€ν–‰

 

2️⃣ setClassToggle(μš”μ†Œ, ν† κΈ€ν•  클래슀 이름)

setClassToggle(spyEl, 'show')

ν•΄λ‹Ήν•˜λŠ” μš”μ†Œκ°€ ν™”λ©΄μ˜ 0.8 지점을 μ§€λ‚˜λ©΄ 'show' ν΄λž˜μŠ€κ°€ μΆ”κ°€λœλ‹€.

 

⭐ 예제

const spyEls = document.querySelectorAll('section.scroll-spy');
spyEls.forEach( function(spyEl) {
    new ScrollMagic
        .Scene({
            triggerElement: spyEl,       /* λ³΄μ—¬μ§μ˜ μ—¬λΆ€λ₯Ό κ°μ‹œν•  μš”μ†Œλ₯Ό μ§€μ • */
            triggerHook: .8,             
        })
        .setClassToggle(spyEl, 'show')
        .addTo(new ScrollMagic.Controller());
})

ν΄λž˜μŠ€κ°€ 'scroll-spy' 인 μš”μ†Œλ“€μ„ κ°μ‹œν•˜κ³  슀크둀 효과λ₯Ό μ§€μ •ν•œλ‹€.

<section class="season-product scroll-spy">
  <div class="inner">
    <img src="./images/floating3.png" alt="image" class="floating floating3" />
    <img src="./images/season_product_image.png" alt="season" class="product back-to-position back-to-right delay-0"/>

    <div class="text-group">
      <img src="./images/season_product_text1.png" alt="season" class="title back-to-position back-to-left delay-1"/>
      <img src="./images/season_product_text2.png" alt="season" class="description back-to-position back-to-left delay-2"/>
      <div class="more back-to-position back-to-left delay-3">
        <a link="javascript:void(0)" class="btn"> μžμ„Ένžˆ 보기 </a>
      </div>
    </div>
  </div>
</section>
.back-to-position {
    opacity: 0;
    transition: 1s;
}
.back-to-position.back-to-right {
    transform: translateX(-150px);
}
.back-to-position.back-to-left {
    transform: translateX(150px);
}
.show .back-to-position {
    opacity: 1;
    transform: translateX(0);
}
.show .back-to-position.delay-0 {
    transition-delay: 0s;
}
.show .back-to-position.delay-1 {
    transition-delay: .3s;
}
.show .back-to-position.delay-2 {
    transition-delay: .6s;
}
.show .back-to-position.delay-3 {
    transition-delay: .9s;
}

'back-to-position' 클래슀인 μš”μ†Œλ“€μ€ opacity:0 으둜 μ²˜μŒμ— 보이지 μ•Šκ³ ,

'back-to-right / left' 클래슀 cssλ₯Ό 톡해 xμΆ•μœΌλ‘œ -150 , +150 만큼 λ–¨μ–΄μ Έμžˆλ‹€.

 

πŸ‘‰μŠ€ν¬λ‘€μ„ ν•΄μ„œ 0.8 지점을 μ§€λ‚˜ 'show'ν΄λž˜μŠ€κ°€ μΆ”κ°€λ˜λ©΄ opacity : 1 둜 보이게 λ˜λ©΄μ„œ translateX(0)으둜 xμΆ• 0 μ§€μ μœΌλ‘œ λŒμ•„μ˜¨λ‹€.

 

 

좜처

ν”„λ‘ νŠΈμ—”λ“œ μ›Ή 개발의 λͺ¨λ“  것 초격차 νŒ¨ν‚€μ§€

 

곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
Β«   2025/05   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
κΈ€ 보관함