红绿灯倒计时

1、实现效果

绿(35秒)→黄(5秒)→红(30秒)→绿(35秒)…依次循环

2、代码分析

首先编写html代码要用到盒子模型,还要用css来布置盒子模型的样式。其次编写JavaScript代码,先创建红、黄、绿灯对象,保存相关数据,设置信号背景灯样式。然后创建倒计时对象,实现倒计时的时间设置。初始化页面,根据lamp对象和count对象分别获取并设置绿灯亮时的页面初始化。实现红绿灯倒计时,利用setInterval()函数完成信号灯倒计时的动态改变效果。

3、代码实现
3.1 编写HTML代码
<body>
		<div class="box">
			<div id="red"></div>  <!-- 红灯 -->
			<div id="yellow"></div>  <!--黄灯 -->
			<div id="green"></div>  <!-- 绿灯 -->
			<div id="count" class="count"></div>  <!-- 倒计时 -->
		</div>
3.2 编写盒子模型样式

两种样式编写均可实现

<style>
		/* .box{width:250px;height:52px;padding:15px 30px;border:2px solid #ccc;border-radius:16px;margin:0 auto;}
		.box .count{width:60px;color:#666;font-size:280%;line-height:50px;padding-left:6px;margin-left:5px;border:1px solid #fff}
		.box div{margin-left:5px;float:left;width:50px;height:50px;border-radius:50px;border:1px solid #666;}
		.gray{background-color:#eee;}
		.red{background-color:red;}
		.yellow{background-color:yellow;}
		.green{background-color:#26ff00;} */
		.box{width:290px;height:70px;border-radius:10px;border:1px solid black;}
		.box div{float:left;margin-left:20px;width:45px;height: 45px;border-radius: 45px;border:1px solid purple;margin-top: 10px;}
		.box .count{width: 60px;border: 0px;font-size: 280%;}
		.red{background-color:red ;}
		.yellow{background-color: yellow;}
		.green{background-color: green;}
	</style>
3.3 创建红绿灯对象
var lamp={
				red:{  //红灯相关数据
					obj:document.getElementById("red"),					
					timeout:30,
					style:['red','gray','gray'],
					next:'green'
				},
				yellow:{  //黄灯相关数据
					obj:document.getElementById("yellow"),
					timeout:5,
					style:['gray','yellow','gray'],					
					next:'red'
				},
				green:{  //绿灯相关数据
					obj:document.getElementById("green"),
					timeout:35,
					style:['gray','gray','green'],					
					next:'yellow'
				},
				changeStyle(style){  //设置信号背景色样式
					this.red.obj.className=style[0];
					this.yellow.obj.className=style[1];
					this.green.obj.className=style[2];
				}				
			};

obj:存储信号灯的元素对象;
timeout:存储对应信号灯剩余亮灯时间;
style:存储某信号灯亮时,红绿灯元素背景色的class名称,数组元素 保存的信号灯顺序为红黄绿;
next:存储下一次亮灯的信号灯。

3.4 创建倒计时对象
var count={
				obj:document.getElementById('count'),  //倒计时的元素对象
				change:function(num){
					this.obj.innerHTML=(num<10)?('0'+num):num;
				}
			};

change()方法的参数num表示信号灯的倒计时时间,并以两位数字的格式将num显示到对应位置。

3.5 初始化页面
var now=lamp.green;           //获取绿灯亮的相关数据
			var timeout=now.timeout;      //获取绿灯亮灯的剩余时间
			lamp.changeStyle(now.style);  //设置绿灯亮时,红绿灯背景色样式
			count.change(timeout);        //设置绿灯亮灯的剩余时间
3.6 实现红绿灯倒计时
setInterval(function(){
				if(--timeout<=0){         //切换信号灯
					now=lamp[now.next];   //获取下一个亮灯的信号灯的相关数据
					timeout=now.timeout;  //获取信号灯的剩余时间
					lamp.changeStyle(now.style); //设置信号灯背景色样式
				}
				count.change(timeout);    //设置信号灯亮灯的剩余时间
			},1000);

利用setInterval()函数,在初始化页面后每隔1秒钟间歇调用一次匿名函数。若当前亮灯的剩余时间减1小于等于0后,切换信号灯,重新获取信号灯样式及亮灯的剩余时间。