所以我在jquery文件中实现了这个,以检测某个div
部分是否在viewport
中。
jQuery.fn.isInViewport = function($) {
var elementTop = jQuery(this).offset().top;
var elementBottom = elementTop + jQuery(this).outerHeight() / 2;
var viewportTop = jQuery(window).scrollTop();
var viewportHalf = viewportTop + jQuery(window).height() / 2;
return elementBottom > viewportTop && elementTop < viewportHalf;
};
jQuery(window).on('load resize scroll', function($) {
jQuery('.snappy').each(function() {
var snapID = jQuery(this).attr('id');
if (jQuery(this).isInViewport()) {
jQuery('.sidenavitem').find("."+snapID).addClass("active");
jQuery(this).addClass("in-view");
} else {
jQuery('.sidenavitem').find("."+snapID).removeClass("active");
jQuery(this).removeClass("in-view");
}
});
});
就其本身而言,.on('load resize scroll')
函数可以工作,并且活动类可以被添加和删除,但是当我添加这个CSS样式时,scroll函数停止工作,并且只在第一个上工作,因为有load
属性
#main {
overflow-y: scroll;
height: 100vh;
scroll-snap-type: y proximity;
}
.snappy {
scroll-snap-align: start;
scroll-snap-stop: always;
height: 100vh;
}
我不确定这是我的CSS还是我的jQuery。
任何帮助将不胜感激。
这里是一个链接到我已经实现了这一点:https://dev.staging.idgadvertising.com/genesistint/
1条答案
按热度按时间efzxgjgh1#
简而言之,问题似乎与
#main
元素的CSS属性有关。max-height: 100vh
似乎不能很好地与overflow-y: scroll
配合使用。通过设置
max-height: 100vh
,您基本上可以说#main
元素只能与视口高度一样高。然后通过设置overflow-y: scroll
,您可以显式指示浏览器始终显示垂直滚动条,无论内容是否溢出。这会导致冲突,导致当用户滚动
window
时,jQuery(window).on('load resize scroll', function($)
不会触发回调函数。因此,正确的CSS可能是:
或者(我认为这个更好):
你不需要
overflow-y: scroll;
,因为页面看起来总是比viewport高,所以窗口的滚动条总是自动显示的。DIY调试指南:
首先,我会优化JS代码,以便更好地调试。创建一个名为
handleSideNav
的单独函数,用于处理侧边导航。之后,你可以在窗口加载时应用该函数,然后在有人滚动或调整窗口大小时应用相同的函数。注意
console.log('Triggered event:', event);
行,这是用于调试的--现在你可以看到哪个事件被触发了,如果有任何事件被触发的话。完成测试后删除此行。现在你可以刷新和滚动页面,看看是否有任何事件被触发。使用原始CSS,您可以在浏览器控制台中看到,当您滚动页面时,
scroll
事件不会触发。这表明即使你正在滚动,浏览器也不会将其注册为window
滚动,因此问题可能与你的CSS有关。