【问题标题】:jQuery css call back functionjQuery css 回调函数
【发布时间】:2013-01-12 10:25:41
【问题描述】:

我正在尝试使用 jQuery 扩展我的搜索栏。 我也想隐藏导航链接。

我有一些这样的 jQuery 代码。此代码在焦点时工作正常。

$(".searchBox input").focus(function(){
    $("#navlinks").css('display','none');
   $(this).css({'width':'200px','-moz-transition':'width 0.5s ease-out','-webkit-transition':'width 0.5s ease-out','transition':'width 0.5s ease-out'});
});

 $(".searchBox input").focus(function(){
       $(this).css({'width':'100px','-moz-transition':'width 0.5s ease-out','-webkit-transition':'width 0.5s ease-out','transition':'width 0.5s ease-out'});
$("#navlinks").css('display','block');
    });

第二个功能也可以except it display the content before animation complete.

所以我希望 $("#navlinks").css('display','block'); 仅在动画完成时执行。

谁能告诉我怎么做?

谢谢

【问题讨论】:

    标签: javascript jquery css css-animations


    【解决方案1】:

    我来到这里,但我使用了另一种解决方案:

    $('.something').one("webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend",
        function(event) {
            // Do something when the transition ends
    
     });
    

    如您所见,当过渡结束时,这正在做某事。

    这里对此进行了描述: http://blog.teamtreehouse.com/using-jquery-to-detect-when-css3-animations-and-transitions-end

    您好,
    拉尔斯

    【讨论】:

      【解决方案2】:

      Here 被描述 transitionend 事件,让我们试试吧:

      CSS:

      #test {
          width: 100px;
          border: 1px solid black;
          -webkit-transition: all 1s;
          -moz-transition all 1s;
          transition all 1s;
      }
      #test.wide {
          width: 200px;
      
      }
      

      JS:

      var test = $('#test');
       test.bind('transitionend webkitTransitionEnd oTransitionEnd', function () {
              $('body').append('<div>END!</div>');
          })
      $('button').click(function () {
          test.toggleClass('wide');
      });
      

      DEMO

      【讨论】:

      • 我在我的 iPad 上试用了你的示例,但它根本不起作用...... :(
      • 过渡有效。但它没有出现在动画结束时的 div 。可能会尝试指定不同的元素而不是“body”
      • 你可以试试,正如我所说,它对我有用,我没有 iPad 可以检查。
      • 没办法。我已尝试修改您的示例 (jsfiddle.net/nUVU8/4),但它仍然无法捕获事件 transitionend。我会仔细检查你的链接。
      • 我按照here的描述添加了 oTransitionEnd 和 webkitTransitionEnd
      【解决方案3】:

      既然您知道动画需要多长时间,为什么不在 CSS 更改后使用 setTimeout() 呢? 据我所知,您的动画大约需要 0.5 秒。您可以在动画结束时轻松地无缝执行“回调”,指定相同的时间量(以毫秒为单位)。

       $(".searchBox input").focus(function(){
             $(this).css({'width':'100px','-moz-transition':'width 0.5s ease-out','-webkit-transition':'width 0.5s ease-out','transition':'width 0.5s ease-out'});
             setTimeout( function() {
                  $("#navlinks").css('display','block');
             }, 500);
        });
      

      【讨论】:

        【解决方案4】:

        我会推荐使用.animate() like

        $(".searchBox input").focus(function(){
            $(this).animate({
                'width': '100px'       
            }, 500, function() {
                $("#navlinks").css('display', 'block');
            });
        });
        

        这将适用于所有浏览器,并且 navlinks 命令将确保在动画完成后开始。注意:500 是动画完成所需的毫秒数,因此您可以进行相应调整。

        这是.animate() 文档: http://api.jquery.com/animate/

        【讨论】:

          【解决方案5】:

          .css() 没有回调函数,但 .animate() 有。只需将时间设置为 0 并使用动画。

          $(".searchBox input").on('focus',function(){
             $(this).animate({width:100,mozTransition:'width 500ms ease-out',webkitTransition:'width 500ms ease-out',transition:'width 500ms ease-out'},0,function(){
                 $("#navlinks")
                      .delay(500)
                      .css({display:'block'});
             });
          });
          

          编辑:包含延迟,这是必需的。 (感谢 eicto)

          【讨论】:

          • 完全错误。 jQuery 不会等待(甚至知道)CSS 动画。
          • 比使用不带过渡的动画
          • @eicto:速度较慢,尤其是在移动设备上
          • 使用延迟()而不是css动画的时间
          猜你喜欢
          • 2014-02-08
          • 1970-01-01
          • 1970-01-01
          • 2012-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多