qTip2锚定页面底部滚动时定位延迟问题及解决方案咨询
解决qTip2在Firefox Quantum中滚动定位延迟的问题
这个问题我之前也碰到过,核心原因就是Firefox Quantum的异步滚动机制和qTip2老旧的滚动同步定位逻辑不兼容——旧版Firefox是同步处理滚动事件的,qTip能实时更新位置,但Quantum为了性能改用了异步滚动,导致qTip的定位更新跟不上滚动节奏,就出现了延迟和那个警告。
下面给你几个可行的解决方案,按推荐程度排序:
方案1:禁用滚动跟踪,改用固定定位(最简便)
看你的代码里提示框是绑定到$(window),本来就是要固定在左下角,那完全可以禁用qTip的滚动自动调整功能,让它固定在视口位置:
function qTipHint(titleTxt, contentTxt, anchorElement, timeOut, topCenter) { if (anchorElement.length > 0) { var locationMy = ''; var locationAt = ''; if (topCenter) { locationMy = 'top center'; locationAt = 'bottom center'; } else { locationMy = 'bottom left'; locationAt = 'bottom left'; } var test = anchorElement.qtip( { content: { text: contentTxt, title: titleTxt }, show: { effect: function() { $(this).slideDown(); } }, hide: { event: '', effect: function() { $(this).slideUp(); } }, style: { classes: 'qtip-jtools', tip: false }, position: { my: locationMy, at: locationAt, target: anchorElement, viewport: $(window), adjust: { scroll: false, // 关键:关掉滚动时的位置调整 resize: true // 保留窗口大小变化时的自适应 } } }); var api = test.qtip('api'); api.show(); delay(timeOut).then(function() { api.destroy(); }); } }
这样修改后,提示框会固定在左下角,滚动时不会再尝试更新位置,延迟和警告都会消失。
方案2:用requestAnimationFrame优化滚动定位(保留滚动跟踪)
如果你之后需要给其他滚动元素绑定提示框,必须保留滚动跟踪的话,可以重写qTip的滚动监听逻辑,用浏览器的requestAnimationFrame来同步定位更新,让它和渲染帧对齐:
$('#mybutton').click(function() { qTipHint('Title', 'Some hint text', $(window), 10000, false); // 获取qTip实例 var api = $(window).qtip('api'); // 移除qTip默认的滚动监听 $(window).off('scroll.qtip'); // 用requestAnimationFrame重新绑定 $(window).on('scroll.qtip', function() { requestAnimationFrame(function() { api.reposition(); // 在下一渲染帧更新位置 }); }); })
这个方法能大幅减少定位延迟,同时消除那个滚动链接定位的警告。
方案3:替换为现代提示库(长期解决方案)
qTip2已经快10年没更新了,对现代浏览器的支持确实跟不上了。如果项目允许的话,建议换成更活跃的现代库,比如Tippy.js或者Popper.js,它们原生就支持异步滚动的优化,代码也更简洁。
比如用Tippy.js实现你的需求:
// 先引入Tippy.js的脚本和样式(项目里自行引入) $('#mybutton').click(function() { // 创建提示框 const instance = tippy(window, { content: `<strong>${'Title'}</strong><br>${'Some hint text'}`, placement: 'bottom-start', // 对应左下角位置 showOnCreate: true, trigger: 'manual', theme: 'light', duration: [300, 300], onHidden: () => instance.destroy() }); // 10秒后自动销毁 setTimeout(() => instance.hide(), 10000); });
验证效果
不管用哪个方案,修改后在Firefox Quantum里测试,点击按钮滚动页面,应该都不会再出现定位延迟,控制台的警告也会消失。
内容的提问来源于stack exchange,提问作者AMarch
相关产品推荐
相关产品推荐

