3 回答

TA貢獻2039條經(jīng)驗 獲得超8個贊
本質(zhì)上,代碼通過處理mousewheel
事件。每個這樣的事件都包含一個wheelDelta
等于px
它將把可滾動區(qū)域移動到。如果此值是>0
,那我們就是在滾動up
..如果wheelDelta
是<0
然后我們就開始滾動down
.
火狐*Firefox使用DOMMouseScroll
作為事件,并填充originalEvent.detail
,他的+/-
與上面描述的相反。它通常返回3
,而其他瀏覽器則以120
(至少在我的機器上)。要糾正,我們只需檢測它并乘以-40
使之正?;?/p>
如果<div>
可滾動區(qū)域已經(jīng)位于頂部或底部的最大值位置。Internet資源管理器在以下情況下忽略已取消的事件:delta
大于剩余的可滾動空間。
換句話說,如果你有一個200px
高的<div>
含500px
可滾動內(nèi)容和當(dāng)前scrollTop
是400
..mousewheel
事件,它告訴瀏覽器滾動120px
進一步的結(jié)果將導(dǎo)致<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(); ????}});
本質(zhì)上,此代碼將取消創(chuàng)建不需要的邊緣條件的任何滾動事件,然后使用jQuery設(shè)置scrollTop
.的.<div>
值的最大值或最小值,取決于mousewheel
事件是請求的。
由于事件在任何一種情況下都完全被取消,因此它永遠不會傳播到body
因此,它解決了IE以及所有其他瀏覽器中的問題。

TA貢獻1993條經(jīng)驗 獲得超6個贊
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);}
添加回答
舉報