【问题标题】:Parallax effect on an elements position only when in view仅在视图中时元素位置上的视差效果
【发布时间】:2016-05-30 13:38:53
【问题描述】:

类似于这个未解决的问题 (jQuery - parallax - update background position correctly)

我正在为页面滚动上的元素的变换属性设置动画,以实现类似视差的效果。我希望这个元素只有在它出现时才开始动画。现在的问题是,如果元素出现在页面的下方,它已经向上移动了很多并且失去了效果。

这是我目前的代码

function parallax() {
  var scrolled = $(window).scrollTop();
  $('[data-scroll]').css('transform', 'translateY('+-(scrolled*0.02)+'px)');
}

$(window).scroll(function(e){
  parallax();
});

【问题讨论】:

  • 代码太少了.. 做个小提琴
  • 其实,忘了提琴,看看这个网站ihatetomatoes.net/demos/parallax-scroll-effect
  • @Rachel Gallen 这不是太少的代码,因为它是用于效果的所有代码。我想如果您想查看 HTML,它实际上只是一个带有 [data-scroll] 的 div...不过感谢您提供的链接,我会检查一下
  • @GL.awog 我知道如何检查元素是否可见,并且我一直在尝试。我想我只是不确定如何根据滚动位置和速度确定变换位置应该是什么。

标签: javascript jquery parallax


【解决方案1】:

在回答您的问题时,如何分离“视差”的 div,以便它们在滚动时相互独立地移动位置,应该依赖于它们的唯一坐标 - 每个都有自己的 $(elem).offset( ).top - 与页面顶部的一般垂直偏移量(除非您手动干预 TOP 属性,否则它始终保持不变)。

所以所有的计算都可以基于这个属性。

$('.parallax').each(function(){ 
    
    if ($(this).is_on_screen()) {
      var firstTop = $(this).offset().top;
      var winScrollTop = $(window).scrollTop();
      var shiftDistance = (firstTop - winScrollTop)*0.02;

      $(this).css("transform":"translateY("+shiftDistance+"px)");
    }
});

另外你检查元素是否在视口中。因此,您可以确保它在自己的时间内移动相同的增量距离,无论它在页面上的哪个位置 - 进一步向下或向上。

另一件事是如何在屏幕上放置元素可见性的“边界”。如果您在视口中移动一个元素,我建议制作一个包装 div,在其中发生移动(就像一个 bg 在 div 包装器中移动)。

<div class="parallax-section slide1">
 <span class="moving-block"></span>
</div>

div 的高度更大,我们检查这个 div 何时在屏幕上,而不是移动的元素。

demo

如果需要不同的速度,也可以应用其他修改,每个元素的偏移量。我发现这个plugin 是一个很好的初学者学习视差的东西。

附:顺便说一句,所有初始属性都应该缓存在变量中,而不是每次都在回调中检索它们,例如 firstTop

【讨论】:

  • 感谢 jsfiddle 演示。我在尝试解决视差的固有问题时遇到了它。在您的示例中,视差项目实际上是接触视口的顶部。然而,在我正在构建的网站上,视差框在屏幕上是可见的,但是从页面下方的 75% 左右开始。一旦我开始滚动,当元素接收到第一个 translateY 值时,它就会“跳”下来开始它的视差。
  • 我尝试在窗口完成加载后立即对 translateY 执行更新以预先定位元素,但 translateY 值仍然存在细微变化。所以 - 问题是 - 我们如何解释 translateY 值从无到有的初始变化 - 创造一个跳跃?到目前为止,我唯一的解决方法是评估它在滚动时首先设置 translateY 的位置,并将其设置为该元素的 CSS 中的初始 translateY 值。但这感觉很笨拙。
猜你喜欢
  • 2019-04-15
  • 2019-01-12
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多