阻止所有滚动,直到函数触发

Posted

技术标签:

【中文标题】阻止所有滚动,直到函数触发【英文标题】:Prevent all scrolling until a function triggers 【发布时间】:2016-02-11 20:58:33 【问题描述】:

我正在尝试重新创建这种效果:http://www.jam3.com/work/#mobilemusicvideo

在顶部图像的动画完成之前,页面的所有滚动都被禁用。但是,当用户尝试滚动时会触发该图像动画。

如何创建这个?

我可以用这个功能防止滚动:

function disableScroll() 
  if (window.addEventListener) // older FF
      window.addEventListener('DOMMouseScroll', preventDefault, false);
  window.onwheel = preventDefault; // modern standard
  window.onmousewheel = document.onmousewheel = preventDefault; // older browsers, IE
  window.ontouchmove  = preventDefault; // mobile
  document.onkeydown  = preventDefaultForScrollKeys;

并使用此功能重新启用它:

 enter code herefunction enableScroll() 
        if (window.removeEventListener)
            window.removeEventListener('DOMMouseScroll', preventDefault, false);
        window.onmousewheel = document.onmousewheel = null; 
        window.onwheel = null; 
        window.ontouchmove = null;  
        document.onkeydown = null;  
    

但如果我先禁用滚动,当用户尝试滚动时如何触发函数?

【问题讨论】:

document.onscroll = function() preventScroll();在你的 disableScroll 函数中,你必须有一个条件语句来加载你想要的东西。 你能给我一个代码示例吗?例如,如果尝试滚动,我想隐藏“div”。它会是什么样子? (对不起,我不明白我会使用什么条件语句,所以看一个真实的例子会有所帮助) document.getElementById("div").style.display = "none"; 这将隐藏 div。如果您想在滚动时执行此操作,可以将其放入 preventScroll 函数,该函数在我的最后评论中由 document.onscroll 在滚动时触发。 @ChrisFrank 谢谢。但是,如果我在 on scroll 函数周围执行“if var == true”语句,并在条件内将变量更改为 false,则函数将继续循环。这是为什么?如果变量更改为false,我想停止循环。这是一个 js 小提琴 - jsfiddle.net/beliy333/rnd8gun4 解决方案:将条件放在'document.onscroll'中。所以一起:document.onscroll = function() if( scrolled == false) blogHeaderMagic() 【参考方案1】:

感谢@ChrisFrank 的提示。您可以在滚动尝试时触发该功能并像这样禁用滚动:

document.onscroll = function() 
    if( scrolled == false)
        yourCustomFunction();
    

在我的自定义函数中,我禁用滚动(我得到了这个函数here),做我的动画并将变量更改为 true:

function blogHeaderMagic() 
     //to re-position scroll to 0 (in my case this was useful)
     $('body,html').animate(scrollTop: 0 , 1);

     //disable scroll function
     disableScroll()

     //my animation and on a callback you'll see I call allowScroll function to allow scroll normally once animation completes
     TweenMax.to("#post-hero-media-wrapper", 1, height:54, opacity: .4, width: mainWidth, ease: Power3. easeInOut, y: 0, onComplete: allowScroll );
     scrolled = true

【讨论】:

以上是关于阻止所有滚动,直到函数触发的主要内容,如果未能解决你的问题,请参考以下文章

事件冒泡与事件代理

阻止 iCarousel 标签滚动

阻止 Spring Boot 应用程序关闭,直到所有当前请求都完成

jQuery Event.stopImmediatePropagation() 函数详解

阻止UIScrollView中的UISlider触发滚动

单击触发 JavaScript 的链接时,如何阻止网页滚动到顶部?