滑块具有垂直视差效果

时间:2016-09-12 15:06:44

标签: javascript jquery html css parallax

我为我的客户创建了一个简单的滑块,可以使用Flexslider进行更新,并且在其网站的其他位置,它们具有垂直滚动视差效果。现在他们想要一个具有垂直滚动视差效果的滑块......

Here's an example of the desired effect

对于我的视差效果,我使用了Parallax.js,当我只需要一个图像来产生效果时这很好,但是现在我没有太多用处,我需要滑块才能拥有它。

上面的例子使用Avia Slider,但视差效果似乎是由其他东西完成的(因为Avia没有任何我能看到的效果)。

如何为现有的Flexslider滑块(或任何其他滑块)创建简单的视差效果?看起来它应该是一个简单的效果,不一定需要一个jQuery插件。

2 个答案:

答案 0 :(得分:0)

一种方法是将元素置于绝对位置。应发生视差效应的有效距离必须在overflow: hidden区域。这意味着,如果你想要一个完全固定的背景,这张图片的宽度必须是width: 100vw

然后,您只需触发滚动事件并使用translateX()或通过更改background-image的位置并将值与实际速度相乘来转换图片。 由于滚动事件经常触发,每次使用requestAnimationFrame()时浏览器都不会重新呈现。

var translate = function() {
    $('#object').css('transform','translateX('+($(window).scrollTop()*.4)+'px)');
}

$(window).on('scroll', function() {
   window.requestAnimationFrame(translate);
});

这里有一个原型,所以你有一个更好的主意。

$(document).on('ready', function(){
  var $outerWrapper = $('#outerWrapper');
  var $innerWrapper = $('#innerWrapper');
  var $innerWrapperWidth = $innerWrapper.outerWidth();
  var $slides = $('.slide');
  var slideWidth = $slides.eq(0).outerWidth();
  var effective = slideWidth * 0.5;

  $outerWrapper.on('scroll', function(e){
    for (var i = 0; i < $slides.length; i++) {
      $element = $slides.eq(i);
      var s = $element.offset().left;
      if (s < slideWidth && s > 0) {
        var percent = s/slideWidth;
        var translate = effective * percent;
        if ($element.hasClass('parallax')){
          $element.css('background-position', '-' + translate +'px 0');
        }
      }
    }
   
  });
});
.slide{
  width: 298px;
  height: 148px;
  background-color: #dadada;
  border: 1px solid #ccc;
  float: left;
  background-image: url('http://www.technocrazed.com/wp-content/uploads/2015/12/Landscape-wallpaper-7.jpg');
  background-size: 100%;
}

.slide.parallax{
  background-size: 150%;
}

#innerWrapper{
  width: 1500px;
  height: 150px;
}

#outerWrapper{
  width: 300px;
  height: 150px;
  overflow-x: scroll;
  overflow-y: hidden;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="outerWrapper">
  <div id="innerWrapper">
    <div class="slide"></div>
    <div class="slide parallax"></div>
    <div class="slide"></div>
    <div class="slide parallax"></div>
    <div class="slide"></div>
  </div>
</div>

答案 1 :(得分:0)

以下是我如何解决它:

我将transform: translate3d(0,0,0)添加到滑块元素,然后在用户向下滚动时对其进行修改(例如transform: translate3d(0,10px,0))。一个简单,干净的解决方案:

$(window).scroll(function() {
    if($(window).scrollTop() > 0) {

        var parallaxDistance = ($(window).scrollTop()/2), 
            parallaxCSS = "translate3d(0, "+ parallaxDistance +"px , 0)";

        $('.slides').css('transform', parallaxCSS);

    } else {

        $('.slides').css('transform', 'translate3d(0, 0, 0)');
    }
});