use*_*062 10 javascript jquery html5 css3 css-transforms
我希望我的标题有一个缩小效果,加载放大的内容,以及滚动它缩小.
我所做的是通过transform:scale(1.4)增加大小,滚动时我从scrollTop和header height计算一个百分比,然后我将它乘以0.4.问题是在滚动时屏幕开始振动,刻度不平滑.你知道我的代码有什么问题吗?或者你能告诉我实现这个目的的最佳做法是什么?
jQuery(document).ready(function(){
function zoom_out() {
var page_header_height = jQuery('#page-header-custom').outerHeight();
var scroll_top = jQuery(window).scrollTop();
var zoom_multiplier = 0.4;
var multiplier = (zoom_multiplier*(1-((scroll_top-jQuery('#page-header-custom').offset().top)/page_header_height))) > 1 ? 1 : (zoom_multiplier*(1-((scroll_top-jQuery('#page-header-custom').offset().top)/page_header_height)));
if(multiplier <= 1) {
jQuery('#page-header-inner').stop(true, true).transition({ scale: 1/(1+multiplier), translate: '0, -50%' });
jQuery('#page-header-custom').stop(true, true).transition({
scale: 1+multiplier
});
}
}
zoom_out();
jQuery(window).on('scroll', function(){
zoom_out();
});
});
Run Code Online (Sandbox Code Playgroud)
我创建了一个JSFiddle来实现它.
我已经使用 平滑缩放更新了您的 Fiddlewindow.requestAnimationFrame。缩放动画正在振动,因为您在每个事件上触发翻译scroll。像这样思考一下:
zoom_out()被触发并告诉元素转换其transform属性。您的元素现在正在以一定的速度进行转换:“长度”/转换时间。scroll事件已经过去,都在触发zoom_out()。下一个过渡可能会以不同的速度发生,从而导致“振动”动画。首先你可以摆脱 jQuery 的transition()方法。如果您以 60 fps 或接近 60 fps 的速度触发该功能,则人眼会看到动画流畅,无需过渡或制作动画。
if(multiplier <= 1) {
//jQuery('#page-header-inner').stop(true, true).transition({ scale: 1/(1+multiplier), translate: '0, -50%' });
//jQuery('#page-header-custom').stop(true, true).transition({ scale: 1+multiplier });
//becomes:
jQuery('#page-header-inner').css({ scale: 1/(1+multiplier), translate: '0, -50%' });
jQuery('#page-header-custom').css({ scale: 1+multiplier });
}
}
Run Code Online (Sandbox Code Playgroud)
可以通过多种方式实现以 ~60fps 触发该功能:
将滚动事件的速率限制为 60 fps。
或者像更新的Fiddle中那样使用window.requestAnimationFrame
function zoom_out(){
//calculation code & setting CSS
window.requestAnimationFrame(zoom_out);
}
//trigger it once instead of the scroll event handler
window.requestAnimationFrame(zoom_out);
Run Code Online (Sandbox Code Playgroud)