我想知道是否可能和如何将鼠标滚轮/滚动事件(用户滚动尝试)从header
转移到container
。
我有以下示例情况:
+------------+ +------------+|
| header | | header ||
+------------+ +------------+|
| || | ||
| || | ||
| container || | container ||
| || | ||
| || | ||
+------------+ +------------+|
situation 1 situation 2
情境2是可以滚动整个页面的“传统”设置。当光标悬停标题时(即使它可能已修复),滚动尝试将传递给body / html。由于容器溢出body / html,如果用户旋转他/她的鼠标滚轮,容器将移动/滚动。由于标题是固定的,它将保持在同一位置。
情况1是我的测试设置。容器的内容溢出容器,这将导致容器显示滚动条。现在我希望容器在用户的光标悬停在标题上并且用户旋转他/她的滚轮时也会滚动。
我创建了另一个fiddle来显示我的进展,这可能是解决方案,但我无法让它发挥作用。这可能会激励其他人获得实际的解决方案:)
我收到错误:(index):69 Uncaught InvalidStateError: Failed to execute 'dispatchEvent' on 'EventTarget': The event is already being dispatched.
(现在它只是chrome中的滚动事件)
This最接近我预期的解决方案,该解决方案基于“其他解决方案2”。感谢Maksym Stepanenko的研究,它似乎还不可能。我暂时没有回答这个问题,以防有人找到方法:)
这些问题讨论了这个问题,但没有像我希望的那样为这种设置提供解决方案:
答案 0 :(得分:2)
我最终也需要这个功能。
如果您正在收听“wheel”事件,则可以获得有关滚动的“delta”信息。然后,您只需将delta应用于目标div。
document.addEventListener('DOMContentLoaded', function() {
const target = document.querySelector('#container');
// listen on the whole document; you could restrict this to an element though
document.addEventListener('wheel', function(event) {
target.scrollTop += event.deltaY;
});
});
我没有在手机上测试过这个,但我怀疑它不适用于那里。
答案 1 :(得分:1)
经过几个小时的研究,这是我能找到的。
答案 2 :(得分:0)
如果您试图在iframe中捕获mousewheel事件并将其发送给父级,这就是我的工作方式。
在iframe中加载的页面中,我放置了一个带有ID =“ everything”的DIV,该DIV包围了页面的整个主体
然后,在iframe中加载的页面底部插入此脚本。
document.getElementById("everything").addEventListener("mousewheel", function (e) {
parent.scrollme(e.deltaY);
});
然后在父母中,我不得不在顶部附近插入此脚本
function scrollme( i ){
window.scrollTo(window.scrollX, window.scrollY + i);
}
这会将车轮滚动捕获到iframe中,并将事件推送给父级。