haizlin / fe-interview

前端面试每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天进步一点!每天早上5点纯手工发布面试题(死磕自己,愉悦大家),6000+道前端面试题全面覆盖,HTML/CSS/JavaScript/Vue/React/Nodejs/TypeScript/ECMAScritpt/Webpack/Jquery/小程序/软技能……
http://www.h-camel.com
MIT License
25.41k stars 3.26k forks source link

[js] 第230天 写一个方法判断页面滚动方向 #1592

Open haizhilin2013 opened 4 years ago

haizhilin2013 commented 4 years ago

第230天 写一个方法判断页面滚动方向

我也要出题

SXX19950910 commented 4 years ago
  function debounce(fn, wait) {
    let timeout = null;
    return function() {
      if(timeout !== null)
        clearTimeout(timeout);
      timeout = setTimeout(fn, wait);
    }
  }
  const $wrapper = document.getElementById('wrapper')
  let [x,y] = [0, 0]
  const halfHeight = ($wrapper.offsetHeight / 2) + 17
  const halfWidth = ($wrapper.offsetWidth / 2) + 17
  const handle = () => {
    const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
    const scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft
    if (scrollLeft > x) {
      if (scrollLeft === halfWidth) console.log('向右滚动到底')
      else console.log('向右滚动')
    } else if (scrollLeft < x) {
      console.log('向左滚动')
    }
    if (scrollTop > y) {
      if (scrollTop === halfHeight) console.log('向下滚动到底')
      else console.log('向下滚动')
    } else if (scrollTop < y) {
      console.log('向上滚动')
    }
    x = scrollLeft
    y = scrollTop
  }
  window.addEventListener('scroll', debounce(handle, 200))
forever-z-133 commented 4 years ago
var lastScrollTop = 0, lastScrollDirection;
var event = new Event('scroll-direction-change');

scroller.addEventListener("scroll", function(e) {
  var scrollTop = e.target.scrollTop;
  var direction = scrollTop - lastScrollTop > 0 ? 1 : -1;
  if (lastScrollDirection !== direction) {
    event.direction = direction;
    scroller.dispatchEvent(event);
    lastScrollDirection = direction;
  }
  lastScrollTop = scrollTop;
});

scroller.addEventListener("scroll-direction-change", function(e) {
  console.log(e.direction > 0 ? '向下滚' : '向上滚', e);
});
forever-z-133 commented 4 years ago
if (window.onwheel) {
  scroller.addEventListener("wheel", function(e) {
    console.log(e.deltaY > 0 ? '向下滚' : '向上滚');
  });
} else if (window.onmousewheel) {
  scroller.addEventListener("mousewheel", function(e) {
    console.log(e.wheelDelta < 0 ? '向下滚' : '向上滚');
  });
} else if (window.MouseScrollEvent) {
  scroller.addEventListener("DOMMouseScroll", function(e) { // Firefox
    console.log(e.detail > 0 ? '向下滚' : '向上滚');
  });
}