移动端滑动问题(iPhone)

20
当我在移动端滑动我的网站时,第一个幻灯片有些问题,看起来像它向右滑动,然后回到另一个方向的几个像素(但只有第一个在新方向上的幻灯片有这个问题)。我认为更好的方法是在手机上进行测试:https://even-mind.com 我该如何解决它?希望你们能帮我!
目前,我唯一找到的是删除owl-carousel.js脚本,所以滑动变得平稳,但是走马灯当然不起作用,您可以在此处查看: https://dev.even-mind.com/Even-Mind
(在iPhone 5上测试)

请检查您的控制台错误。Uncaught TypeError: $ is not a function。您的网站在Chrome桌面上无法加载。 - s0rfi949
我在 Chrome 控制台上看不到任何错误。 - wander
啊,我禁用了我的广告拦截扩展程序,现在网站正在加载... - s0rfi949
1
我无法在你提供的链接中看到问题。此外,没有代码,所以即使我们能够在你提供的链接上看到问题,我们也看不到代码,那么你希望我们如何提供解决方案呢? - Ruben Pirotte
右键单击>源代码。我认为这个问题只出现在iPhone上。以防万一有人遇到了同样的问题。 - wander
4个回答

5

通过查看DOM元素检查器,您可以发现在向下滚动时,标题的位置从absolute更改为fixed,也许这就是导致问题的原因。

这是滚动前的标题:

<div id="header" class="header">

滚动之后:

<div id="header" class="header header-fixed header-prepare">

尝试更改HTML并从开头将标题的位置设置为fixed
<div id="header" class="header header-fixed">

我也认为这可能是问题所在,但即使我从HTML中删除标题,问题仍然存在... - wander

2

当我到达"WE ARE"幻灯片时,我看到了卡顿/滞后的滚动。

可能是由于淡入文本的动画从那里开始,导致了这种卡顿。我的建议是:

1- 将所有的<link><script>标签移动到HTML底部,在</body>之后加载链接和脚本,让浏览器先加载HTML元素再加载链接和脚本。

2- 考虑删除任何不必要的动画、脚本、链接等等。 例如,我没有看到这些fadeIn动画在所有文本中的意义。如果你只是为了让网站看起来花哨而存在,那么没有问题,但我建议只对用户体验性能使用动画。 示例: 在您想让用户看到的特定元素上使用fadeIn或任何类型的动画。动画可以让眼睛集中注意力,用户会立刻看到动画并关注信息。

3- 像往常一样,压缩您的脚本、CSS 和图像。

4- 使用 G-zip

5- 使用 GTmetrix.com 查看您的网站中的所有问题

我将更仔细地查看您的代码,并查看是否有任何代码问题。

编辑:

看这里: https://developers.google.com/speed/pagespeed/insights/?url=https%3A%2F%2Feven-mind.com%2F&tab=mobile

和这里: https://gtmetrix.com/reports/even-mind.com/uVHRlGCl

注意: 您的网站大小为3.04MB,请考虑执行上述说明+链接说明!


你好,感谢你的回答。CSS和JS已经被压缩了。我们尝试删除所有动画的animate CSS,但没有改变任何东西。底部链接同理。唯一起作用的是删除owl.carousel.js(结果在此处:https://dev.even-mind.com/Even-Mind/),这样滑动就很平滑,但轮播功能当然无法使用...我认为这可能与其他脚本有冲突或类似的问题。但如何解决? - wander
嗯,当然,问题不在于旋转木马,因为我在“我们是”处看到了小的延迟,所以这是在“关于”部分。所以试试这个:暂时删除animate.css,将carousel.js放回并将其置于其他链接的顶部,令人讨厌的是,即使链接也必须定位在其正确的位置才能完美地工作。继续尝试定位,而我会继续挖掘您的代码,找到问题的确切位置。但是当我在手机上刷新网站时,它没有像以前那样出现延迟。但我仍然看到滚动中的0.5毫秒延迟。 - Abdulrahman Mushref

1
可能是移动浏览器在处理滚动事件时出现了一些问题。尝试使用防抖函数来限制滚动计算的次数,使动画更加流畅,可能可以解决滚动问题。
防抖函数限制函数被调用的次数。非常适用于滚动事件等。
一个基本示例(来自David Walsh的博客):https://davidwalsh.name/javascript-debounce-function
 function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};

您可以在您的网站上直接使用它,如下所示:
var handyScrollFunction = debounce(function() {
    // put your scroll/parallax in here
}, 250);

window.addEventListener('scroll', handyScrollFunction);

你可以调整超时时间,以确保滚动仍然平滑。

谢谢,但我该如何在我的网站上使用它? - wander
added it to the answer - Jan_dh

0

从DevTools时间轴视图中可以看到,顶部有很多红色标记。这些表示帧速慢。从屏幕截图可以轻松地看出滚动本身存在一些问题。

再深入一点-有2个函数与scroll事件一起触发:

  1. 第一个是来自polyfill.js的函数调用,它将函数执行委托给requestAnimationFrame(这很好)
  2. 第二个是对jQuery的函数调用,立即执行函数。

Timeline view

你可以通过将函数2委托给requestAnimationFrame来提高滚动性能。最简单的形式如下:

$(window).scroll(function() {
  requestAnimationFrame(someFunctionUpdatingDOM);
})

另一件事是变量缓存。计算标题位置的函数每次调用时都要遍历DOM。由于DOM操作非常昂贵,如果不必要,最好避免它们。
var $header = $('.header'); // traverse DOM once, cache variable for later use in function

function someFunctionUpdatingDOM() {
  $header.addClass('something');
}

我注意到了另一件事情 - 在桌面视图中也存在滚动性能问题,这是由于背景图像的大量重绘引起的。这是由于脚本更改了background-position以实现视差效果。通常最好使用CSS变换,例如translate3d(),它们具有硬件加速功能。这样浏览器可以将层(图像)变换调度到GPU上,省略不必要的重绘,使页面滚动平稳。

祝你修复顺利!


谢谢分析,但问题仍然存在,目前唯一有效的解决方法就是删除 owl-carousel.js 脚本。这里有一个没有使用 owl-carousel 的版本,滑动非常流畅:https://dev.even-mind.com/Even-Mind/ - wander
尝试在滚动事件上使用防抖函数,以确保它不会触发得太频繁。 - Jan_dh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接