3 回答
TA贡献2039条经验 获得超7个赞
本质上,代码通过处理mousewheel
事件。每个这样的事件都包含一个wheelDelta
等于px
它将把可滚动区域移动到。如果此值是>0
,那我们就是在滚动up
..如果wheelDelta
是<0
然后我们就开始滚动down
.
火狐*Firefox使用DOMMouseScroll
作为事件,并填充originalEvent.detail
,他的+/-
与上面描述的相反。它通常返回3
,而其他浏览器则以120
(至少在我的机器上)。要纠正,我们只需检测它并乘以-40
使之正常化。
如果<div>
可滚动区域已经位于顶部或底部的最大值位置。Internet资源管理器在以下情况下忽略已取消的事件:delta
大于剩余的可滚动空间。
换句话说,如果你有一个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以及所有其他浏览器中的问题。
TA贡献1993条经验 获得超5个赞
function preventDefault(e) { e = e || window.event; if (e.preventDefault) e.preventDefault(); e.returnValue = false; }document.getElementById('a').onmousewheel = function(e) { document.getElementById('a').scrollTop -= e. wheelDeltaY; preventDefault(e);}
添加回答
举报