使用jQuery delay()和css()

jer*_*iuh 51 jquery

为什么delay()在这里工作:

$('#tipper').mouseout(function() {
  $('#tip').delay(800).fadeOut(100);
});
Run Code Online (Sandbox Code Playgroud)

但这没有延迟:

$('#tipper').mouseout(function() {
  $('#tip').delay(800).css('display','none');
});
Run Code Online (Sandbox Code Playgroud)

//编辑 - 这是一个有效的解决方案

$('#tipper').mouseleave(function() {
  setTimeout( function(){
    $('#tip').css('display','none');
       },800);
});
Run Code Online (Sandbox Code Playgroud)

Ken*_*ler 123

delay()适用于动画(fx)队列.更改css属性不适用于该机制,因此不受delay指令的影响.

有一种解决方法 - 您可以将属性更改作为排队操作注入,如下所示:

$('#tip')
  .delay(800)
  .queue(function (next) { 
    $(this).css('display', 'none'); 
    next(); 
  });
Run Code Online (Sandbox Code Playgroud)

此外,您可能应该使用.hide()而不是.css('display','none').

这是一个有效的例子:http://jsfiddle.net/redler/DgL3m/

  • 嘿,我知道这是一个老帖子,但有人可以解释为什么你必须在设置CSS后调用'next()'函数.我正在使用它并且它工作得非常好我只是想了解它是如何工作的 (2认同)
  • @ ChrisG-Jones,会发生的事情是你排队的函数(在匿名函数上面的情况下)自动传递给它*另一个函数*将使下一个项目出列(移动队列).上面我将这个论点命名为"下一个",尽管你可以将它命名为任何你喜欢的名字.因此,在匿名函数中,"next"现在是一个函数,当被调用时,它会使队列前进.如果我无法在匿名函数结束时调用`next()`,队列中没有其他内容(`fx`队列)将运行. (2认同)

Ben*_*XVI 23

一个小小的jQuery扩展可以帮助解决这个问题.你可以称之为qcss:

$.fn.extend({
   qcss: function(css) {
      return $(this).queue(function(next) {
         $(this).css(css);
         next();
      });
   }
});
Run Code Online (Sandbox Code Playgroud)

这可以让你写:

$('.an_element')
   .delay(750)
   .qcss({ backgroundColor: 'skyblue' })
   .delay(750)
   .qcss({ backgroundColor: 'springgreen' })
   .delay(750)
   .qcss({ backgroundColor: 'pink' })
   .delay(750)
   .qcss({ backgroundColor: 'slategray' })
Run Code Online (Sandbox Code Playgroud)

这可以是定义链式动画的一种相当优雅的方式.请注意,在这个非常简单的形式中,qcss仅支持包含CSS属性的单个对象参数.(你需要做更多的工作才能支持.qcss('color', 'blue').)

这是jsfiddle 的一个例子.


jAn*_*ndy 12

添加到Ken Redler的回答/建议:

此外,您可能应该使用.hide()而不是.css('display','none').

你可以做 :

$('#tip').delay(800).hide(0);
Run Code Online (Sandbox Code Playgroud)

这里0很重要.传递值.hide()将隐式地将其添加到fx队列,因此,这将按预期工作.