【问题标题】:Unable to stop the scrolling of the outer div when end of inner div has reached到达内部 div 的末尾时无法停止外部 div 的滚动
【发布时间】:2013-09-03 00:56:31
【问题描述】:

用例: - 如果用户正在滚动内部 div,一旦内部 div 结束,它就不应滚动外部 div。

如果内部 div 已经到达末尾,则以下代码可以正常工作。即内部 div 到达末尾后触发 touchstart/touchmove 事件。

但是,如果我不解除触摸并继续滚动,并且在此过程中到达内部 div 的末尾,它就会开始滚动外部 div。

$('body').find('.scrollableDiv').on(
    {
      'touchstart' :  function(e) {
        touchStartEvent = e;
      },
      'touchmove' : function(e) {
        e.stopImmediatePropagation();
        $this = $(this);
        if ((e.originalEvent.touches[0].pageY > touchStartEvent.originalEvent.touches[0].pageY && this.scrollTop == 0) || 
            (e.originalEvent.touches[0].pageY < touchStartEvent.originalEvent.touches[0].pageY && this.scrollTop + this.offsetHeight >= this.scrollHeight)){
          e.preventDefault();
        }
      },  
  }); 

如何在到达内部 div 的末尾时立即停止滚动? 我正在尝试在 android 设备上的浏览器上实现这一点。有人可以在这方面帮助我吗?

注意:用户甚至应该能够滚动外部 div。

提前致谢。

【问题讨论】:

  • 这让我觉得是个坏主意。您正在尝试编写属于 Web 浏览器本身的代码,以便通过禁用用户可能想要的功能以与其他站点上的工作方式不一致的方式在您的站点上更改浏览器的用户界面.
  • 对不起,如果我没有把我的观点说清楚。实际上,我正在尝试提供一种功能,用户可以独立滚动两个 div,并且滚动内部 div 永远不应该滚动外部 div。考虑这样一种情况:用户在内部 div 中进行了快速滚动,这将导致页面在内部 div 到达末尾时立即滚动,然后用户必须再次向上滚动页面以使内部 div 变为可见看法。这不是一个糟糕的用户体验吗?
  • Mozilla 似乎同意你的看法,因为 Firefox 不在任何平台上执行此操作,无论是在桌面(使用滚轮)还是在移动设备(使用手指)上。苹果似乎不同意你的看法。我认为这可能是决定的归属,试图让它在不同的网站上以不同的方式工作本身就是糟糕的用户体验。

标签: html scroll touch touchmove


【解决方案1】:

恐怕我没有时间编写显式代码来解决这个问题,但我已经为您提供了一个概念性解决方案,它仍然可能对您有所帮助。

  1. 在 DOM 准备好时,用 position: relative 包装每个溢出:滚动元素。
  2. 在触摸开始时,对于每个带有overflow: scroll 的祖先,设置overflow: visibleposition: absolute,计算出高度和宽度并将它们应用为内联样式,并将top 设置为scrollTop 的负数——并设置包装器的overflowhidden:这意味着它将处于与最初相同的位置,但无法通过滚动移动。
  3. 在触摸结束时,删除在第 2 步中应用的样式。

我已经看到了警告:

  1. 如果您在溢出中使用相对或绝对定位进行布局:滚动元素(并且它们本身没有相对或绝对定位),这将影响您的布局。
  2. 如果任何滚动元素在 DOM 准备就绪后被包裹,您需要为每个元素应用一个包裹器。

……但绝对可行……

【讨论】:

    【解决方案2】:

    如果您使用的是 JQuery,我会使用使用 scrollTop() 的东西来检查用户是否已到达可滚动 div 的底部,如果是,可能会触发一个事件来取消他们的滚动?或者你可能想做的事情。

    类似的东西:

    $(document).ready(function(){
        $('.scrollableDiv').bind('scroll',scroll_check); 
    });
    
    function scroll_check(e){
        var elem = $(e.currentTarget);
        if (elem[0].scrollHeight - elem.scrollTop() == elem.outerHeight()){
          // set overflow-y hidden?
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多