【发布时间】:2017-10-12 14:43:16
【问题描述】:
我创建了一个负责反转滚动方向的简单函数,但该功能似乎是 cpu 沉重的,这导致了移动设备上的延迟 - 我的假设。
起初,我以为它必须是这样,我无法优化它,直到我发现具有类似功能但完全没有延迟的网站。我在这个问题中发现了这一点:Modify scroll direction
这是问题中网站的链接:http://buero-buero.org/
显然他们正在使用这个:
<script>
function crisscross() {
$('down-left').style.bottom = '-' + window.scrollY + 'px';
$('down-right').style.bottom = '-' + window.scrollY + 'px';
$('left').style.left = '-' + window.scrollY + 'px';
$('right').style.right = '-' + window.scrollY + 'px';
}
</script>
这是我手机上的样子:
正如您所见,它非常流畅,尽管我已将 fps 降低到适合 gif 的 2MB 限制。
我的函数是这样的:
$(".wrap-work-right").css("bottom", window.scrollY * -1);
在这两种情况下,滚动方向都是通过更改 bottom 值来控制的 - 不仅是让我们关注 bottom。
这是我的功能在我的手机上的样子:
左侧工作正常,因为它不使用任何 js。我应用函数的右侧,显然跟不上计算window.scrollY * -1。
它可能会改变,因为我一直在测试不同的选项,但这里是我网站的链接(测试版):http://mateuszkusz.com/ — 我仍在努力。由于我是初学者,我不能保证它适用于所有浏览器。
为什么我的反向滚动方向版本这么慢?我试图用 mp4 和 png 文件替换 gif。我还试图操纵translateY 而不是bottom:
var shiftValue = $(window).scrollTop() * 1 + 'px';
$('.wrap-work-right').css('transform', 'translateY(' + shiftValue + ')');
除此之外,我还清除了我的 js 文件,只留下一个函数来查看 CPU 使用率是否较低,但不幸的是,延迟仍然是一个问题。也许问题出在服务器端?我正在使用可以托管。或者我的图片结构太复杂了?
我正在尝试修复此问题 2 天,但我没有想法,因此我将不胜感激任何提示。
编辑: 作为实验,我删除了 js 文件和索引之间的连接。我决定测试纯 JavaScript:
<script>
window.onscroll = function() {
document.getElementsByClassName("wrap-work-right")[0].style.bottom = '-' + window.scrollY + 'px';
}
</script>
似乎效果更好,但只有当 gif 不在视野范围内时。我将不得不做更多的测试。
编辑:这是我的反向滚动功能的jsfiddle(简化版):
$(window).on("scroll resize", function(){
$(".right").css("bottom", window.scrollY * -1);
});
* {
margin: 0;
padding: 0;
}
body {
height: 100%;
width: 100%;
}
.break-off {
position: relative;
float: left;
width: 100%;
}
.break-screen {
height: calc(100vh - 48px);
}
.break-shot {
height: 16px;
}
.wrapp {
position: fixed;
width: calc(100% - 48px);
left: 24px;
top: 0px;
height: 100vh;
}
.absolute {
position: absolute;
}
.left {
position: absolute;
top: 0px;
width: calc(50% - 8px);
left: 0px;
}
.right {
position: absolute;
bottom: 0px;
width: calc(50% - 8px);
right: 0px;
}
.shot {
float: left;
position: relative;
width: 100%;
height: 400px;
background-color: #000;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="wrapp absolute">
<div class="left">
<div class="break-off break-screen"></div>
<div class="shot"></div>
<div class="break-off break-shot"></div>
<div class="shot"></div>
<div class="break-off break-screen"></div>
</div>
</div>
<div class="wrapp">
<div class="right">
<div class="shot"></div>
<div class="break-off break-shot"></div>
<div class="shot"></div>
<div class="break-off break-screen"></div>
</div>
</div>
过去我只有一个位置固定的包装器。我使用 jquery 来获取左侧容器的高度,然后将其应用到主体以能够滚动,但在这种情况下,我的左侧和右侧同时滞后。
【问题讨论】:
-
您能在jsfiddle.net 上创建一个最小示例吗?另外,我会尝试的第一件事是将 js 与其他站点相同,看看是否能解决它
-
我可以,但请告诉我,我应该在这个例子中包含什么?我已经提供了滚动功能的代码并使用实时版本链接到我的网站,所以我不确定我应该在 jsfiddle.net 中展示什么。编辑:我不确定如何在我的项目中实现这个 js。我试图这样做,但它根本没有用。 :(
-
就像你已经完成的那样使用原生 js。在我看来它很流畅,你在手机上尝试过你的新 js 吗?
-
我在反向滚动中添加了 jsfiddle。是的,我确实尝试过这个。它看起来更流畅,但只有当 gif 不在视图中时,才会出现在页面底部。当我向上滚动时,滞后又回来了。 Gif 应该不是问题,因为在 buero 网站上存在 gif 并且它工作得很好。我开始想,也许我用了太多的儿童来在图片上创建悬停效果?我会测试它。昨天我以为我的手机只是延迟了,但是当我让我的兄弟查看我的网站时,延迟也在那里。 :(
-
如果只用文本替换 gif 会怎样?光滑吗?只需测试一下,您就可以确定原因