大佬教程收集整理的这篇文章主要介绍了动画滞后于移动版 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
这看起来像是加载页面时的“竞争条件”问题。 JS 在 IMG 请求完成之前运行。
要理解问题就需要理解加载顺序:
加载/重新加载时,服务器以文档 (*.html) 文件响应
浏览器开始解析响应 (*.html) 并对找到的每个资源发起新的请求:
这些请求以不可预测的顺序完成。例如。大图像的加载时间可能比 *.css 文件长,...一些资源可能已经被浏览器缓存,根本不会启动请求,...
如果对 *.js 文件的请求在 IMG 请求完成之前完成,则找不到该图像的渲染 height
和新添加的 CSS 类 {{1} } 无论如何都会启动 is-visible
...
一旦 IMG 请求完成(img 被渲染)。为 IMG 触发 Content Reflow。 需要重新绘制的元素(IMG)上的持续过渡是“重置”,并从关键帧 0 开始。 这可以解释您的问题。
以下 3 个选项可能会解决您的问题:
在 CSS 中设置修复 transition
并在 html 中添加类:
height
您还可以添加 .myImg {
width: 50px;
height: 50px;
}
和 width
作为 html 属性。即使 *.css 仍在加载...
height
<img height="50" width="50" class="..." src="...">
已设置并检测到 src
-height
事件(因为它尚未加载)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;
}
<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(您绝对可以做得更小):
这是您在 codeandbox 上的相同代码:
这只是输出(尝试在您设备上的移动浏览器中查看):
https://codesandbox.io/s/animation-test-ok1dp
这是一个屏幕视频(我使用 Chrome 浏览器在 iPhone 上拍摄):
https://ok1dp.csb.app/
,我也面临这种情况。在其他浏览器上,它很流畅。在 Chrome 移动设备上,它是如此滞后。当我将 iPhone 更新到 iOS 14 时,就会出现这种情况。
以上是大佬教程为你收集整理的动画滞后于移动版 chrome全部内容,希望文章能够帮你解决动画滞后于移动版 chrome所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。