Detect when scrolling has finished when using `scroll-behavior: smooth`

前端 未结 3 827
小鲜肉
小鲜肉 2021-02-18 14:19

What is the best way to detect when scrolling to an element on the page has finished? The spec says that \"The scrolling box is scrolled in a smooth fashion using a user-agent-d

3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-02-18 15:08

    Use a debounce function as wrapper

    "use strict";
    
    var count = 0;
    // The [trigger] anchors should trigger listening on scrollend
    document.addEventListener('click', e => {
      if (e.target.matches('a[trigger]')) {
    
        // listen to CustomEvent 'scroll' only once
        window.addEventListener('scrollend', function(e) {
          console.log('Scrolling has finished', ++count)
        }, {
          once: true
        })
    
      }
    });
    
    
    {
      // create the scrollend event
      const options = {
        passive: true
      }
      const scrollEnd = debounce(e => {
        e.target.dispatchEvent(new CustomEvent('scrollend', {
          bubbles: true
        }))
      }, 100)
    
      window.addEventListener('scroll', scrollEnd, options)
    }
    
    // simple debounce
    function debounce(callback, wait) {
      var timeout;
      return function(e) {
        clearTimeout(timeout);
    
        timeout = setTimeout(() => {
          callback(e);
        }, wait);
      }
    }
    html {
      scroll-behavior: smooth;
    }
    
    section:target {
      background-color: lightgray;
    }
    
    div {
      overflow: auto;
      height: 40px;
    }
    
    #totop {
      position: fixed;
      right: 10px;
      bottom: 50px;
      padding: 10px;
      background-color: rgba(255, 155, 255, 0.9);
    }
     
    
    
    
    

    Lorem, ipsum dolor.

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nesciunt quibusdam eius possimus est sit iusto mollitia a molestias aperiam quam corrupti in culpa labore odit totam quod molestiae harum aliquid reiciendis, necessitatibus provident quasi laborum explicabo ad. Recusandae, ea esse!

    Natus doloremque voluptatem quas hic deleniti iusto, eaque sit aspernatur! Itaque modi voluptate placeat iure quam mollitia quod ipsum ea dolorem animi quis quisquam incidunt dignissimos cumque soluta cupiditate rem odio qui illo, ad provident explicabo impedit reprehenderit. Autem, obcaecati.

    Omnis, sit libero!

    Cumque repellat nesciunt quaerat, perferendis vel optio veritatis similique eum enim at recusandae velit asperiores debitis. Temporibus ratione voluptatem eum sequi voluptates, nihil, fugit, aut labore aliquam sapiente quam quod dolores. Veritatis voluptatem saepe aspernatur quia aperiam quaerat a impedit.

    Harum sunt explicabo repellat deleniti nesciunt, suscipit accusamus blanditiis architecto, voluptatum cupiditate optio quisquam sint, sed dignissimos a itaque eveniet libero in ut non eligendi quibusdam aut delectus? Repellendus consequatur amet unde maiores eaque ad, minima illo quis iusto inventore?

    Veritatis, non commodi.

    Rerum inventore quisquam nostrum, obcaecati, repudiandae ducimus cumque sed dicta corporis blanditiis neque, adipisci est porro earum reprehenderit! Facere, corrupti aliquid. Quae dolore placeat, corrupti in harum itaque odit inventore, nam perspiciatis expedita accusamus est quo illum fuga fugiat! Ipsam!

    Repellendus voluptatem optio placeat dolor quis expedita, dignissimos similique provident delectus ex laboriosam libero, fugiat esse. Fugiat ipsum quasi hic. Culpa, illum. Temporibus sunt earum fugit quo expedita asperiores sequi, eveniet culpa suscipit eum quas quos in ad vel? Odio.

    Est, doloribus? Quia.

    Perspiciatis accusantium nihil consectetur, beatae nulla doloremque error voluptas vitae, nobis, rem asperiores sit quibusdam corporis! Deserunt, veniam, ipsam placeat illo dolorem odio ducimus quo, facere tenetur commodi provident soluta nihil a minus doloremque fugit suscipit itaque quasi. Officiis, totam?

    Quibusdam reiciendis, deleniti placeat vero cum magnam, laudantium, veniam eius a laboriosam omnis accusamus delectus maiores labore doloremque voluptatum asperiores libero error vitae molestiae inventore eaque quam! Doloribus et, delectus, doloremque minima temporibus, velit explicabo corrupti quod magnam inventore neque.

    Ducimus, tempore omnis?

    Doloremque sequi nostrum exercitationem accusamus nemo voluptate vitae perferendis ipsam cumque voluptas vel molestias praesentium, necessitatibus voluptates sed officia veritatis eum a rem tenetur nisi. Possimus alias fugit illo consequuntur, asperiores tempora error, dignissimos assumenda culpa earum, eum voluptatum ex.

    Natus saepe neque rem corrupti quos a quis assumenda omnis hic accusamus eum eius, labore accusantium aperiam earum soluta beatae id, recusandae nesciunt! Natus commodi omnis non eum nemo maxime magnam provident, sint repellendus nulla adipisci? Odio officia assumenda qui!

    Quo, expedita omnis.

    Molestiae consectetur enim laborum sed tempora culpa, doloribus, suscipit ullam rerum exercitationem voluptas commodi nesciunt, modi fugit non provident consequatur. Quas delectus dolores, nemo rem qui unde fugiat inventore! Recusandae consequuntur eum placeat qui a ratione libero dignissimos ipsum quam.

    Officiis nostrum totam dolore neque iusto? Aperiam quia nemo aut omnis quibusdam similique ea ex. Assumenda blanditiis recusandae, iusto esse aut perferendis nulla sed quidem commodi porro, consequatur doloremque repellat. Assumenda quae quaerat consequuntur necessitatibus incidunt reiciendis libero architecto adipisci.

    Ratione, quos officiis!

    Qui ipsam cumque quae, quas provident, aliquid eius exercitationem aspernatur in voluptatum ut dolorem corrupti consequuntur ad voluptatibus inventore placeat hic molestias reiciendis! Delectus, quis asperiores! Molestias voluptatum ipsa dolores impedit labore nisi animi vel sapiente, cupiditate itaque minima commodi!

    Quia fugit, odio, quibusdam minima a error voluptate eligendi laudantium id pariatur, blanditiis sint non tenetur corrupti perspiciatis? Dolorum officiis minima obcaecati velit explicabo, voluptate error vitae repellat nostrum natus reiciendis voluptatum dolore earum eaque nemo incidunt numquam quae culpa!

    Cum, porro atque!

    Numquam corrupti nesciunt sit amet harum rem. Incidunt ea fugiat provident cumque corrupti, maiores aut esse, recusandae vero repellat ipsum nesciunt minus illum excepturi, soluta nemo veritatis rerum voluptas impedit similique perferendis amet? Eius dicta mollitia tempora, fuga ex maiores?

    Esse explicabo aliquam adipisci iure repellat ipsum laborum illo tenetur quae quas! Assumenda magni expedita provident veritatis fugit necessitatibus quod impedit maxime quibusdam. Nesciunt tempora dolores labore asperiores dolorem quidem, ex iste ipsa, recusandae, esse impedit iure ratione maxime fugiat?

    Veritatis, neque molestias!

    Sequi sapiente eligendi laudantium quos qui possimus repudiandae quis laborum modi facilis alias, consectetur natus, minima placeat commodi temporibus quae illo a sint? Omnis ipsa, dolore, praesentium at quisquam aliquid animi odio eius iusto magnam doloremque ab aspernatur itaque sequi.

    Iure facilis repellat possimus voluptatum. Recusandae voluptatibus vitae voluptates doloremque explicabo esse iure quo corporis error, cumque assumenda atque laborum neque. Quo non laboriosam nesciunt, vitae suscipit exercitationem repudiandae sunt assumenda sed saepe. Quo dignissimos, incidunt veritatis ratione ut quis?

    Culpa, magni dolorem!

    Quae, praesentium sit veritatis incidunt eligendi a ut at quas animi amet corrupti. Dignissimos modi tempore ratione et dolores. Pariatur facere beatae vero qui laudantium, asperiores consequatur quo officia excepturi atque, deserunt repudiandae, minus ex? Esse in non nihil laboriosam.

    Quod sit nihil eum doloribus deleniti possimus ducimus corporis vero exercitationem et? Vitae veniam, hic repellat placeat deserunt voluptatibus, eius animi natus in quibusdam quia nesciunt sint non quod, molestias minus! Minus excepturi inventore fugit beatae quas quod tenetur similique?

提交回复
热议问题