【问题标题】:Animate.css + Viewport Checker delay?Animate.css + Viewport Checker 延迟?
【发布时间】:2014-09-08 16:22:07
【问题描述】:

我正在使用包含Animate.cssjQuery Viewport Checker 的教程将元素动画到我的页面中(http://www.web2feel.com/tutorial-for-animated-scroll-loading-effects-with-animate-css-and-jquery/)。

我想知道如何修改这些动画,以便每个动画连续发生而不是同时发生。 IE。我希望第一个元素动画,然后当那个元素即将完成时,下一个元素开始动画,等等。

这是我目前所有元素的动画:

<div class="container">
    <div class="post">1</div>
    <div class="post2">2</div>
    <div class="post">3</div>
    <div class="post2">4</div>
    <div class="post">5</div>
    <div class="post2">6</div>
    <div class="post">7</div>
</div>

<script>
    $(document).ready(function(){
        $('.post').addClass("hidden").viewportChecker({
            classToAdd: 'visible animated fadeInUp',
            offset: 100
        });
        $('.post2').addClass("hidden").viewportChecker({
            classToAdd: 'visible animated fadeInDown',
            offset: 100
        });
    });
</script>

JSFIDDLE

非常感谢任何帮助!

【问题讨论】:

    标签: jquery css delay animate.css


    【解决方案1】:

    您可以通过稍微调整一下 ViewportChecker 脚本来完成此操作(Animate.css + Viewport Checker 延迟)。我已经用 1.7.4 版完成了。有3个修改:

    1) 添加默认值为0的“延迟”选项:

    $.fn.viewportChecker = function(useroptions){
        // Define options and extend with user
        var options = {
            classToAdd: 'visible',
            classToRemove : 'invisible',
            offset: 100,
            repeat: false,
            invertBottomOffset: true,
            callbackFunction: function(elem, action){},
            scrollHorizontal: false,
            delay: 0 // HERE
        };
        ...
    

    2) 添加“数据延迟”功能,以便可以在 html 标签中指定延迟:

    // Loop through all given dom elements
    $elem.each(function(){
        var $obj = $(this),
            objOptions = {},
            attrOptions = {};
    
        //  Get any individual attribution data
        if ($obj.data('vp-add-class'))
            attrOptions.classToAdd = $obj.data('vp-add-class');
        if ($obj.data('vp-remove-class'))
            attrOptions.classToRemove = $obj.data('vp-remove-class');
        if ($obj.data('vp-offset'))
            attrOptions.offset = $obj.data('vp-offset');
        if ($obj.data('vp-repeat'))
            attrOptions.repeat = $obj.data('vp-repeat');
        if ($obj.data('vp-scrollHorizontal'))
            attrOptions.scrollHorizontal = $obj.data('vp-scrollHorizontal');
        if ($obj.data('vp-invertBottomOffset'))
            attrOptions.scrollHorizontal = $obj.data('vp-invertBottomOffset');
        if ($obj.data('vp-delay')) // HERE
            attrOptions.delay = $obj.data('vp-delay');
        ...
    

    3) 将元素在视口中时要执行的语句包装起来,调用 setTimeout:

    // Add class if in viewport
    if ((elemStart < viewportEnd) && (elemEnd > viewportStart)){
         setTimeout(function() { // HERE
              // remove class
              $obj.removeClass(objOptions.classToRemove);
    
              $obj.addClass(objOptions.classToAdd);
    
              // Do the callback function. Callback wil send the jQuery object as parameter
              objOptions.callbackFunction($obj, "add");
          }, objOptions.delay);
          ...
    

    用法

    HTML

    <div data-vp-animate="bounceInLeft" data-vp-delay="500">
        ...
    </div>
    

    CSS

    .hidden-o {
       opacity: 0;
     }
    .visible-o {
       opacity: 1;
    }
    

    JS

    $('[data-vp-animate]').each(function() {
        var classToAdd = 'visible-o animated '+($(this).data('vp-animate') ? $(this).data('vp-animate') : 'fadeIn');
    
        $(this).addClass('hidden-o').viewportChecker({
            classToAdd: classToAdd
       });
    });
    

    【讨论】:

      【解决方案2】:

      我知道这是一篇较旧的帖子。但我只是在谷歌上输入“viewportchecker”就发现了这一点。

      这是一个有效的解决方案,可以延迟动画元素:

      $('.info-bar').find('li').addClass('hidden');
      $('.info-bar').viewportChecker({
          classToAdd: 'in-viewport',
          offset: 100,
          callbackFunction: function(elem) {
              var elements = elem.find('li'),
                  i = 0;
              interval = setInterval(function(){
                  elements.eq(i++).addClass('visible animated pulse');
                  if(i==elements.length) {
                      clearInterval(interval);
                  }
              },250);
          }
      });
      
      <ul class="info-bar">
        <li>some content</li>
        <li>some content</li>
        <li>some content</li>
        <li>some content</li>
        <li>some content</li>
      </ul>
      

      【讨论】:

        【解决方案3】:

        您实际上根本不需要 Viewport Checker。请参阅此FIDDLE。它的代码更少,并且做同样的事情。我添加的唯一额外代码与动画的时间有关。

        // ANIMATION SCRIPT
        $(document).ready(function(){
            var i = 0;
            var posts = $('.container').children();
        
            function animateCircle() {
                if (i % 2 === 0) {
                    $(posts[i]).addClass('visible animated fadeInUp');
                } else {
                    $(posts[i]).addClass('visible animated fadeInDown');
                }
                i++;
                if (i <= posts.length) {
                    startAnimation();
                }
            }
        
            function startAnimation() {
                setTimeout(function () {
                    animateCircle();}, 1000);
            }
        
            posts.addClass('hidden');
            animateCircle(posts);
        });
        

        但是如果你想使用 Check Viewport,你可以把 animateCircle 函数改成这样:

        function animateCircle() {
            if (i % 2 === 0) {
                $(posts[i]).viewportChecker({
                    classToAdd: 'visible animated fadeInUp',
                    offset: 100
                });
            } else {
                $(posts[i]).viewportChecker({
                    classToAdd: 'visible animated fadeInDown',
                    offset: 100
                });
            }
            i++;
            if (i <= posts.length) {
                startAnimation();
            }
        

        这是使用 jquery ViewportChecker 显示的FIDDLE

        【讨论】:

        • 哇。这个答案远远超出了。非常感谢,这正是我想要的!!!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-19
        • 1970-01-01
        • 1970-01-01
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多