【Html】交通灯问题

news2024/9/29 17:37:29

效果

在这里插入图片描述

实现方式

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

源码

index.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

* {
  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

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
注意:下载安装字体后需要重启浏览器才生效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解密分布式事务:CAP理论、BASE理论、两阶段提交(2PC)、三阶段提交(3PC)、补偿事务(TCC)、MQ事务消息、最大努力通知

文章目录 &#x1f34a; CAP理论&#x1f34a; BASE理论&#x1f34a; 两阶段提交&#xff08;2PC&#xff09;&#x1f389; XA事务 &#x1f34a; 三阶段提交&#xff08;3PC&#xff09;&#x1f34a; 补偿事务&#xff08;TCC&#xff09;&#x1f34a; MQ事务消息&#x1…

web开发初级工程师学习笔记ing(持续更新)!!!

web开发初级工程师学习笔记 前端开发工具实验1 VS Code 初体验介绍 前端开发工具 实验1 VS Code 初体验 介绍 VS Code 环境提供的是一个可以在浏览器中使用原生 VS Code 编辑代码的程序。在该环境中&#xff0c;你可以使用到与本地安装近乎一致的 VS Code 程序来编辑代码文件…

计算机网络(谢希仁)第八版课后题答案(第二章)

1.物理层要解决哪些问题&#xff1f;物理层的主要特点是什么&#xff1f; (1)物理层要尽可能地屏蔽掉物理设备和传输媒体&#xff0c;通信手段的不同&#xff0c;使数据链路层感觉不到这些差异&#xff0c;只考虑完成本层的协议和服务。 (2)给其服务用户&#xff08;数据链路…

IO多路复用技术

IO多路复用 一、概念 IO多路复用技术 是一种 网络通信 的方式&#xff0c;通过这种方式可以同时检测多个 文件描述符&#xff08;这个过程是阻塞的&#xff09;&#xff0c;一旦检测到某一个文件描述符&#xff08;状态是 可读 或者 可写 的&#xff09;是就绪的&#xff0c;…

苏州健雄职业技术学院人工智能学院学生在“火焰杯”软件测试开发选拔赛总决赛获奖

3月22日&#xff0c;第三届“火焰杯”软件测试开发选拔赛颁奖仪式在人工智能学院D2-102机房举行&#xff0c;软件工程20级学生和软件测试社团全体社团成员参加本次活动。本次活动由测吧&#xff08;北京&#xff09;科技有限公司项目总监王雪冬担任颁奖嘉宾&#xff0c;并为同学…

使用Windows平台的Hyper-V虚拟机安装CentOS7的详细过程

Hyper-V虚拟机安装CentOS7 前言常见Linux系统CentOSUbuntuDebianKaliFedoraArch LinuxMintManjaroopenSUSE Hyper-V开启Hyper-V打开Hyper-V Hyper-V的使用新建虚拟机开始安装分区配置开始安装 修改yum源为阿里源 前言 作为一名开发者&#xff0c;就服务器而言&#xff0c;接触最…

SpringMVC 报文信息转换器(HttpMessageConverter)

文章目录 描述1、RequestBody2、RequestEntity3、ResponseBody4、SpringMVC处理json5、SpringMVC处理ajax6、RestController注解7、ResponseEntity 描述 HttpMessageConverter&#xff0c;报文信息转换器&#xff0c;将请求报文转换为Java对象&#xff0c;或将Java对象转换为响…

Linux:firewalld防火墙-(实验2)-IP伪装与端口转发(4)

实验环境 本章实验环境要建立在上一章之上&#xff0c;ip等都是继承上一章&#xff0c;完全在上一章之下的操作 Linux&#xff1a;firewalld防火墙-小环境实验&#xff08;3&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/133996151?spm1001.2014.3…

动态链接函数(dlopen/dlsym/dlclose)使用总结

一、简介 动态链接函数操作&#xff08;显式运行时链接&#xff09;主要包含头文件dlfcn.h&#xff08;/usr/include/dlfcn.h&#xff09;&#xff0c;涉及的常用的函数主要有dlopen&#xff0c;dlysm&#xff0c;dlclose。主要作用是从动态库中加载函数到程序中使用&#xff…

shell脚本条件语句(极其粗糙版)

条件测试操作和条件测试语句&#xff1a; $?:条件判断&#xff0c;失败或者成功&#xff0c;真或者假&#xff0c;true false shell脚本中&#xff1a;0为真&#xff0c;true 执行成功&#xff1b;其他所有的非0 都是假&#xff0c; false&#xff0c;执行失败 条件测试的命…

如何禁止员工上班玩游戏

如何禁止员工上班玩游戏 在这个游戏盛行的年代里&#xff0c;不少游戏玩家会玩到忘我的状态&#xff0c;也有不少员工在上班的时候也要玩上两把&#xff0c;但是公司是雇佣员工的时间是来工作的&#xff0c;出现这种情况很显然是对公司不利的&#xff0c;会严重影响工作效率和…

Python print 函数用法总结

Python3 print 函数用法总结 一、print()函数概述 print() 方法用于打印输出&#xff0c;是python中最常见的一个函数。 print([*objects][,seq ][,end\n][,filesys.stdout]) 参数的具体含义如下&#xff1a; objects --表示输出的对象。输出多个对象时&#xff0c;需要用…

MySQL---表的增查改删(CRUD基础)

文章目录 什么是CRUD&#xff1f;新增&#xff08;Create&#xff09;单行数据 全列插入多行数据 指定列插入 查询&#xff08;Retrieve&#xff09;全列查询指定列查询查询字段为表达式起别名查询去重查询排序查询条件查询分页查询 修改&#xff08;Update&#xff09;删除&…

新手如何备考学习PMP?

一、PMP学习7步走攻略 1、熟悉考试大纲&#xff1a; PMP考试大纲是备考的基础&#xff0c;考生需要详细熟悉考试大纲&#xff0c;了解各个知识领域的重点和难点。 2、制定学习计划&#xff1a; 根据考试大纲和个人情况&#xff0c;制定学习计划&#xff0c;合理分配学习时间…

stm32移植u8g2库内存不足解决办法

1.现象 跟着视频教程移植完u8g2库到stm32f103c8t6后&#xff0c;进行编译&#xff0c;报了100多个空间不足的问题&#xff0c;如下图。 ..\Output\Output.axf: Error: L6406E: No space in execution regions with .ANY selector matching u8g2_fonts.o(.constdata). ..\Outp…

蓝天远控2023(VIP会员版)

蓝天远控2023&#xff08;VIP会员版&#xff09;下载地址&#xff1a;https://user.qzone.qq.com/512526231/main

【逆向】导入表注入

练手的exe链接 链接&#xff1a;https://pan.baidu.com/s/1_87QNHaZYlfY_5uwIRePUQ?pwd6gds 提取码&#xff1a;6gds 原理&#xff1a; 在动态链接库一章提到DllMain&#xff0c;这里再回顾一次 当dll被加载进4GB空间时&#xff0c;会调用一次DllMain&#xff08;入口方法&…

在家制作电子相册一定需要的一款工具

​随着科技的发展&#xff0c;越来越多的人开始喜欢在家制作电子相册&#xff0c;记录自己的生活点滴。那么&#xff0c;如何在家制作电子相册呢&#xff1f; 一款好的工具是必不可少的。可以使用这款工具&#xff0c;轻松上手----FLBOOK在线制作电子杂志平台 1.打开FLBOOK在线…

手撕Vue-实现事件相关指令

经过上一篇文章的学习&#xff0c;实现了界面驱动数据更新&#xff0c;接下来实现一下其它相关的指令&#xff0c;比如事件相关的指令&#xff0c;v-on 这个指令的使用频率还是很高的&#xff0c;所以我们先来实现这个指令。 v-on 的作用是什么&#xff0c;是不是可以给某一个元…

SpringCloud复习:(3)LoadBalancerInterceptor

使用Ribbon时&#xff0c;execute方法会由RibbonLoadBalancerClient类来实现 它会调用重载的execute方法 getLoadBalancer默认会返回ZoneAwareLoadBalancer&#xff08;基类是BaseLoadBalancer).此处调用的getServer方法就会根据负载均衡策略选择适当的服务器来为下一步的htt…