我刚刚对自己回答了这个问题。我不想使用任何库,因为我只需要一个简单的效果,而且我觉得解决方案应该很简单,只要我想要一个简单的结果。所以首先是 scss mixin(无论如何你都可以用 vanilla css 来做):
@mixin background-fixed($url) {
background-image: url($url);
background-repeat: no-repeat;
background-position: center;
background-size: auto 100vh;
}
你可以玩大小和位置。但在我的拙见中,我在这里给出了最常用的例子。接下来,我们使用 mixin 来设置具有视差效果的样式块:
#block-id {
@include background-fixed('/images/your_img.jpg');
}
接下来我们需要一些 jquery 脚本。首先让我们创建一些函数来让我们的编码器的生活更轻松:
function inVisibleRange(block) {
return ($(window).scrollTop() <= $(block).offset().top + $(block).outerHeight() && $(window).scrollTop() >= $(block).offset().top - $(window).height())
}
function parallaxScroll(block) {
if (inVisibleRange(block)) {
$(block).css('background-position-y', $(window).scrollTop() - $(block).offset().top + 'px');
}
}
最后我们在窗口滚动事件处理程序中使用这个函数:
$(window).scroll(function() {
parallaxScroll('#block-id');
}
在这里,我们得到了想要的视差背景效果。但正如您所见,视差效果的速度等于滚动速度。如果我们想自定义视差效果的速度(这里有一些街头魔术),我们只使用一个简单的除法运算并将其应用于计算background-position-y
:
($(window).scrollTop() - $(block).offset().top) / 1.3
是的,我们在顶部和底部丢失了一些图像的小部分。但我发现这是一个很好的 hack,不会以不好的方式影响外观。就像用斧头切割一样简单。但是我们需要超级激光来切割一棵小树吗?好吧,我认为就我而言,我当然更喜欢用很酷的激光切割它。但是让我们不要考虑到这一点,假装我的比喻是在正确的地方。