[JavaScript30] ๐Ÿ–ฑ 13. Slide In on Scroll

์กฐ์ค€ํ˜•ยท2021๋…„ 7์›” 9์ผ
0

JavaScript30

๋ชฉ๋ก ๋ณด๊ธฐ
13/30
post-thumbnail

๐Ÿ–ฑ 13. Slide In on Scroll

debounce๋ฅผ ํ™œ์šฉํ•ด ์Šคํฌ๋กค ์ด๋ฏธ์ง€ ์ž๋ฆฌ์˜ ์ค‘๊ฐ„๊นŒ์ง€์˜ค๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ์–‘ ์˜†์—์„œ ๋‚ ์•„์˜ค๋Š” ํšจ๊ณผ๋ฅผ ์ ์šฉ.

์ดˆ๊ธฐ์ฝ”๋“œ

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>

  <div class="site-wrap">

    <h1>Slide in on Scroll</h1>

    <p>Consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariaturlores sunt esse magni, ut, dignissimos.</p>
    <p>Lorem ipsum cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.</p>
    <p>Adipisicing elit. Tempore tempora rerum..</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.</p>

    <img src="http://unsplash.it/400/400" class="align-left slide-in">

    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptates, deserunt facilis et iste corrupti omnis tenetur est. Iste ut est dicta dolor itaque adipisci, dolorum minima, veritatis earum provident error molestias. Ratione magni illo sint vel velit ut excepturi consectetur suscipit, ea~~~~~ dummy data ~~~~~t</p>

    <img src="http://unsplash.it/400/401" class="align-right slide-in">

    <p> at provident praesentium atque quas rerum optio dignissimos repudiandae ullam illum quibusdam. Vel ad error quibusdam, illo ex totam placeat. Quos excepturi fuga, molestiae ea quisquam minus, ratione dicta consectetur officia omnis, doloribus voluptatibus? Veniam ipsum veritatis architecto, provident quas consequatur doloremque quam quidem earum expedita, ad delectus voluptatum, omnis praesentium nostrum qui aspernatur ea eaque adipisci et cumque ab? Ea voluptatum dolore itaque odio. Eius minima distinctio harum, officia ab nihil exercitationem. Tempora rem nemo nam temporibus molestias facilis minus ipsam quam doloribus consequatur debitis nesciunt tempore officiis aperiam quisquam, molestiae voluptates cum, fuga culpa. Distinctio accusamus quibusdam, tempore perspiciatis dolorum optio facere consequatur quidem ullam beatae architecto, ipsam sequi officiis dignissimos amet impedit natus necessitatibus tenetur repellendus dolor rem! Dicta dolorem, iure, facilis ill~~~~~ dummy data ~~~~~.</p>

    <img src="http://unsplash.it/200/500" class="align-left slide-in">

    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis, deserunt et incidunt eveniet <img src="http://unsplash.it/200/200" class="align-right slide-in"> temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium blanditiis eum explicabo placeat reiciendis ~~~~~ dummy data ~~~~~</p>


    <p>laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum minima fugiat in nostrum. ~~~~~ dummy data ~~~~~ </p>

    <img src="http://unsplash.it/400/400" class="align-right slide-in">

    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisc ~~~~~ dummy data ~~~~~</p>




  </div>

  <script>
    function debounce(func, wait = 20, immediate = true) {
      var timeout;
      return function() {
        var context = this, args = arguments;
        var later = function() {
          timeout = null;
          if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
      };
    }

  </script>

  <style>
    html {
      box-sizing: border-box;
      background: #ffc600;
      font-family: 'helvetica neue';
      font-size: 20px;
      font-weight: 200;
    }
    
    body {
      margin: 0;
    }
    
    *, *:before, *:after {
      box-sizing: inherit;
    }

    h1 {
      margin-top: 0;
    }

    .site-wrap {
      max-width: 700px;
      margin: 100px auto;
      background: white;
      padding: 40px;
      text-align: justify;
    }

    .align-left {
      float: left;
      margin-right: 20px;
    }

    .align-right {
      float: right;
      margin-left: 20px;
    }

    .slide-in {
      opacity: 0;
      transition: all .5s;
    }

    .align-left.slide-in {
      transform: translateX(-30%) scale(0.95);
    }
    
    .align-right.slide-in {
      transform: translateX(30%) scale(0.95);
    }

    .slide-in.active {
      opacity: 1;
      transform: translateX(0%) scale(1);
    }

  </style>

</body>
</html>

์ดˆ๊ธฐ ํ™”๋ฉด

๐ŸŒ ์ƒˆ๋กœ ์•Œ๊ฒŒ ๋œ ๊ฒƒ

๐Ÿ‘‰ Debounce์™€ Throttle

๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ DOM์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•.

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋งŽ์€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰(์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๊ณผ๋„ํ•œ ํšŸ์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ)ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์ œ์•ฝ์„ ๊ฑธ์–ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๊ธฐ์ˆ .

[ex] :

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ฐฝ ํฌ๊ธฐ ์กฐ์ •์„ ๋ฉˆ์ถœ ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ resizing event๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด
  • ์—ฐ๊ด€ ๊ฒ€์ƒ‰์–ด ์ถœ๋ ฅ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ์ค‘์ง€ ํ•  ๋•Œ ๊นŒ์ง€ ์ œ์–ด.
  • ๋ฌดํ•œ์Šคํฌ๋กค

๐Ÿ‘‰ Debounce

์ด๋ฒคํŠธ๋ฅผ ๊ทธ๋ฃนํ™” ํ•˜์—ฌ ํŠน์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋งŒ ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ .
์ฆ‰, ์ˆœ์ฐจ์  ํ˜ธ์ถœ์„ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ "๊ทธ๋ฃนํ™”" ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ์ด์–ด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ ๋“ค ์ค‘ ๋งˆ์ง€๋ง‰ ํ•จ์ˆ˜(or ์ œ์ผ ์ฒ˜์Œ)๋งŒ ํ˜ธ์ถœ ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ

๋งŒ์•ฝ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด์ฆˆ์— ๋”ฐ๋ผ ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค ํ–ˆ์„ ๋•Œ ์‚ฌ์ด์ฆˆ๊ฐ€ ๊ณ„์† ๋ฐ”๋€”๋•Œ ๋งˆ๋‹ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ํ•˜์ง€์•Š๊ณ , ์‚ฌ์ด์ฆˆ์˜ ๋ณ€ํ™”๊ฐ€ ๋ฉˆ์ถ”๋Š” ๊ฒฝ์šฐ๋งŒ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด.

๐Ÿ‘‰ Throttle

์ด๋ฒคํŠธ๋ฅผ ์ฃผ๊ธฐ๋งˆ๋‹ค ๋ฐœ์ƒํ•˜๋„๋ก ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ 
๋งŒ์•ฝ 1ms๋กœ ์ฃผ๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์ด๋ฒคํŠธ๋Š” 1ms๋™์•ˆ ์ตœ๋Œ€ ํ•œ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•˜๊ฒŒ ๋จ.

๋งˆ์ง€๋ง‰ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ธฐ ์ „์— ๋‹ค์‹œ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ

ํŠน์„ฑ ์ž์ฒด๊ฐ€ ์‹คํ–‰ ํšŸ์ˆ˜์— ์ œํ•œ์„ ๊ฑฐ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์„ฑ๋Šฅ ๋ฌธ์ œ๋–„๋ฌธ์— ๋งŽ์ด ์‚ฌ์šฉํ•จ.

๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ๋ฌดํ•œ์Šคํฌ๋กค๋ง ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Œ.

์ฐธ๊ณ  : https://webclub.tistory.com/607

๐ŸŒ ๊ณผ์ •

๐Ÿ‘‰ 1. ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋“ค ๊ฐ€์ ธ์˜ค๊ธฐ

const sliderImages = document.querySelectorAll('.slide-in');

๐Ÿ‘‰ 2. ํ•จ์ˆ˜์™€ scroll์ด๋ฒคํŠธ ์ถ”๊ฐ€

function checkSlide(e){
	console.log(e);
}

window.addEventListener('scroll', debounce(checkslide));

debounce๋กœ ๊ฐ์‹ธ์„œ ์Šคํฌ๋กค์ด ๋ฉˆ์ถœ๋–„ ํ•œ๋ฒˆ ๋ฐœ์ƒ

๐Ÿ‘‰ 3. ํ•จ์ˆ˜ ์ž‘์„ฑ

function checkSlide(e) {
    // console.count(e);
    // console.log(window.scrollY);
    sliderImages.forEach(sliderImage => {
        // half way through the image
        const slideInAt = (window.scrollY + window.innerHeight) - sliderImage.height / 2;
        // console.log(slideInAt);

        // bottom of the image
        const imageBottom = sliderImage.offsetTop + sliderImage.height;
        const isHalfShown = slideInAt > sliderImage.offsetTop;
        const isNotScrolledPast = window.scrollY < imageBottom;
        if (isHalfShown && isNotScrolledPast) {
            sliderImage.classList.add('active');
        } else {
            sliderImage.classList.remove('active');
        }
    });
}
  • slideInAt์€ ํ˜„์žฌ ํ™”๋ฉด์˜ ์„ธ๋กœ๊ธธ์ด์™€ ์Šคํฌ๋กคํ•œ ๊ธธ์ด์˜ ํ•ฉ์—์„œ ์ด๋ฏธ์ง€๊ธธ์ด์˜ ์ ˆ๋ฐ˜์„ ๋บ€๊ฐ’.
  • imageBottom์€ ์ด๋ฏธ์ง€์˜ ์ตœํ•˜๋‹จ ๊ฐ’.
  • isHalfShown์€ slideInAt์ด ์ด๋ฏธ์ง€์˜ ์ตœ์ƒ๋‹จ ์ขŒํ‘œ๋ณด๋‹ค ํด ๋•Œ ์ฐธ์ด๋œ๋‹ค.
  • isNotScrolledPast๋Š” ์Šคํฌ๋กคํ•œ๊ฒŒ imageBottom๋ณด๋‹ค ์ž‘์„๋•Œ ์ฐธ์ด๋จ.
  • isHalfShown๊ณผ isNotScrolledPast๋ฉด activeํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜์˜ค๊ฒŒํ•˜๊ณ ,
    ๊ฑฐ์ง“ ์ด๋ฉด activeํด๋ž˜์Šค๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

==> ์ด๋ฏธ์ง€ ์ค‘๊ฐ„๋ถ€ํ„ฐ ๋งจ ์•„๋žซ๋ถ€๋ถ„ ์‚ฌ์ด์— ์Šคํฌ๋กค์„ ํ•  ๋•Œ ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜์˜ค๊ณ , ์‚ฌ๋ผ์ง„๋‹ค.

profile
๊นƒํ—ˆ๋ธŒ : github.com/JuneHyung

0๊ฐœ์˜ ๋Œ“๊ธ€