我为我的客户创建了一个简单的滑块,可以使用Flexslider进行更新,并且在其网站的其他位置,它们具有垂直滚动视差效果。现在他们想要一个具有垂直滚动视差效果的滑块......
Here's an example of the desired effect
对于我的视差效果,我使用了Parallax.js,当我只需要一个图像来产生效果时这很好,但是现在我没有太多用处,我需要滑块才能拥有它。
上面的例子使用Avia Slider,但视差效果似乎是由其他东西完成的(因为Avia没有任何我能看到的效果)。
如何为现有的Flexslider滑块(或任何其他滑块)创建简单的视差效果?看起来它应该是一个简单的效果,不一定需要一个jQuery插件。
答案 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)');
}
});