在jQuery中,如何在css()中使用多个delay()方法?

时间:2011-03-02 00:12:18

标签: javascript jquery javascript-events

如何实现以下目标,了解如果只有一个延迟我可以使用setTimeout:

$(this).css().delay().css().delay().css();

编辑:

改变的CSS值是非数字的。

4 个答案:

答案 0 :(得分:4)

jQuery“.delay()”API是关于“效果队列”的。它实际上立即返回。

执行此操作的唯一方法是,如果您动画CSS更改,则使用“setTimeout()”。

可能使事情更愉快的一件事是将CSS更改构建到数组中:

var cssChanges = [
  { delay: 500, css: { backgroundColor: "green", fontSize: "32px" }},
  { delay: 1000, css: { backgroundColor: "blue", textDecoration: "underline" }},
  { delay: 750, css: { position: "relative", marginLeft: "5px" }}
];

然后,您可以使用单个例程遍历具有所需延迟的列表:

function doChanges(cssChanges) {
  var index = 0;
  function effectChanges() {
    $('whatever').css(cssChanges[index].css);
    if (++index < cssChanges.length) {
      setTimeout(doChanges, cssChanges[index].delay);
    }
   }
   setTimeout(effectChanges, cssChanges[0].delay);
 }

如果你愿意,你可以将它变成一个插件,不过如果你打算这样做,最好弄清楚如何让你的插件与jQuery中现有的动画队列设施一起玩。

答案 1 :(得分:3)

delay() only works with animation,IIRC。

这对你有用:)

// Delay to CSS Properties
var cssChanges = [
    {
    delay: 500,
    css: {
        color: 'red'
    }},
{
    delay: 1500,
    css: {
        color: 'blue'
    }},
{
    delay: 500,
    css: {
        color: 'yellow'
    }}
];

var element = $('div'),
    lastDelay = 0;

$.each(cssChanges, function(i, options) {
    lastDelay += parseInt(options.delay);
    setTimeout(function() {
        element.css(options.css);
    }, lastDelay);
});

jsFiddle

更新

你也可以把它变成一个jQuery插件。

$.fn.delayCss = function(cssChanges) {
    $(this).each(function() {
        var element = $(this),
            lastDelay = 0;
        $.each(cssChanges, function(i, options) {
            lastDelay += parseInt(options.delay);
            setTimeout(function() {
                element.css(options.css);
            }, lastDelay);
        });

    });
}

jsFiddle

答案 2 :(得分:2)

css不是效果,它立即发生。如果您想要在交错时间进行多次css更改,setTimeout正是您想要的:

var $target = $("#target");
$target.css("color", "blue");
setTimeout(function() {
  $target.css("color", "red");
  setTimeout(function() {
    $target.css("color", "green");
  }, 500);
}, 500);

Live example

如果您尝试使用css做的事情可以用animate代替(例如,数字属性而不是上面的颜色),那么如果您使用了代码,那么您的代码将会很有效animate取代css

$("#target")
  .animate({paddingLeft: "50px"})
  .delay(500)
  .animate({paddingLeft: "25px"})
  .delay(500)
  .animate({paddingLeft: "0px"});

Live example

答案 3 :(得分:1)

您仍然可以使用setTimeout。你只需要其中几个。

或者您可以.animate()使用0代替.css()而不是$(this).animate({prop:'value'},0).delay(1000) .animate({prop:'value'},0).delay(1000) .animate({prop:'value'},0);

示例: http://jsfiddle.net/6sewU/

.animate()

请注意,如果您使用{{1}}设置颜色,则需要安装jQueryUI。