javascript - Debounce 功能未检测到用户何时到达页面顶部,因为它设置为在前沿与后沿触发
问题描述
我有一个 javascript 函数可以更改滚动上的徽标。我正在使用 underscore.js 的 debounce 功能来防止滚动事件在用户滚动页面时连续触发。我已将 debounce 功能设置为立即触发(相对于滚动的后沿),以便徽标转换没有任何滞后时间(当前设置的等待时间为 2 秒)。问题是,如果用户向下滚动页面,然后向上滚动回顶部,则徽标永远不会转换回来,因为 debounce 函数在 scrollTop 达到 0 之前触发。在这种情况下,有什么建议可以让 debounce 函数触发吗?
如果我在滚动的后沿触发去抖动功能,则在加载徽标之前会有延迟时间(2 秒)。CSS 过渡不能解决这个问题,因为徽标被设置为背景图像。我希望有一个javascript解决方案而不是css hack(交叉淡入淡出悬停或其他东西。)我需要编写两个单独的函数吗?一个用于向下滚动,一个用于向上滚动?
function scrollHeader() {
var top_offset = $(window).scrollTop();
var logo = $('.site-title a')[0];
var siteHeader = $('.site-header');
if (top_offset == 0) {
siteHeader.removeClass('scrolled');
logo.setAttribute('style', 'background-image: url( "logo.svg" ) !important');
}
添加了 else if 条件以防止徽标在每个滚动事件上重新加载(否则 Chrome 会导致闪烁问题)
else if ( top_offset !== 0 && siteHeader.hasClass('scrolled')) {
console.log ('header has scrolled class and is not at top');
} else {
siteHeader.addClass('scrolled');
logo.setAttribute('style', 'background-image: url( "logo.svg" ) !important');
}
}
调用 debounce 函数(将其设置为 true 会立即触发函数而不是后沿):
$(window).on('scroll', _.debounce(scrollHeader, 200, true));
如果您想查看此问题的实际效果,请访问该网站的链接:http: //205.134.254.129/~kosedigital/
解决方案
推荐阅读
- apache - 当变量里面有斜杠时如何处理htaccess重写?
- javascript - javascript date.valueOf() 和 java date.getTime() 之间的区别
- c++ - string_view 到 const 引用字符串无效
- javascript - ASP Net Core3.1 AJAX 发送 NULL 到控制器
- flutter - Flutter BLoC 无法更新我的布尔值列表
- node.js - 如何在 Cpanel/Whm 上更改 nodejs CLI 版本
- python - 从 SQLite 数据库值返回多行
- postgresql - 索引和表大小问题
- r - 在 Shiny 中单击按钮后如何将输入保存到变量?
- javascript - 如何查看最新 Electron 版本使用的 Chromium 版本?