程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了动画滞后于移动版 chrome大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决动画滞后于移动版 chrome?

开发过程中遇到动画滞后于移动版 chrome的问题如何解决?下面主要结合日常开发的经验,给出你关于动画滞后于移动版 chrome的解决方法建议,希望对你解决动画滞后于移动版 chrome有所启发或帮助;

我正在尝试在我的网站上制作动画。我正在使用下面链接的 Jsfiddle 代码的类似版本。在桌面上查看时,动画效果很好。然而,当在移动设备上查看时,特别是在我的 Chrome 浏览器上,有一个奇怪的延迟。当我在手机上打开它时,Jsfiddle 显示完全相同的延迟。如果我重新启动 Chrome 应用程序,延迟会很快消失。

此问题在 Safari 中不会发生

我有最新的 iPhone,IOS 14.6 和 Chrome V90。

https://jsfiddle.net/brodriguez98/e2bvwcja/33/

HTML:

<HTML>
 <p style = 'margin-top: 100vh;'>above</p>
 
 <img class = 'balltest show-on-scroll standard-push' src = 'http://www.pngall.com/wp-content/uploads/5/Sports-Ball-transparent.png'/>
 
 <img class = 'balltest show-on-scroll fade-in' src = 'http://www.pngall.com/wp-content/uploads/5/Sports-Ball-transparent.png'/>
  
 <p style = 'margin-bottom: 100vh'>below</p>
</HTML>

CSS:

.balltest {
    wIDth: 50px;
}

.fade-in {
    opacity: 0;
    -webkit-Transition: @R_502_4154@ 4s 0.25s cubic-bezIEr(0,1,0.3,1),opacity 1s 0.25s ease-out;
    -moz-Transition: @R_502_4154@ 4s 0.25s cubic-bezIEr(0,opacity 1s 0.25s ease-out;
    -o-Transition: @R_502_4154@ 4s 0.25s cubic-bezIEr(0,opacity 1s 0.25s ease-out;
    Transition: @R_502_4154@ 4s 0.25s cubic-bezIEr(0,opacity 0.3s 0.25s ease-out;
    will-change: @R_502_4154@,opacity;
}

.standard-push {
    opacity: 0;
    @R_502_4154@: translateY(4em);
    -webkit-Transition: @R_502_4154@ 4s 0.25s cubic-bezIEr(0,opacity 1s 0.25s ease-out,translateZ(0);
    -moz-Transition: @R_502_4154@ 4s 0.25s cubic-bezIEr(0,opacity;
}

.is-visible {
    @R_502_4154@: translateY(0);
    opacity: 1;
}

JavaScript:

var elementsToShow = document.querySELEctorAll('.show-on-scroll');
$(window).scroll(function() {
    Array.prototype.forEach.call(elementsToShow,function (element) {
        if (iSELER_774_11845@enTinVIEwport(element)) {
            element.classList.add('is-visible');
        } else {
            element.classList.remove('is-visible');
        }
    });
});


// Helper function from: http://stackoverflow.com/a/7557433/274826
function iSELER_774_11845@enTinVIEwport(el) {
    // special bonus for those using jquery
    if (typeof jquery === "function" && el instanceof jquery) {
        el = el[0];
    }
    var rect = el.getBoundingClIEntRect();
    return (
        (rect.top <= 0 &&
            rect.bottom >= 0) ||
        (rect.bottom >= (window.innerHeight || document.documentElement.clIEntHeight) &&
            rect.top <= (window.innerHeight || document.documentElement.clIEntHeight)) ||
        (rect.top >= 0 &&
            rect.bottom <= (window.innerHeight || document.documentElement.clIEntHeight))
    );
}

我为小屏幕道歉,无法在手机上全屏显示 Jsfiddle:

重新启动移动 Chrome 后动画正常工作: https://www.loom.com/share/ac6c843b90d2428bb875572d55e32959

动画很快中断(当我关闭/重新加载页面时): https://www.loom.com/share/e51cf88aa1a74aed8e4d1ed253e83ea0

这与我在使用移动 Chrome 浏览器的网站上看到的行为完全相同。

更新: 下面的答案都不适合我。我忘了提到这种行为也发生在文本中。另外,感谢您提出代码和框,我分叉了您的代码并通过删除图像使其更简单,但我仍然在我的 iphone Chrome 浏览器上得到相同的结果。我还尝试用 onload 函数包装所有内容,但也没有用。

现在我可以使用 Jquery 动画来解决这个问题,但我仍然希望 CSS3 过渡能够在我的网站上工作。

https://codesandbox.io/s/animation-test-forked-tqurn?file=/index.html

动画滞后于移动版 chrome

解决方法

这看起来像是加载页面时的“竞争条件”问题。 JS 在 IMG 请求完成之前运行。

要理解问题就需要理解加载顺序:

  1. 加载/重新加载时,服务器以文档 (*.html) 文件响应

  2. 浏览器开始解析响应 (*.html) 并对找到的每个资源发起新的请求:

    • CSS
    • JS
    • IMG
  3. 这些请求以不可预测的顺序完成。例如。大图像的加载时间可能比 *.css 文件长,...一些资源可能已经被浏览器缓存,根本不会启动请求,...

    如果对 *.js 文件的请求在 IMG 请求完成之前完成,则找不到该图像的渲染 height 和新添加的 CSS 类 {{1} } 无论如何都会启动 is-visible...

  4. 一旦 IMG 请求完成(img 被渲染)。为 IMG 触发 Content Reflow。 需要重新绘制的元素(IMG)上的持续过渡是“重置”,并从关键帧 0 开始。 这可以解释您的问题。


以下 3 个选项可能会解决您的问题:

A.保留图像的最终尺寸。

  • 在 CSS 中设置修复 transition 并在 html 中添加类:

    height
  • 您还可以添加 .myImg { width: 50px; height: 50px; } width 作为 html 属性。即使 *.css 仍在加载...

    height

B.为图像添加一些“加载检测”,并在图像完全加载之前防止转换。

  • 我们检查 img 是否已经加载: <img height="50" width="50" class="..." src="..."> 已设置并检测到 src-
  • 否则为该图像设置一个 height 事件(因为它尚未加载)
  • 可选:您可以对该图像使用延迟加载,并且仅“按需”加载图像(参见最后一个示例)。 img 的 onload 设置为 src 属性,并且 data-src 将在图像可用后由 JS 设置。

现在我们可以使用 src 函数排除 isLoaded(element) 中当前未完全加载的图像。

这里是jsFiddle,或者展开下面的例子...

.scroll()

var elementsToShow = document.querySELEctorAll('.show-on-scroll');
$(window).scroll(function() {
    Array.prototype.forEach.call(elementsToShow,function (element) {
        if (isLoaded(element) && iSELER_774_11845@enTinViewport(element)) {
            element.classList.add('is-visible');
        } else {
            element.classList.remove('is-visible');
        }
    });
});

[...elementsToShow].forEach((imgEl,i) => {
    if (
    imgEl.src &&
    imgEl.getBoundingClientRect().height
  ) {
    imgEl.dataset.isLoaded = true;
    console.log(`Img ${i} already loaded`);
  } else {
    console.log(`Img ${i} still loading... or should be lazyloaded`);

    imgEl.onload = function(E) {
      console.log(`Img ${i} finally loaded! onload event`);
        e.target.dataset.isLoaded = true;
        };

    if (imgEl.dataset.srC) {
      console.log(`Img ${i} start lazy load...`);
        imgEl.src = imgEl.dataset.src;
    }
  }
})

function isLoaded(el) {
    return el.dataset.isLoaded
}
var elementsToShow = document.querySELEctorAll('.show-on-scroll');
$(window).scroll(function() {
  Array.prototype.forEach.call(elementsToShow,function(element) {
    if (isLoaded(element) && iSELER_774_11845@enTinViewport(element)) {
      element.classList.add('is-visible');
    } else {
      element.classList.remove('is-visible');
    }
  });
});

[...elementsToShow].forEach((imgEl,i) => {
  if (
    imgEl.src &&
    imgEl.getBoundingClientRect().height
  ) {
    imgEl.dataset.isLoaded = true;
    console.log(`Img ${i} already loaded`);
  } else {
    console.log(`Img ${i} still loading... or should be lazyloaded`);
    
    imgEl.onload = function(E) {
      console.log(`Img ${i} finally loaded! onload event`);
      e.target.dataset.isLoaded = true;
    };
    
    if (imgEl.dataset.srC) {
      console.log(`Img ${i} start lazy load...`);
      imgEl.src = imgEl.dataset.src;
    }
  }
});

function isLoaded(el) {
  return el.dataset.isLoaded
}

// Helper function from: http://stackoverflow.com/a/7557433/274826
function iSELER_774_11845@enTinViewport(el) {
  // special bonus for those using jQuery
  if (typeof jQuery === "function" && el instanceof jQuery) {
    el = el[0];
  }
  var rect = el.getBoundingClientRect();
  return (
    (rect.top <= 0 &&
      rect.bottom >= 0) ||
    (rect.bottom >= (window.innerHeight || document.documentElement.clientHeight) &&
      rect.top <= (window.innerHeight || document.documentElement.clientHeight)) ||
    (rect.top >= 0 &&
      rect.bottom <= (window.innerHeight || document.documentElement.clientHeight))
  );
}
.balltest {
  width: 50px;
}

.fade-in {
  opacity: 0;
  -webkit-transition: transform 4s 0.25s cubic-bezier(0,1,0.3,1),opacity 1s 0.25s ease-out;
  -moz-transition: transform 4s 0.25s cubic-bezier(0,opacity 1s 0.25s ease-out;
  -o-transition: transform 4s 0.25s cubic-bezier(0,opacity 1s 0.25s ease-out;
  transition: transform 4s 0.25s cubic-bezier(0,opacity 0.3s 0.25s ease-out;
  will-change: transform,opacity;
}

.standard-push {
  opacity: 0;
  transform: translateY(4em);
  -webkit-transition: transform 4s 0.25s cubic-bezier(0,opacity 1s 0.25s ease-out,translateZ(0);
  -moz-transition: transform 4s 0.25s cubic-bezier(0,opacity;
}

.is-visible {
  transform: translateY(0);
  opacity: 1;
}

C.等待文档的 <script src="https://cdnjs.cloudFlare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <html> <p style='margin-top: 100vh;'>above</p> <img class='balltest show-on-scroll standard-push' src='http://www.pngall.com/wp-content/uploads/5/Sports-Ball-Transparent.png' /> <img class='balltest show-on-scroll fade-in' src='http://www.pngall.com/wp-content/uploads/5/Sports-Ball-Transparent.png' /> <img class='balltest show-on-scroll standard-push' data-src='http://www.pngall.com/wp-content/uploads/5/Sports-Ball-Transparent.png' /> <img class='balltest show-on-scroll fade-in' data-src='http://www.pngall.com/wp-content/uploads/5/Sports-Ball-Transparent.png' /> <p style='margin-bottom: 100vh'>below</p> </html> 事件

您可以将 JS 初始化代码包装到整个文档的 load 事件中。在所有资源(CSS、IMG 等)完全加载后触发该事件。

load
,

我在 iPhone 版 Chrome 浏览器上测试了您的代码,但无法重现屏幕录制中显示的错误。

是否与尝试在移动版 Chrome 浏览器上运行整个 jsfiddle Web 应用程序有关?这是一个沉重的网络应用程序,除了您正在测试的任何实际输出之外,还有很多幕后工作,因此这可能会导致性能问题。最好只测试输出本身。

我已将您的代码迁移到一个代码沙盒中,这样您就可以在移动浏览器中自行查看输出(见下文)。您可以自行判断您所看到的问题是否是实际的代码错误。

还应注意的是,您使用的球图像的文件大小 (~200kb) 与显示大小相同。因此,在页面加载时看到它闪烁也不会不寻常。

这是球图像的较小版本(缩小了 80% 并使用 quite large 进行了优化),最终大小约为 42kb(您绝对可以做得更小):

https://Tinypng.com/


这是您在 codeandbox 上的相同代码:

动画滞后于移动版 chrome

这只是输出(尝试在您设备上的移动浏览器中查看):

https://codesandbox.io/s/animation-test-ok1dp

这是一个屏幕视频(我使用 Chrome 浏览器在 iPhone 上拍摄):

https://ok1dp.csb.app/

,

我也面临这种情况。在其他浏览器上,它很流畅。在 Chrome 移动设备上,它是如此滞后。当我将 iPhone 更新到 iOS 14 时,就会出现这种情况。

大佬总结

以上是大佬教程为你收集整理的动画滞后于移动版 chrome全部内容,希望文章能够帮你解决动画滞后于移动版 chrome所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。