如何以更优雅的方式写眨眼
How to write blinking in more elegant way
目标:编写一个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);
}
试试这个,使用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/
以下内容可让您定义元素、颜色、闪光次数和速度。另一个额外的好处是它不需要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 );
}
Javascript不是我的强项 - 所以我可能会弄错一些语法。
编辑:演示编辑#2:易于扩展 - 彩虹版本
然而。。。一种非常简单的方法是将颜色放在一个数组中,以及一个带有索引的 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);
}
}
基本思想不是两个调度程序,而是一个迭代程序。另外,你可以轻松地将它设置为闪烁任意次数,或者循环切换多种颜色。
哎呀,如果你愿意,你可以让它在彩虹中循环。
针对某些语法/更正进行了编辑。
我对你的回答是卫斯理和李嘉图的答案的结合,所以我不能为此付出太多的功劳。 我是 .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);
小提琴
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);
});
工作 : 小提琴
你能添加jQuery UI吗?
如果是这样,您可以对背景进行动画处理以获得更平滑的过渡。
http://jsfiddle.net/ecfMU/18/
- 为什么这在IE中的工作方式与在Firefox中不同
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 用字符串和数字写视频源URL的正确方式是什么
- 如何以更优雅的方式写眨眼
- AngularJS-这是写指令的正确方式吗
- 一个更优雅的方式来写这个.地图调用
- 什么是最好的方式来写Java脚本类
- 什么是最短最神秘的方式来写这个索引检查多个字符
- 更有效的方式来写这个javascript
- 什么是正确的方式来写我的脚本'src'本地开发环境的Url
- 最好的方式,可视化的图形数据结构写在一个网页上的Java良好的图形
- 如何写这段代码的最佳方式,这在javascript中有这么多的if条件
- 如何写自定义扩展谷歌地图在一个干净的方式
- 写一个coffeescript函数,将json数组转换成我想要的格式,这是一种简洁的方式
- 我如何写javascript Regex在这样的方式,它接受6个字符
- 一个更干净的方式来写我当前的javascript代码
- 写一个轮询方法的最佳(正确)方式是什么?AngularJS)
- 如何用更复杂的方式来写
- 写回退选择器的更好方式
- 是否有一种可能的方式来写当前的月份和年份在时间轴脚本