【Html】交通灯问题

效果

实现方式

  • 计时器:setTimeoutsetInterval来计时。setIntervalsetTimeout 在某些情况下可能会出现计时不准确的情况。这通常是由于JavaScript的事件循环机制和其他代码执行所需的时间造成的。
  • 问询:通过getCurrentLight将每个状态的持续时间设置为精确的值,并使用requestAnimationFrame来递归调用getCurrentLight函数,我们可以更准确地控制交通灯的状态。

源码

index.html

html 复制代码
<!DOCTYPE html>
<html>
  <head>
    <title>交通灯</title>
    <link type="text/css" rel="styleSheet" href="./index.css" />
  </head>
  <body>
    <div class="traffic-light">
      <div class="traffic-container">
        <div class="light green"></div>
        <div class="light yellow"></div>
        <div class="light red"></div>
      </div>
      <div class="time">90</div>
    </div>
    <script type="module">
      import {TrafficLight} from './TrafficLight.js';
      const time = document.querySelector('.time');
      const trafficDom = document.querySelector('.traffic-light');
      const light = new TrafficLight(
        {
          red:3,
          yellow:2,
          green:5,
          initial:'red',
        }
      );
      function raf(){
        requestAnimationFrame(()=>{
          raf();
          const current = light.getCurrentLight();
          time.textContent =current.remain;
          trafficDom.className = `traffic-light ${current.color}`;
          console.log(current.color,current.remain);
        })
      }
      raf();

    </script>
  </body>
</html>

index.css

css 复制代码
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body{
  width: 100vw;
  height: 100vh;
  margin: 0;
  /* backgroud: #191c29 */
  background: #fff;
}

.traffic-light{
  width: 200px;
  margin: 10px auto;
  -webkit-box-flex: inherit;
  text-align: center;
}


.light{
  width: 20px;
  height: 20px;
  border-radius: 10px;
  display:inline-block;
  background-color: gray;
  margin: 10px auto;
}

.red .red{
  background-color: red;
}

.green .green{
  background-color: green;
}
.yellow .yellow{
  background-color: yellow;
}

.time{
  font-family: 'DS-Digital';
  font-size: 40px;
}

TrafficLight.js

js 复制代码
export class TrafficLight {
  constructor(options) {
    const {
      red = 60,
      green = 60,
      yellow = 3,
      initial = 'green',

    } = options || {};
    this._colors ={
      red:{
        seconds: red,
        next:'yellow',
      },
      green:{
        seconds: green,
        next:'yellow',
      },
      yellow:{
        seconds : yellow,
      },
    };
    this._switch(initial);
  }

  _switch(color){
    this._currentColor = color;
    this._seconds = this._colors[color].seconds;
    this._time = Date.now();
  }

  _next(){
    if(this._currentColor === 'red'){
      this._colors.yellow.next = 'green';
    }  
    else if(this._currentColor === 'green'){
      this._colors.yellow.next = 'red';
    } 
    else{
    }
    this._switch(this._colors[this._currentColor].next);
}
  getCurrentLight(){
    const remain = Math.ceil(this._seconds -(Date.now() - this._time)/1000);
    if(remain<=0){
      this._next();
      return this.getCurrentLight();
    }
    return {
      color: this._currentColor,
      remain,
    };
  }


}

字体 DS-Digital

++下载字体 DS-Digital++
注意:下载安装字体后需要重启浏览器才生效

相关推荐
盼兮*2 天前
Python调用星火认知大模型API(流式传输)
开发语言·python·flask·request
LuckyLay1 个月前
Spring学习笔记_38——@RequestParam
笔记·学习·spring·param·request
eno_zeng1 个月前
工具类-基于 axios 的 http 请求工具 Request
前端·javascript·request
曾经的三心草1 个月前
Request和Response
javaweb·request·response·登录与注册实例
胡西风_foxww2 个月前
nodejs爬虫系统
爬虫·nodejs·node·系统·express·request·cheerio
不修×蝙蝠2 个月前
请求转发和重定向
请求转发·request·response·重定向
一雨方知深秋3 个月前
http增删改查四种请求方式操纵数据库
数据库·git·python·mysql·http·flask·request
前端小茶馆3 个月前
如何避免旧请求的数据覆盖掉最新请求
request
醉颜凉4 个月前
页面间对象传递的几种方法
java·面试·cookie·request·session·application
赢乐4 个月前
axios取消请求CancelToken的原理解析及用法示例
取消请求·request·config·canceltoken·axios实例·interceptors·路由导航守卫