javascript - 如何检查多 div 滚动到顶部?
问题描述
我的页面上有多个具有不同类的 div 我
如何检查哪个 div 滚动到顶部并因此做一些事情。
<div class="menu-session-0">
content
</div>
<div class="menu-session-1">
content
</div>
<div class="menu-session-2">
content
</div>
我已经试过了:
$(window).scroll(function() {
setTimeout(function(){
var hT = $('.session-index_1').offset().top,
hH = $('.session-index_1').outerHeight(),
wH = $(window).height(),
wS = $(this).scrollTop() + 175;
if(hT <= (wS + 250)){
$('.menu-item').removeClass('menu-item_active');
$('.item-index-1').addClass('menu-item_active');
mySwiper.slideTo(1);
mySwiper.update();
}
},1050);
});
但它并没有像我预期的那样工作......
解决方案
好的..我现在明白了,我想.. :P
如果您复制和粘贴而不是您的代码,这应该(理论上)工作得很好。
如果您真的想使用 JQuery,只需替换元素引用 getter 和类编写器
const menuItems = document.getElementsByClassName('menu-item');
const menuSessions = document.getElementsByClassName('menu-session');
var nextSession, activeSession;
// do this to get menu-session offsets.. rerun function on viewport resize
function getSessionOffset() {
for( let session of menuSessions ) {
// store position and dataset.index directy on the element reference
session.y = session.offsetTop;
session.indx = session.dataset.index;
}
// define active elements which position we listen for
// these are correct if the window scroll offset is 0 (or at the top)
activeSession = menuSessions[0];
nextSession = menuSessions[1];
onScroll(window.pageYOffset); // so we check and set the correct active elements
}
getSessionOffset();
// page scroll listener
window.addEventListener( 'scroll' , ScrollHandler );
var lastScrollPos = 0; // last recorded window scroll offset
var scrollTick = false; // the tick is used to throttle code execution
function ScrollHandler (ev) {
lastScrollPos = ev.target.scrollTop;
if (!scrollTick) {
window.requestAnimationFrame(() => { // <- read up on this if you are not familiar. Very usefull
onScroll(lastScrollPos);
scrollTick = false;
});
scrollTick = true;
}
}
function onScroll(scrollY) {
if (scrollY > nextSession.y) { // if lower offset is less than scrollPos
removeActiveClass(activeSession.indx); // we remove the active class from menu item
activeSession = menuSessions[nextSession.indx]; // define new elements to listen for
nextSession = menuSessions[nextSession.indx + 1];
addActiveClass(activeSession.indx); // and add an active class to the new menu item
} else if (scrollY < activeSession.y) { // do the same here only in reverse
removeActiveClass(activeSession.indx);
nextSession = menuSessions[activeSession.indx];
activeSession = menuSessions[nextSession.indx - 1];
addActiveClass(activeSession.indx);
}
}
function removeActiveClass(indx) {
menuItems[indx].classList.remove('menu-item_active');
}
function addActiveClass(indx) {
menuItems[indx].classList.add('menu-item_active');
}
我们只监听当前值和下一个值。这可能看起来很多,但可以缩短到三分之一的大小。
希望这可以帮助 :)
推荐阅读
- javascript - 帧之间的通信
- xslt-1.0 - XSLT - 选择具有相同属性的连续元素,但稍后忽略相同的元素/相同的属性
- python - How to add rows with identical items in different columns in Pandas together
- javascript - 我可以将变量作为函数的参数吗?javascript
- c - 取消引用 char 指针返回 int ?为什么?
- javascript - 通过属性名称重新创建对象数组的最有效方法是什么?
- php - 使用 Kohana 的旧系统标题标签的问题
- javascript - Redux Toolkit 不适用于 WebStorm
- node.js - 自动退出 - NodeJS https 网络服务器
- python - 如何在特定条件下将特定函数应用于 DataFrame 列值