JavaScript 30天编码挑战——第 13 天

274 阅读1分钟

这是我参与更文挑战的第15天,活动详情查看: 更文挑战

Slide In on Scroll

这个模块的内容就是对 scroll 的运用,主要的操作就是操作图片的滚动进入动画和滚动离开动画效果,使用到了 debounce(防抖),主要就是以实际效果效果为主。

一、效果展示

1.index-START.html

1.gif

2.index-FINISHED.html

2.gif

二、实现

最终代码

    <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);
      };
    }

    function scrollHandler(){
      // console.log("scroll",new Date().getTime());
      console.log(window.scrollY);

      let images = document.querySelectorAll("img");

      let windowTop =  window.scrollY;
      let windowBottom = windowTop + window.innerHeight;
      
      images.forEach((img)=>{
        let imgMiddle = img.offsetTop + img.height / 2;
        if( imgMiddle <  windowBottom && imgMiddle > windowTop) {
          img.classList.add("active");
        } else {
          img.classList.remove("active");
        }
      })

    }

    window.addEventListener("scroll",debounce(scrollHandler,100));
  </script>

三、总结回顾

过程分解

  1. 滚动事件的触发
     function scrollHandler(){
      console.log("scroll",new Date().getTime());
    }

    window.addEventListener("scroll",scrollHandler);

3.gif

  1. debounce使用
window.addEventListener("scroll",debounce(scrollHandler,100));  //间隔100ms

4.gif

这个时候滚动的触发已经不像是刚才那样那么频繁了,但是其实这个 debounce 的使用还是要看情况进行使用的,我认为这个东西的使用也是要看情况的,如果你觉得这个滚动你使用起来有问题,需要用到 debounce,那么你就去用,而不是说,遇到这种情况都应该用,还要要视情况进行使用的。

  1. 滚动进入显示
  • 从头部进入
    let images = document.querySelectorAll("img");

      let windowTop =  window.scrollY;
      let windowBottom = windowTop + window.innerHeight;
      
      images.forEach((img)=>{
        if(img.offsetTop < windowBottom) {
          img.classList.add("active");
        }
      })

5.gif 可以看到,只要进入一点点,图片立马就显示了,这就是从头部进入。

但是这样体验是不是不太好,感觉很意外的样子,我都几乎看不到什么动画的过程,然后它就加载完了,那就再看看别的方式,看看哪一种更好。

  • 从中间进入
    images.forEach((img)=>{
        if(img.offsetTop + img.height / 2 <  windowBottom) {
          img.classList.add("active");
        }
      })

7.gif 这个中间进入就感觉好了很多,最起码在画面体验上要好一些。

  • 从底部进入
    images.forEach((img)=>{
        if(img.offsetTop + img.height<  windowBottom) {
          img.classList.add("active");
        }
      })

6.gif 可以看到,当滚动到图片中间的时候,图片还是没有显示,当滚动到底部的时候,图片显现。

但是,这个效果感觉体验也不是十分的好,总体上感觉起来还是觉得中间部分的进入效果是比较好的。

  1. 滚动离开显示
     images.forEach((img)=>{
        let imgMiddle = img.offsetTop + img.height / 2;
        if( imgMiddle <  windowBottom && imgMiddle > windowTop) {
          img.classList.add("active");
        } else {
          img.classList.remove("active");
        }
      })

8.gif

四、重难点

感觉从后面的第十一天开始之后,更多的都是倾向于一些比较相对高级方便的写法,而且更注重于实际操作效果的展示和体验,相对于一些琐碎的知识点已经直接略过了。