- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
更新:类似的问题有一个很好的答案,展示了如何以有用的方式将 requestAnimationFrame 与滚动一起使用: scroll events: requestAnimationFrame VS requestIdleCallback VS passive event listeners
假设我想在我的网站上添加一些由滚动触发的昂贵操作。例如,我在我的 jsfiddle 中使用了视差效果。
现在我一直在读它一定不能直接绑定(bind)到事件上,有时后面跟着一些旨在更好的片段。举几个例子:
他们说的基本上是不要这样做:
// Bad guy 1
$(window).scroll( function() {
animate(ex1);
});
或者这个
// Bad guy 2
window.addEventListener('scroll', onScroll, false);
function onScroll() {
animate(ex2);
}
但是使用超时、间隔、requestAnimationFrame 等等,例如:
// Good guy
$(window).scroll( function() {
scrolling1 = true;
});
setInterval( function() {
if (scrolling1) {
scrolling1 = false;
animate(ex3);
}
}, 50 );
因此,我将在上面的链接中找到的选项添加到一个 jsfiddle,该 jsfiddle 试图通过为每种方法添加一个计数器来比较它们,如下所示:
// Test
$(window).scroll( function() {
counter = counter + 1;
// output result of counter
animate(ex1);
});
最好检查完整jsfiddle
结果:一切顺利的原因在于计算次数大致相同。如果我能忍受波涛汹涌的影响,也许我可以保护一些资源。与我阅读的所有内容相反,这对我来说似乎合乎逻辑!
第一个问题:我错过了什么或者这是一个有效的测试吗?如果它无效,我怎么能正确测试?编辑:澄清一下,我想测试以上任何方法是否完全节省性能。
第二个问题:如果有效,为什么每个人都对 onscroll 感到紧张?如果流体动画需要在整个站点上进行 5000 次计算,那么无论如何都无法更改它吗?
(好吧,有时我会使用检查来确定一个对象是否在视口(viewport)中,但老实说,我什至不知道这些检查是否没有被阻止的代码本身那么昂贵,尤其是当它们涉及五个不同的偏移量、windowHeight、scrolltTop、getBoundingClientRect 和 outerHeight 等变量...)
最佳答案
所以,@SirPeople 已经正确回答了你的第一个问题,它确实是一个很好的测试来查看 animate 函数被调用的频率,但是比较不同代码片段的性能是一个糟糕的测试。
这是执行的性能记录:
函数 animate
一点也不昂贵。我拍摄了一个性能记录(下一张图片),它显示在我查看的一次迭代中它花费了 0.64 毫秒到 1.29 毫秒(第 1-5 点)。而且一旦功能完成,重绘根本不需要时间(第 6 点),这可能是因为页面几乎没有内容。当我们查看时间时,我们可以看到所有五个动画函数和重绘都在不到 10 毫秒的时间内完成,这在正常情况下意味着我们可以获得流畅的 60fps 动画(第 7 点)。
此外,如果我们想要比较 onscroll 事件监听器,我们需要单独测试每个监听器并比较结果。如果其中一个监听器真的被阻止,它将对整个页面产生影响,并且如果不进行性能调试,您将不知道它是哪个。
我制作了两个 jsfiddle window.scroll和 RAF .而且,令我惊讶的是,似乎没有任何区别。
人们为什么关心这个?
正如您在上面链接的 jsfiddles 中看到的那样,如果事件处理程序变得太大,整个页面将会滞后。
现在怎么办?
我自己不是性能大师,但是:
关于Javascript OnScroll 性能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51329892/
使用scrolltop,我使用if条件将滚动分为5部分。在第二部分中,我给出了scrolltop值从600到700px的视频。如果我再次滚动,视频会在该位置播放多次。但我希望视频必须如果我在该值内任意
我想做的就是在页面加载时触发一个函数。 似乎我的代码中有一个错误,但我无法弄清楚...我想我还是菜鸟... Hi, function myFunction () { docume
所以我有一个元素,我希望能够使用鼠标上的滚轮放大和缩小。我认为解决这个问题的一个好方法是这样的: JavaScript: var container = document.getElementById
我想在用户滚动网页时加载更多内容。我尝试使用 onScroll 事件 javascript 被多次调用 jQuery .scroll() 方法也被多次调用。 我该如何处理这个问题?是浏览器问题吗? 注
这是简化的 html: function handle() { console.log("fired"); };
我一直在研究 horizontal website本周并从这里的社区收到了很多建议和有用的代码(谢谢!)。 我的 JS 技能非常不稳定,但我正在更好地掌握它,我的 CodePen展示了我刚才所拥有的,
我使用此代码在滚动时获取页面中元素的偏移量,但滚动函数仅执行一次并提醒 viewportWidth,然后它停止在“off”变量处 这是原始脚本中的一个简单示例,它不仅仅是将 #menuIcon 设置为
// Schließen Button Hauptnavigation $('button#collapse-button').click(function () { $('n
我知道我只能调用一次window.onscroll = function(){},因为多次调用它可能会导致它们相互覆盖。这就是为什么我问:是否可以将函数调用“推送”到 window.onscroll?
实际上我见过一个网站,在滚动时自动加载新页面并将其附加到旧页面。 不仅是页面,URL 也会在滚动时发生变化。 我完全不知道如何实现这个。这是我看过的网站 matt 。这里只要向下滚动,就会有一个无限滚
我试图在屏幕上显示相应内容期间使菜单项显示为粗体,然后在该内容滚动过去后恢复正常。 我已经尝试了很多方法来做到这一点,但它似乎并没有奏效。我可以在适当的时候让它变粗,但是当我尝试添加属性让它恢复正常时
我有一个脚本,它在文档正文上运行 onmousemove 和 onscroll 的 addEventListener 以获取光标位置。 onmousemove 事件工作正常(客户端+滚动),但是当发生
是否可以检测用户何时在 facebook Canvas 应用程序上滚动(在 iframe 中)。因此,当用户在页面上向下滚动时,我可以执行操作。 最佳答案 您可以使用 jQuery API 并尝试他们
我有一个在滚动时收缩的横幅和它下面的一些内容,我怎样才能让内容在移动前在横幅上停留几秒钟?我尝试使用 jQuery 插件 stickem,但它似乎不起作用。 JS: $(document).scrol
我有一个 JavaScript 函数,它在窗口滚动到特定点时执行不同的条件语句。 (当窗口滚动到新的部分/行时或多或少地改变了我的导航链接的样式) // variables used var pLin
hi on scroll active class 未添加到li on click on a 工作正常请看一次。 $('nav a').on('click', function() {
我是 javascript 的新手,我试图在滚动 div id="container"时触发 div id="foo",以便在滚动 id“container”时说“IM AWESOME” .我什至给了
当用户滚动超过 25 像素时,我试图将 class 添加到 id。我不确定为什么,但我放学后该功能没有启动。任何关于为什么的帮助将不胜感激。这是我的代码: window.onscoll = funct
我需要显示水平 ListView 项目的无限滚动(意味着需要重复项目)例如 a,b,c,d,e,f,a,b,c,d,e,f,a,b,.... 粗体是屏幕上可见的项目 过程是在到达最后一个列表项后重复列
我想在发生滚动事件时实现onScroll。但是我不明白如何使用我通过 onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d
我是一名优秀的程序员,十分优秀!