在滚动时向元素添加和删除多个类,反转动画

时间:2017-02-10 00:05:35

标签: jquery css3 css-animations

一旦用户滚动到页面的特定点,我就会对元素的反弹进行动画处理。我有这个工作,通过添加一个类,然后在此时删除它。但是,我还有另一个反弹动画。我希望元素在用户向上滚动时弹回。所以,我想添加'滚动'和#'持续时间'滚动时的类,然后当用户向后滚动时,我想添加'持续时间'并且'未滚动'类。

这是一个简单的版本:



$(window).scroll(function(){
          if ($(window).scrollTop() > 200){
              $('.bounce-square').addClass( 'duration scrolled');
          }
          else{
            $('.bounce-square').removeClass( 'duration scrolled');
            //$('.bounce-square').addClass( 'duration not-scrolled');
          }
       });

.bounce-square{
  background-color: red;
  height: 100px;
  width: 100px;
  position: fixed;
  top: 15%;
  left: 15%;
  opacity: 0;
}

.scrolled{
  opacity: 1;
  animation-name: bounceIn;
}

.not-scrolled{
  animation-name: bounceOut;
}

.duration{
  animation-duration: .75s;
}

@keyframes bounceIn {
  from, 20%, 40%, 60%, 80%, to {
    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
  }

  0% {
    opacity: 0;
    -webkit-transform: scale3d(.3, .3, .3);
    transform: scale3d(.3, .3, .3);
  }

  20% {
    -webkit-transform: scale3d(1.1, 1.1, 1.1);
    transform: scale3d(1.1, 1.1, 1.1);
  }

  40% {
    -webkit-transform: scale3d(.9, .9, .9);
    transform: scale3d(.9, .9, .9);
  }

  60% {
    opacity: 1;
    -webkit-transform: scale3d(1.03, 1.03, 1.03);
    transform: scale3d(1.03, 1.03, 1.03);
  }

  80% {
    -webkit-transform: scale3d(.97, .97, .97);
    transform: scale3d(.97, .97, .97);
  }

  to {
    opacity: 1;
    -webkit-transform: scale3d(1, 1, 1);
    transform: scale3d(1, 1, 1);
  }
}

@keyframes bounceOut {
  20% {
    -webkit-transform: scale3d(.9, .9, .9);
    transform: scale3d(.9, .9, .9);
  }

  50%, 55% {
    opacity: 1;
    -webkit-transform: scale3d(1.1, 1.1, 1.1);
    transform: scale3d(1.1, 1.1, 1.1);
  }

  to {
    opacity: 0;
    -webkit-transform: scale3d(.3, .3, .3);
    transform: scale3d(.3, .3, .3);
  }
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="bounce-square"></div>
<p>Please scroll a little</p>
<div style="height: 3000px"></div>
&#13;
&#13;
&#13;

我已经注释掉了我认为可行的一行Javascript。

我尝试过混合使用toggleclass并在不同的位置删除/添加类,但没有任何东西按照我想象的方式工作。

我很感激任何帮助。

在这里小提琴:https://jsfiddle.net/hbndag6L/1/

感谢。

1 个答案:

答案 0 :(得分:0)

重新添加和删除逻辑可以更接近所需的效果。从这里你可以调整css来增强。

var bounce = $('.bounce-square');
bounce.addClass('duration');

$(window).scroll(function() {
  if ($(window).scrollTop() > 200) {
    bounce.removeClass('not-scrolled');
    bounce.addClass('scrolled');
  } else {
    if (bounce.hasClass('scrolled')) {
      bounce.removeClass('scrolled');
      bounce.addClass('not-scrolled');
    }
  }
});
.bounce-square {
  background-color: red;
  height: 100px;
  width: 100px;
  position: fixed;
  top: 15%;
  left: 15%;
  opacity: 0;
}
.scrolled {
  opacity: 1;
  animation-name: bounceIn;
}
.not-scrolled {
  animation-name: bounceOut;
}
.duration {
  animation-duration: .75s;
}
@keyframes bounceIn {
  from, 20%, 40%, 60%, 80%, to {
    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
  }
  0% {
    opacity: 0;
    -webkit-transform: scale3d(.3, .3, .3);
    transform: scale3d(.3, .3, .3);
  }
  20% {
    -webkit-transform: scale3d(1.1, 1.1, 1.1);
    transform: scale3d(1.1, 1.1, 1.1);
  }
  40% {
    -webkit-transform: scale3d(.9, .9, .9);
    transform: scale3d(.9, .9, .9);
  }
  60% {
    opacity: 1;
    -webkit-transform: scale3d(1.03, 1.03, 1.03);
    transform: scale3d(1.03, 1.03, 1.03);
  }
  80% {
    -webkit-transform: scale3d(.97, .97, .97);
    transform: scale3d(.97, .97, .97);
  }
  to {
    opacity: 1;
    -webkit-transform: scale3d(1, 1, 1);
    transform: scale3d(1, 1, 1);
  }
}
@keyframes bounceOut {
  20% {
    -webkit-transform: scale3d(.9, .9, .9);
    transform: scale3d(.9, .9, .9);
  }
  50%,
  55% {
    opacity: 1;
    -webkit-transform: scale3d(1.1, 1.1, 1.1);
    transform: scale3d(1.1, 1.1, 1.1);
  }
  to {
    opacity: 0;
    -webkit-transform: scale3d(.3, .3, .3);
    transform: scale3d(.3, .3, .3);
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="bounce-square"></div>
<p>Please scroll a little</p>
<div style="height: 3000px"></div>