用JS写了一个30分钟倒计时器

效果图

在这里插入图片描述

额外功能

  1. 左键单击计时器数字区,不显示或显示秒钟区。
  2. 左键双击计时器数字区,暂停或启动计时器。计时完毕,只能刷新页面启动计时器。
  3. 输入框可输入备注信息,输入框失去焦点或计时完毕后,时间戳附带备注信息会存入本地。
  4. 左键双击进度条区,可将导出历来使用计数器所处时间及备注信息。
  5. 两audio标签可填个人喜爱音频文件的路径作启动、结束时的音乐。

放码过来

<!DOCTYPE HTML>
<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/><title>Countdown Timer</title><style type="text/css">input{padding-bottom: 0px;padding-top: 0px;border-top-width: 0px;border-left-width: 0px;border-right-width: 0px;font-size: 20px;width:100%;}</style></head><body><span id="numbers" style="white-space:nowrap;"></span><table id="table1" ><tr><td style="background-color:rgb(41, 74, 155);padding:3px;"></td><td></td></tr><tr><td style="width:100%;" colspan=2><input id="content"/></td></tr><tr><td style="width:100%;" colspan=2><canvas id="myCanvas" height="6">Your browser does not support the canvas element.</canvas></td></tr></table><audio id='music'><source src="music/Windows XP 启动.wav" type="audio/mpeg">Your browser does not support the audio tag.</audio><audio id='music2'><source src="music/Windows XP 关机.wav" type="audio/mpeg">Your browser does not support the audio tag.</audio><script type="text/javascript" >var timer = {initMinutes:30,restSeconds:0,minute:0,second:0,handle:0,stopFlag:false,startTime:0,content:"asdasd",coverFlag:false,setFontSize:function(){document.getElementById("numbers").style.fontSize = (window.innerWidth|| document.documentElement.clientWidth|| document.body.clientWidth) / 3 + "px"},refreshTable:function(){//刷新进度条//第一条进度条var table = document.getElementById("table1")var span = document.getElementById('numbers')//table2.style.width = table.style.width = span.offsetWidth + "px"var progress = 1if(this.restSeconds > 0)progress = this.restSeconds / (this.initMinutes * 60)document.querySelector('#table1 td:nth-of-type(1)').style.width = progress * 100 + "%"var td2 = document.querySelector('#table1 td:nth-of-type(2)')if (progress < 1){td2.style.width = (1 - progress) * 100 + "%"}else{td2.style.display = "none"}//第二条进度条,用画布实现var canvas = document.getElementById('myCanvas')canvas.width = span.offsetWidthvar ctx = canvas.getContext("2d")var rectWeight = progress * span.offsetWidthctx.clearRect(0, 0, span.offsetWidth, 20)ctx.fillStyle = "#FF0000"//console.log("rectWeight: " + rectWeight)//console.log(progress * span.offsetWidth)ctx.fillRect(0, 0, rectWeight, 20)},init:function(){this.startTime = Date.now()var span = document.getElementById('numbers')this.setFontSize()this.restSeconds = this.initMinutes * 60 this.minute = this.initMinutesvar obj = thisthis.handle = setInterval(function(){if(obj.stopFlag)returnif(obj.restSeconds > 0){span.innerHTML = "" + (obj.minute < 10 ? "0" + obj.minute : obj.minute) + ":" + (!obj.coverFlag ? (obj.second < 10 ? "0" + obj.second : obj.second) : "&nbsp;".repeat(4))if(obj.restSeconds > 0){obj.restSeconds -= 1}obj.minute =  Math.floor(obj.restSeconds / 60)obj.second =  obj.restSeconds - obj.minute * 60//刷新进度条obj.refreshTable()}else{span.innerHTML = "Time "window.clearInterval(obj.handle)document.getElementById("music2").play()//跑完后记录var content = document.getElementById("content").valueobj.markdownRecord(content)//不停地闪烁window.setInterval(function(){span.innerHTML = (span.innerHTML == "Time ")?"is up.":"Time "}, 5000)}}, 1000)document.getElementById("music").play()var numbers = document.getElementById("numbers")numbers.addEventListener("click", function(){obj.coverFlag = !obj.coverFlag})numbers.addEventListener("dblclick", function(){obj.stopFlag = !obj.stopFlag})document.getElementById('content').addEventListener("blur", function(){if(obj.restSeconds > 0)returnvar content = document.getElementById("content").valueif(this.content != content){this.content = contentobj.markdownRecord(content)}})document.getElementById('table1').addEventListener("dblclick", function(){console.log("timerHistory:")console.log(localStorage.getItem('timerHistory'))console.log("\n")obj.exportHistory()})},markdownRecord:function(content){var records = []var timerHistory = localStorage.getItem("timerHistory")if(timerHistory != null){records = JSON.parse(timerHistory)}var lastRecord = records[0]if(lastRecord && lastRecord.start == this.startTime){lastRecord.note = content}else{var history = {start:this.startTime,duration:this.initMinutes,note:content}records.unshift(history)//数组头插入元素			}var recordsJson = JSON.stringify(records)//将结果存入本地localStorage.setItem("timerHistory", recordsJson)console.log(records[0])console.log("Marked it Down.")},exportHistory:function(){var filename = 'record' + Date.now() +'.txt'var text = localStorage.getItem('timerHistory')this.exportFile(filename, text)},exportFile:function(filename, text){var element = document.createElement('a');element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));element.setAttribute('download', filename);element.style.display = 'none';document.body.appendChild(element);element.click();document.body.removeChild(element);}}window.onresize = function(){timer.setFontSize()timer.refreshTable()}//pausewindow.onclick = function(){//timer.stopFlag = !timer.stopFlag}//mainwindow.onload = function(){timer.init()	}</script></body>
</html> 

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

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

相关文章

为什么高手离不了Linux系统?我想这就是理由!

通过本文来记录下我在Linux系统的学习经历&#xff0c;聊聊我为什么离不了Linux系统&#xff0c;同时也为那些想要尝试Linux而又有所顾忌的用户答疑解惑&#xff0c;下面将为你介绍我所喜欢的Linux系统&#xff0c;这里有一些你应该知道并为之自豪的事实。 这里你应该首先抛开W…

用JS写一个电影《黑客帝国》显示屏黑底绿字雨风格的唐诗欣赏器

效果图 放码过来 <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html;charsetutf-8"/><title>Black Screen And Green Characters</title><style type"text/css">table…

元器件封装大全:图解+文字详述

先图解如下&#xff1a; 元器件封装类型&#xff1a; A.Axial  轴状的封装&#xff08;电阻的封装&#xff09;AGP &#xff08;Accelerate raphical Port&#xff09; 加速图形接口 AMR(Audio/MODEM Riser) 声音/调制解调器插卡BBGA&#xff08;Ball Grid Array&#xff09;…

用JS写一个丐版《2048》小游戏

效果图 放马过来 <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html;charsetutf-8"/><title>2048</title><style type"text/css">.basic{height:80px;width:80px;back…

如何有效申请TI的免费样片

转自如何有效申请TI的免费样片 TI公司愿意为支持中国大学的师生们的教学、实验、创新实践、竞赛和科研项目&#xff0c;提供有限数量的免费样片。首先需要指出的是&#xff1a;所有的样片申请应该是诚实正当的&#xff0c;所有不恰当的申请&#xff08;包括不必要或多余的&…

用Python批量生成字幕图片用于视频剪辑

说明 视频剪辑时需要为视频添加字幕&#xff0c;添加字幕方法之一&#xff1a;根据字幕文本文件批量生成透明底只有字幕内容的图片文件&#xff0c;如下图&#xff0c;然后将这些图片文件添加到视频剪辑软件轨道中。 于是用pillow这Python图片工具库执行本次批量生成工作。 …

关于接地:数字地、模拟地、信号地、交流地、直流地、屏蔽地、浮

除了正确进行接地设计、安装,还要正确进行各种不同信号的接地处理。控制系统中&#xff0c;大致有以下几种地线&#xff1a; &#xff08;1&#xff09;数字地&#xff1a;也叫逻辑地&#xff0c;是各种开关量&#xff08;数字量&#xff09;信号的零电位。 &#xff08;2&…

AltiumDesigner中PCB如何添加 Logo

AltiumDesigner中PCB如何添加 Logo 转载2015-10-29 00:07:55标签&#xff1a;it文化教育首先用到的画图软件&#xff0c;当然是大家熟悉的Altium Designer了&#xff0c;呵呵&#xff0c;相信很多人都用过这款画图软件吧&#xff08;现在电路设计一直在用&#xff09;&#xff…

使用Ultra Librarian 生成PCB库文件

第一步&#xff1a;找到对应芯片的CAD文件&#xff0c;以OPA350为例&#xff1a; http://www.ti.com/product/opa350 第二步&#xff1a; 下载上图右边连接的 Ultra Librarian.zip &#xff0c; 然后根据提示&#xff0c;安装。 安装好后打开Ultra Librarian&#xff0c;会出现…

借汉诺塔理解栈与递归

我们先说&#xff0c;在一个函数中&#xff0c;调用另一个函数。 首先&#xff0c;要意识到&#xff0c;函数中的代码和平常所写代码一样&#xff0c;也都是要执行完的&#xff0c;只有执行完代码&#xff0c;或者遇到return&#xff0c;才会停止。 那么&#xff0c;我们在函…

qt超强绘图控件qwt - 安装及配置

qwt是一个基于LGPL版权协议的开源项目&#xff0c; 可生成各种统计图。它为具有技术专业背景的程序提供GUI组件和一组实用类&#xff0c;其目标是以基于2D方式的窗体部件来显示数据&#xff0c; 数据源以数值&#xff0c;数组或一组浮点数等方式提供&#xff0c; 输出方式可以是…

BFPRT

在一大堆数中求其前k大或前k小的问题&#xff0c;简称TOP-K问题。而目前解决TOP-K问题最有效的算法即是BFPRT算法&#xff0c;其又称为中位数的中位数算法&#xff0c;该算法由Blum、Floyd、Pratt、Rivest、Tarjan提出&#xff0c;最坏时间复杂度为O(n)O(n)。 读者要会快速排序…

HistCite 的使用方法

摘要 读文献自然要读精品&#xff0c;在面对一个陌生领域&#xff0c;如何才能以最快速度定位精品文献呢&#xff1f;本文将详细介绍 HistCite 的使用方法&#xff0c;结合 Web of Science 和 Endnote &#xff0c;演示如何在几个小时之内&#xff0c;对某个陌生领域的文献进行…

数据结构课上笔记7

介绍栈和队列基本概念和用法。 设输入序列1、2、3、4&#xff0c;则下述序列中&#xff08; &#xff09;不可能是出栈序列。【中科院中国科技大学2005】 A. 1、2、3、4 B. 4、 3、2、1 C. 1、3、4、2 D.&#xff14;、1、2、3 选…

ROC曲线与AUC值

ROC曲线与AUC值 1.概述AUC&#xff08;Area Under roc Curve&#xff09;是一种用来度量分类模型好坏的一个标准。这样的标准其实有很多&#xff0c;例如&#xff1a;大约10年前在machine learning文献中一统天下的标准&#xff1a;分类精度&#xff1b;在信息检索(IR)领域中常…

设置SSH免密码自动登录(使用别名)

每次登录服务器都要写一大串的用户名&#xff08;username服务器地址&#xff09;和登录密码十分的繁琐&#xff0c;所以本文就告诉大家如何通过修改配置文件&#xff0c;达到只需要输入&#xff1a;ssh jack(你起的别名)就可以一键登录到服务器中。 1.创建公钥&#xff08;相当…

串的定长表示

思想和代码都不难&#xff0c;和线性表也差不多&#xff0c;串本来就是数据受限的线性表。 串连接&#xff1a; #include <stdio.h> #include <string.h> //串的定长顺序存储表示 #define MAXSTRLEN 255 //用户可在255以内定义最大串长 typedef unsigned cha…

轻松理解牛顿迭代法且用其求平方根

牛顿迭代法概述 牛顿迭代法&#xff08;Newton’s method&#xff09;又称为牛顿-拉弗森方法&#xff08;Newton-Raphson method&#xff09;&#xff0c;它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。 牛顿迭代公式 设rrr是f(x)0f(x)0f(x)0的根&#…

如何使用cookie信息,完成自动登录

在做爬虫任务的时候&#xff0c;我们常常会遇到很多网页必须登录后&#xff0c;才可以开放某些页面。所以登录是爬取网页的第一步。但是&#xff0c;通过post表单&#xff08;包含用户名和密码&#xff09;的方法&#xff0c;对于那些不需要输入比较复杂的验证码的网页&#xf…

Spring Cloud 学习笔记(1 / 3)

Spring Cloud 学习笔记&#xff08;2 / 3&#xff09; Spring Cloud 学习笔记&#xff08;3 / 3&#xff09; ---01_前言闲聊和课程说明02_零基础微服务架构理论入门03_第二季Boot和Cloud版本选型04_Cloud组件停更说明05_父工程Project空间新建06_父工程pom文件07_复习Depend…