当前位置: 首页 > 面试题库 >

当内部元素滚动位置到达顶部/底部时,防止父元素滚动?

阳昊
2023-03-14
问题内容

我有一个“浮动工具箱”-的div position:fixed; overflow:auto。效果很好。

但是,当在该框内滚动(使用鼠标滚轮)并到达底部或顶部时,父元素将“接管”“滚动请求”:工具箱后面的文档将滚动。
-这很烦人,而不是用户的“要求”。

我正在使用jQuery,并认为可以使用event.stoppropagation()停止此行为:
$("#toolBox").scroll( function(event){ event.stoppropagation() });

它确实输入了该函数,但是仍然会发生传播(文档滚动) 很难在SO(和Google)上搜索此主题,所以我不得不问:
如何防止滚动事件的传播/冒泡?

$(".ToolPage").bind('mousewheel', function(e, d)  
    var t = $(this);
    if (d > 0 && t.scrollTop() === 0) {
        e.preventDefault();
    }
    else {
        if (d < 0 && (t.scrollTop() == t.get(0).scrollHeight - t.innerHeight())) {
            e.preventDefault();
        }
    }
});

问题答案:

添加此答案是出于完整性考虑,因为@amustill接受的答案不能正确解决Internet Explorer中的问题。此外,此解决方案不需要任何插件-仅需要jQuery。

本质上,代码通过处理mousewheel事件来工作。每个此类事件都包含一个wheelDelta等于要将px可滚动区域移动到的事件的数量。如果该值为>0,则我们正在滚动up。如果wheelDelta是,<0那么我们正在滚动down。

FireFox:FireFox DOMMouseScroll用作事件,并填充originalEvent.detail,其+/-内容与上述内容相反。通常返回间隔为3,而其他浏览器返回间隔为120(至少在我的机器上)滚动。要更正,我们只需检测它并乘以-40归一化即可。

如果a <div>的可滚动区域已经位于顶部或底部最大位置,则@amustill的答案通过取消事件来起作用。但是,如果Internet Explorerdelta大于剩余的可滚动空间,则Internet Explorer将忽略取消的事件。

换句话说,如果你有一个200px高大<div>含有500px的滚动内容,而目前scrollTop是400中,mousewheel它告诉浏览器事件滚动120px进一步将导致双方<div><body>滚动,因为400+ 120> 500

所以-要解决该问题,我们必须做一些稍微不同的事情,如下所示:

必需的jQuery代码是:

$(document).on('DOMMouseScroll mousewheel', '.Scrollable', function(ev) {
    var $this = $(this),
        scrollTop = this.scrollTop,
        scrollHeight = this.scrollHeight,
        height = $this.innerHeight(),
        delta = (ev.type == 'DOMMouseScroll' ?
            ev.originalEvent.detail * -40 :
            ev.originalEvent.wheelDelta),
        up = delta > 0;

    var prevent = function() {
        ev.stopPropagation();
        ev.preventDefault();
        ev.returnValue = false;
        return false;
    }

    if (!up && -delta > scrollHeight - height - scrollTop) {
        // Scrolling down, but this will take us past the bottom.
        $this.scrollTop(scrollHeight);
        return prevent();
    } else if (up && delta > scrollTop) {
        // Scrolling up, but this will take us past the top.
        $this.scrollTop(0);
        return prevent();
    }
});

本质上,该代码可以取消任何滚动事件这将创建不希望的边缘条件,则用了jQuery设置scrollTop<div>到最大值或最小值,这取决于哪个方向mousewheel事件请求。

由于事件在两种情况下都被完全取消,因此它根本不会传播到body任何地方,因此可以解决IE以及所有其他浏览器中的问题。



 类似资料:
  • 我使用JQuery在向下滚动时隐藏一个元素,并在向上滚动到屏幕顶部时显示它。我遇到的问题是,每当我滚动到窗口顶部时,显示的元素会立即再次隐藏。 我记录了滚动位置,当它滚动到顶部时,它看起来肯定保持在0,所以不太清楚为什么会发生这种情况。我甚至尝试使用大于0的数字,例如10,但同样的情况仍然发生。任何帮助都将不胜感激。 编辑:我根据要求添加了一些简单的html标记,其设置与我的实际代码几乎相同;

  • 我正忙着建立一个页面,在那里,比赛的计分室将能够看到现场结果,因为评委们会为每个参赛作品打分。 除此之外(每10秒检查一次更新),还有一个功能可以检查舞台上的当前条目(用绿色标记),这将滚动计分室的块,以始终在页面顶部显示当前条目。 然而,这创造了一个无休止的循环上下滚动的整个时间。 初始滚动工作正常,但由于当前项的位置已更改,jQuery再次向下滚动,使该项现在处于新的偏移量。 我的代码当前如下

  • 问题内容: 我有一个模态框窗口(弹出窗口),其中包含一个iframe, 并且在该 iframe中 有一个可滚动的 div 。 当我滚动iframe的内部DIV,并且达到其上限或下限时, 浏览器本身的窗口就会开始滚动。这是 不想要的行为 。 我已经尝试过类似的操作, 当鼠标进入弹出框区域时,该操作会在onMouseEnter时终止主窗口滚动: e.preventDefault()由于某些原因无法正常

  • 本文向大家介绍jquery滚动到顶部底部代码,包括了jquery滚动到顶部底部代码的使用技巧和注意事项,需要的朋友参考一下 HTML JS代码 以上所述就是本文的全部代码了,希望大家能够喜欢。

  • 问题内容: 引用首长html: 您可以将填充添加到内联元素的顶部和底部,但是该填充不会影响周围其他内嵌元素的间距,因此该填充将与其他内嵌元素重叠 a)据我所知,在行内元素的顶部和底部添加填充不会(曾经)对周围的元素产生任何影响,因此对页面外观没有影响? b)但是“ 填充将与其他内联元素重叠 ”到底是什么意思?它是否暗示在某些情况下填充(内联元素的顶部和底部)会影响页面的外观? 谢谢 问题答案: 如

  • 问题内容: 我在使用jquery和附加到锚元素的click事件时遇到问题。[1]:jQuery超链接- href值?“这个” SO问题似乎是重复的,并且可接受的答案似乎并不能解决问题。对不起,这是不好的礼节。 在我的.ready()函数中,我有: 我的锚点看起来像这样: 但是当单击链接时,将按需执行ajax功能,但是浏览器滚动到页面顶部。不好。 我尝试添加: 在调用执行ajax的函数之前,但这无济