【发布时间】:2019-06-12 12:46:50
【问题描述】:
我一直在做一个新的静态网站,这是一个非常简单的构建,但有一些微妙的 CSS 动画,由 isInViewport js 函数触发。
我注意到 Chrome 在滚动页面时会出现少量延迟,这非常不和谐。然而在 Safari 中,Firefox 绝对没问题。
这是我的js,用于在元素位于视口中时触发。
$.fn.isInViewport = function() {
var elementTop = $(this).offset().top;
var elementBottom = elementTop + $(this).outerHeight();
var viewportTop = $(window).scrollTop();
var viewportBottom = viewportTop + $(window).height() - 100;
return elementBottom > viewportTop && elementTop < viewportBottom;
};
$(window).on('resize scroll', function() {
setTimeout(function(){
$('section').each(function() {
if ($(this).isInViewport()) {
$(this).addClass('reveal');
}
else {
}
});
}, 300);
});
有什么不正常的事情我不应该做的吗?
这里是与动画相关的CSS。
.image-reveal {
position: relative;
overflow: hidden;
}
.image-reveal-cover {
background: #fcfcfc;
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 5;
transform: translateX(0);
-webkit-transform: translateX(0);
transition: transform cubic-bezier(.19, 1, .22, 1) 1.75s;
-webkit-transition: transform cubic-bezier(.19, 1, .22, 1) 1.75s;
}
.image-reveal img {
position: relative;
z-index: 2;
opacity: 0;
transform: scale(1.4);
-webkit-transform: scale(1.4);
transition: all cubic-bezier(.19, 1, .22, 1) 1.5s;
-webkit-transition: all cubic-bezier(.19, 1, .22, 1) 1.5s;
}
section.reveal .image-reveal-cover {
transform: translateX(100%);
-webkit-transform: translateX(100%);
}
section.reveal .image-reveal img {
opacity: 1;
transform: scale(1);
-webkit-transform: scale(1);
}
这是一个codepen,显示了 Chrome 中滚动抖动的示例。
我是否错误地触发了我的动画?我认为使用变换作为 CSS 移动的基础相对没有延迟?
感谢任何建议。谢谢。
我也在Mac OS Mojave上使用Chrome 71.0.3578.98
【问题讨论】:
-
性能完全取决于浏览器的JS实现。您真正可以用您的逻辑做的唯一一件事就是停止多次重新创建相同的 jQuery 对象。如果这仍然不够高效,请使用纯 JS 而不是 jQuery。如果这仍然不起作用,那么您无能为力。
-
另外请注意,您的 Codepen 在 Chrome 中对我来说是流畅的,但这取决于运行浏览器的机器的能力——不过,每个浏览器也是如此。
-
我正在运行 4 GHz Intel Core i7 16GB RAM iMac。 Codepen 相对平滑,但您没有看到非常轻微的波动吗?它非常微妙,但与 Safari 相比令人沮丧。
-
这很奇怪,我在 Windows 10 上使用的是 i5 7600 @ 3.5Ghz,它像黄油一样光滑。我建议更改操作系统;)
-
哈哈,至少它可能不在我的手中,这让人放心。使用 on resize 是否存在潜在问题?
标签: jquery css google-chrome