发送事件是同步处理的,因此在
allScroll
不会做任何事,因为
allScroll
对象)在调度事件时没有事件侦听器。
试着搬家
allScroll.dispatchEvent(new Event('scroll'));
到代码的底部。
使现代化
:
首先是同步顶部短语、徽标和底部短语的垂直滚动偏移的示例:
"use strict";
let synchedElements = [
document.getElementById("top-phrase"),
document.getElementById("logo"),
document.getElementById("bottom-phrase")
];
function syncScroll( event) {
let target = event.target;
synchedElements.forEach( function ( element) {
if( element != target) {
element.scrollTop = target.scrollTop;
}
});
}
synchedElements.forEach( function( element) {
element.addEventListener("scroll", syncScroll, false);
});
function scrollAll( scrollTop) {
syncScroll( {target: {scrollTop}});
}
#top-phrase, #logo, #bottom-phrase {
border: thin solid grey; /* testing */
max-height: 3em;
overflow-x: hidden;
overflow-y: scroll;
}
<section id="scroll-landing">
<div id="scroll-display">
<div id="we">Lorem</div>
<div id="top-phrase">
<ul id="top-phrase-scroll">
<li>Lorem</li>
<li>Lorem lorem lrem</li>
<li>Lorem lorem lrem</li>
</ul>
</div>
<div id="logo">
<div id="logo-display">
Lorem lorem lrem
</div>
</div>
<div id="bottom-phrase">
<ul id="bottom-phrase-scroll">
<li>Lorem lorem lrem</li>
<li></li>
<li class="hc">Lorem lorem lrem</li>
<li class="sd">Lorem lorem lrem</li>
<li class="ed">Lorem lorem lrem</li>
<li class="dt">Lorem lorem lrem</li>
</ul>
</div>
<div id="design"></div>
<div id="pop-out"></div>
</div>
</section>
<hr>
<button type="button" onclick="scrollAll(0)">scrollAll(0)</button>
<button type="button" onclick="scrollAll(30)">scrollAll(30)</button>
写下这段话后,有些事情变得更清楚了:
-
scroll事件是一个通知事件,它不传递元素的滚动程度。
-
滚动事件不会将DOM从一个元素冒泡到另一个元素,滚动文档除外
body
元素确实会起泡到
window
.
-
如果所有元素最初都有
scrollTop
值为零,将滚动事件发送到
allScroll
在发布的代码中,在初始状态下不会执行任何操作。
-
滚动事件的调度速度很快,处理每一个事件都会降低显示更新的速度。请在Stack Overflow和web上搜索限制已处理事件数量的潜在方法。
上面的代码是为了看到同步滚动的效果,并提供给大家以供参考,希望它能有所帮助——它可能不会(也可能不会)实现您的所有需求。