如何以更优雅的方式写眨眼

时间:2012-05-11 03:25:40

标签: javascript jquery

目标:编写一个js(使用jquery),它将执行2次闪烁的行。

我目前拥有的是

var $second_row = $('table tr:eq(1)'),
    target_color = 'PaleGreen',
    original_color = $second_row.css('background-color');

$second_row.css('background-color', target_color);
scheduleOriginalColor();

function scheduleTargetColor() {
    setTimeout(function() {
        $second_row.css('background-color', target_color);
        scheduleOriginalColor(true);
    }, 500);
}

function scheduleOriginalColor(stop) {
    setTimeout(function() {
        $second_row.css('background-color', original_color);

        if (!stop) {
            scheduleTargetColor();
        }
    }, 500);
}
​

http://jsfiddle.net/zerkms/ecfMU/1/

但它看起来很难看,而且我确信有更好的方法可以写出相同的内容。

任何提案?

UPD :我的第二次尝试,更明确一点:http://jsfiddle.net/zerkms/ecfMU/2/

var $second_row = $('table tr:eq(1)'),
    target_color = 'PaleGreen',
    original_color = $second_row.css('background-color');

setRowColor(target_color, 500);
setRowColor(original_color, 1000);
setRowColor(target_color, 1500);
setRowColor(original_color, 2000);

function setRowColor(color, timing) {
    setTimeout(function() {
        $second_row.css('background-color', color);
    }, timing);
}
​

6 个答案:

答案 0 :(得分:7)

使用toggleClass和背景颜色尝试此操作:

var blink = setInterval(function() {
    $('table tr:eq(1)').toggleClass('highlight');
}, 500);
setTimeout(function() {
    clearInterval(blink);
}, 2100); // run 4 times, added a little padding time just in case
.highlight {
    background-color:PaleGreen;
}

演示:http://jsfiddle.net/ecfMU/10/

答案 1 :(得分:7)

以下内容可让您定义元素,颜色,闪烁次数和速度。另一个额外的好处是它不需要任何膨胀的jQuery。你总是喜欢原始的JavaScript。

function flashBG( e, c, x, z ) {
  var d = e.style.backgroundColor, i = 0, f = setInterval(function(){
    e.style.backgroundColor = ( e.style.backgroundColor == d ) ? c : d ;
    ++i == ( x * 2 ) && clearInterval( f );
  }, z );
}

这样称呼:

flashBG( document.body, "PaleGreen", 2, 500 );

演示:http://jsbin.com/axuxiy/3/edit

为了便于阅读,以下内容可能更具教育意义:

function flashBG( element, color, flashes, speed ) {
  var original = element.style.backgroundColor;
  var counter  = 0;
  var interval = setInterval(
    function() {
      if ( original === element.style.backgroundColor ) {
        element.style.backgroundColor = color; 
      } else {
        element.style.backgroundColor = original;
      }
      if ( ++counter == ( flashes * 2 ) ) {
        clearInterval( interval );
      }
    }, speed );
}

答案 2 :(得分:3)

Javascript不是我的强项 - 所以我可能会得到一些错误的语法。

编辑:Demonstration 编辑#2:易于扩展 - rainbow version

然而......一个非常简单的方法是使用数组中的颜色,使用带索引的int var。然后只有一个预定的功能,如:

//Somewhere else we have:
//var colorArray = blah... blah.. blahh, it has values [palegreen,regularwhite]

//blah blah scheduleColor(0);
//var numBlinks = 2;

//then for your scheduler
function scheduleColor(ind) {
    $second_row.css('background-color', colorArray[ind % colorArray.length]);
    if (ind < (colorArray.length * numBlinks) - 1) {
        setTimeout(function() {
            scheduleColor(ind + 1);
        }, 500);
    }
}

基本思想不是两个调度程序,而是一个迭代程序。另外,您可以轻松地将其设置为任意次数闪烁,或循环显示多种颜色。

哎呀,如果你愿意的话,你可以让它在彩虹中循环。

编辑了一些语法/更正。

答案 3 :(得分:2)

我给你的答案是韦斯利和里卡多的答案,所以我不能相信它。我是.delay()和.queue()以及.toggleClass()。我认为它最终会产生很多代码。

一些CSS:

.highlight {
    background-color:PaleGreen;
}

和JS:

var $second_row = $('table tr:eq(1)');

function blink(el) {
    el.addClass('highlight');
    for(i=0; i<3; i++) {
        el.delay(500).queue(function() {
            $(this).toggleClass('highlight');
            $(this).dequeue();
        });
    }
}

blink($second_row);​

The Fiddle

答案 4 :(得分:1)

var $second_row = $('table tr:eq(1)'),
    target_color = 'PaleGreen',
    original_color = $second_row.css('background-color');


$second_row.css('background-color', target_color).delay(500).queue(function(){
    jQuery(this).css('background-color', original_color);
});

工作: Fiddle

答案 5 :(得分:1)

你能添加jQuery UI吗?

如果是这样,您可以为背景设置动画以实现更平滑的过渡。

http://jsfiddle.net/ecfMU/18/