根据滚动位置来回动画

时间:2018-08-02 11:03:59

标签: javascript jquery html animation

我创建了一个小示例,其中包含两个基于滚动位置动画的动画演示。但这并不是我想要实现的。我想要的是使框根据滚动位置进行动画处理,而不仅仅是在达到某个点时过渡。

例如,滚动应控制动画,因此,如果向下滚动,则框将设置动画,如果向上滚动,则框将设置动画。如果停止滚动动画,动画将停止。如果反转滚动位置,动画将反转。因此,动画仅在滚动时发生。

我希望这很清楚,让您理解。我将尝试提供指向我要实现的目标的链接。但是现在,这是我的演示,仅使用过渡为框动画。

jQuery(document).ready(function($){
	var scroll_pos = $(window).scrollTop();
    var box = $('#container').offset().top - 200;
    
    $(window).on('scroll', function(){
    	scroll_pos = $(window).scrollTop();
        
    	$('p').html(scroll_pos);
        
        if(scroll_pos >= box){
        	$('#left').addClass('animate');
        	$('#right').addClass('animate');
        }else{
        	$('#left').removeClass('animate');
        	$('#right').removeClass('animate');
        }
    });
  	
});
#container{
    width: 600px;
    height: 300px;
    margin: 1000px auto;
    overflow: hidden;
    font-size: 0;
}

#left{
    width: 55%;
    height: 300px;
    background-color: blue;
    display: inline-block;
    transform: translateX(-100%);
    transition: all 0.5s; 
}

#right{
    width: 45%;
    height: 300px;
    background-color: yellow;
    display: inline-block;
    transform: translateX(100%);
    transition: all 0.5s; 
}

#left.animate{
    transform: translateX(0%);
}

#right.animate{
    transform: translateX(0%);
}

p{
    position: fixed;
    top: 0;
    left: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<p></p>

<div id="container">
    <div id="left"></div>
    <div id="right"></div>
</div>

这是我想要实现的一个例子。如您所见,滚动控件控制着微调旋转器https://ampbyexample.com/visual_effects/basics_of_scrollbound_effects/

的动画

1 个答案:

答案 0 :(得分:0)

基于this answer,您可以执行以下操作:

/**
 * inViewport jQuery plugin by Roko C.B.
 * http://stackoverflow.com/a/26831113/383904
 * Returns a callback function with an argument holding
 * the current amount of px an element is visible in viewport
 * (The min returned value is 0 (element outside of viewport)
 */
;(function($, win) {
  $.fn.inViewport = function(cb) {
     return this.each(function(i,el) {
       function visPx(){
         var elH = $(el).outerHeight(),
             H = $(win).height(),
             r = el.getBoundingClientRect(), t=r.top, b=r.bottom;
         return cb.call(el, Math.max(0, t>0? Math.min(elH, H-t) : Math.min(b, H)));  
       }
       visPx();
       $(win).on("resize scroll", visPx);
     });
  };
}(jQuery, window));


// Now our stuff:

var $container = $("#container");
var $left = $("#left");
var $right = $("#right");

$container.inViewport(function( px ) {
  var v = 1 - px / $container.height(); // Value from 1.0 to 0.0 and v.versa
  $("p").text(v);
  $left.css({transform: `translateX(${ -v * 100 }%)`});
  $right.css({transform: `translateX(${ v * 100 }%)`});
});
body {
  height: 500vh;
}

#container {
  position: relative;
  margin: 0 auto;
  top: 200vh;
  overflow: hidden;
  width: 60vw;
  height: 60vh;
}

#left,
#right {
  width: 50%;
  height: 100%;
  float: left;
}

#left {
  background-color: blue;
  transform: translateX(-100%);
}

#right {
  background-color: yellow;
  transform: translateX(100%);
}

p {position: fixed; top:0; left: 0;}
<div id="container">
  <div id="left"></div>
  <div id="right"></div>
</div>

<p></p>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>