Parallax 脚本在 chrome 和移动设备上变得迟缓
Parallax script gets laggy in chrome and on mobile devices
我将此代码用于我正在创建的网站的视差效果,在 safari 和 firefox 中效果很好 (mac)。但是在 chrome(mac) 中它变得迟钝,当我在 iPad 和我的 iPhone 6.
上尝试时也是如此
Javascript:
var ypos,image;
function parallax() {
image = document.getElementById('bgImage');
ypos = window.pageYOffset;
image.style.top = ypos * .4+ 'px';
}
window.addEventListener('scroll', parallax),false;
html:
<img class="img-responsive" id="bgImage" src="images/bgtopg.jpg">
</div>
<div id="box1" class="content">
<h1>Heading</h1>
<p>Lorem ipsum dolor sit amet.....</p>
</div>
(img 响应 - 来自 bootstrap)
css:
#bgImage {
position: relative;
z-index: -1
}
知道是什么导致了滞后效应吗?
你可以尝试用translateY来做视差动画效果,而不是去操作图片的顶部样式。 This is an excellent post 作者 Paul Irish,描述了为什么您应该进行翻译而不是 top/left/right/bottom。
所以代替:
image.style.top = ypos * .4+ 'px';
你可以这样做:
image.style.webkitTransform = 'translateY(' + ypos * .4 + 'px)';
image.style.transform = 'translateY(' + ypos * .4 + 'px)';
祝你好运,如果有帮助请告诉我!
发生了什么事
'Laggy' javascript 事件的行为是一个常见问题。从本质上讲,您 运行 的目的是让您的事件堆栈过载。它堆积得如此之高,以至于产生了波涛汹涌的效果。
您的选择
解决这个问题的方法有两个。您可以选择硬件加速或去抖动的路径。去抖动应该是你的第一个解决方案,当你确认你不是简单地重载你的脚本时,应该使用硬件加速。
去抖那个混蛋!
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
document.addEventListener("DOMContentLoaded", function(event) {
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 myEfficientFn = debounce(function() {
console.log("HEY STOP MOVING ME AROUND!");
}, 25);
window.addEventListener("mousemove", myEfficientFn),false;
});
Move your mouse around a whole lot and look at your console.
我们有加速的技术!
我将此代码用于我正在创建的网站的视差效果,在 safari 和 firefox 中效果很好 (mac)。但是在 chrome(mac) 中它变得迟钝,当我在 iPad 和我的 iPhone 6.
上尝试时也是如此Javascript:
var ypos,image;
function parallax() {
image = document.getElementById('bgImage');
ypos = window.pageYOffset;
image.style.top = ypos * .4+ 'px';
}
window.addEventListener('scroll', parallax),false;
html:
<img class="img-responsive" id="bgImage" src="images/bgtopg.jpg">
</div>
<div id="box1" class="content">
<h1>Heading</h1>
<p>Lorem ipsum dolor sit amet.....</p>
</div>
(img 响应 - 来自 bootstrap)
css:
#bgImage {
position: relative;
z-index: -1
}
知道是什么导致了滞后效应吗?
你可以尝试用translateY来做视差动画效果,而不是去操作图片的顶部样式。 This is an excellent post 作者 Paul Irish,描述了为什么您应该进行翻译而不是 top/left/right/bottom。
所以代替:
image.style.top = ypos * .4+ 'px';
你可以这样做:
image.style.webkitTransform = 'translateY(' + ypos * .4 + 'px)';
image.style.transform = 'translateY(' + ypos * .4 + 'px)';
祝你好运,如果有帮助请告诉我!
发生了什么事
'Laggy' javascript 事件的行为是一个常见问题。从本质上讲,您 运行 的目的是让您的事件堆栈过载。它堆积得如此之高,以至于产生了波涛汹涌的效果。
您的选择
解决这个问题的方法有两个。您可以选择硬件加速或去抖动的路径。去抖动应该是你的第一个解决方案,当你确认你不是简单地重载你的脚本时,应该使用硬件加速。
去抖那个混蛋!
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
document.addEventListener("DOMContentLoaded", function(event) {
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 myEfficientFn = debounce(function() {
console.log("HEY STOP MOVING ME AROUND!");
}, 25);
window.addEventListener("mousemove", myEfficientFn),false;
});
Move your mouse around a whole lot and look at your console.