javascript制作计时器

    科技2022-07-10  121

    javascript制作计时器

    首先我们应该先想清楚计时器的特点 点击开始按钮时,开始计时 点击暂停按钮时,计时暂停 点击清除按钮时,计时器清零 然后我们开始写样式

    HTML+css部分

    <body> <div class="container"> <div class="timer"> <svg width="0" height="0" viexBox="0 0 0 0"> <defs> <g id="h"> <!-- g标签,用于把相关元素进行组合,给了这个组一个名称叫h,之后可以把h直接利用use引入 --> <path d="M20 0 A20 20 0 0 0 20 40 M20 0 L180 0 L180 40 L20 40 M180 0 A20 20 0 0 1 180 40"/> <!-- 利用画布画出横着的线 --> </g> </defs> <defs> <g id="v"> <!-- 同理给了一个名称叫v,之后也可以直接调用 --> <path d="M0 20 A20 20 0 0 1 40 20 M0 20 L0 200 L40 200 L40 20 M0 200 A20 20 0 0 0 40 200"/> <!-- 利用画布画出竖着的线 --> <!-- M是移动到x=0 y=20的位置开始,A是开始画两端的半圆,半径为20 --> </g> </defs> </svg> <div class="sec"> <!--创建一个盒子用来包裹计时器中的数字 --> <!--此计时器每99毫秒就进一秒,999秒又清零,所以需要五个svg画布--> <!--用一个div包裹着前三个秒数 --> <svg id="sec1" class="num-0" width="130" height="250" viewBox="0 0 260 520"> <!-- 创建一个svg文档片段,viewBox代表绘图区域,由空格或逗号分隔的4个值。 (min x, min y, width, height) --> <use class="segment a" xlink:href="#h" x="30" y="0"/> <use class="segment b" xlink:href="#v" x="220" y="30"/> <use class="segment c" xlink:href="#v" x="220" y="270"/> <use class="segment d" xlink:href="#h" x="30" y="480"/> <use class="segment e" xlink:href="#v" x="0" y="270"/> <use class="segment f" xlink:href="#v" x="0" y="30"/> <use class="segment g" xlink:href="#h" x="30" y="240"/> <!--use: 使用URI引用一个<G>,<svg>或其他具有一个唯一的ID属性和重复的图形元素 --> <!--然后利用此属性,把前面提前画好的横线和竖线拼凑出一个完整的八 --> </svg> <svg id="sec2" class="num-0" width="130" height="250" viewBox="0 0 260 520"> <use class="segment a" xlink:href="#h" x="30" y="0"/> <use class="segment b" xlink:href="#v" x="220" y="30"/> <use class="segment c" xlink:href="#v" x="220" y="270"/> <use class="segment d" xlink:href="#h" x="30" y="480"/> <use class="segment e" xlink:href="#v" x="0" y="270"/> <use class="segment f" xlink:href="#v" x="0" y="30"/> <use class="segment g" xlink:href="#h" x="30" y="240"/> </svg> <svg id="sec3" class="num-0" width="130" height="250" viewBox="0 0 260 520"> <use class="segment a" xlink:href="#h" x="30" y="0"/> <use class="segment b" xlink:href="#v" x="220" y="30"/> <use class="segment c" xlink:href="#v" x="220" y="270"/> <use class="segment d" xlink:href="#h" x="30" y="480"/> <use class="segment e" xlink:href="#v" x="0" y="270"/> <use class="segment f" xlink:href="#v" x="0" y="30"/> <use class="segment g" xlink:href="#h" x="30" y="240"/> </svg> </div> <div class="csec"> <!--在利用用一个div包裹着后两个秒数 --> <svg id="csec1" class="num-0" width="130" height="250" viewBox="0 0 260 520"> <use class="segment a" xlink:href="#h" x="30" y="0"/> <use class="segment b" xlink:href="#v" x="220" y="30"/> <use class="segment c" xlink:href="#v" x="220" y="270"/> <use class="segment d" xlink:href="#h" x="30" y="480"/> <use class="segment e" xlink:href="#v" x="0" y="270"/> <use class="segment f" xlink:href="#v" x="0" y="30"/> <use class="segment g" xlink:href="#h" x="30" y="240"/> </svg> <svg id="csec2" class="num-0" width="130" height="250" viewBox="0 0 260 520"> <use class="segment a" xlink:href="#h" x="30" y="0"/> <use class="segment b" xlink:href="#v" x="220" y="30"/> <use class="segment c" xlink:href="#v" x="220" y="270"/> <use class="segment d" xlink:href="#h" x="30" y="480"/> <use class="segment e" xlink:href="#v" x="0" y="270"/> <use class="segment f" xlink:href="#v" x="0" y="30"/> <use class="segment g" xlink:href="#h" x="30" y="240"/> </svg> <!--此计时器每99毫秒就进一秒,999秒又清零,所以需要五个svg画布--> </div> </div> <div class="buttons"> <!--用一个div包裹着三个按钮,分别代表开始,暂停,清除 --> <button id="start">Start</button> <button id="stop">Stop</button> <button id="reset">Reset</button> </div> </div> </body> *{ margin: 0; padding: 0; box-sizing: border-box; } /* 先把页面中的默认样式全部清空 */ .timer{ display: flex; justify-content: center; } /* 让外面包裹着数字的div弹性盒子,并居中 */ .timer div{ display: inline-block; margin: 40px; } .sec{ position: relative; } .sec svg , .csec svg{ display: inline-block; margin: 20px; } .sec::before, .sec::after{ content: ""; position: absolute; width: 40px; height: 40px; border-radius: 50%; top: 60px; right:-60px; background-color: red; } /* 利用伪类写中间的两个小圆点 */ .sec::before{ top: 160px; } .segment{ fill: rgb(255,0,0,0.1); /* 让总体的颜色变成透明 */ } .buttons{ display: flex; justify-content: center; } /* 让按钮也弹性盒子,并且居中 */ .buttons button{ padding: 10px 20px; margin: 60px; font-size: 1.2em; cursor: pointer; } .num-0 .a, .num-0 .b, .num-0 .c, .num-0 .d, .num-0 .e, .num-0 .f{ fill: red; } .num-1 .b, .num-1 .c{ fill: red; } .num-2 .a, .num-2 .b, .num-2 .d, .num-2 .e, .num-2 .g{ fill: red; } .num-3 .a, .num-3 .b, .num-3 .c, .num-3 .d, .num-3 .g{ fill: red; } .num-4 .b, .num-4 .c, .num-4 .f, .num-4 .g{ fill: red; } .num-5 .a, .num-5 .c, .num-5 .d, .num-5 .f, .num-5 .g{ fill: red; } .num-6 .a, .num-6 .c, .num-6 .d, .num-6 .e, .num-6 .f, .num-6 .g{ fill: red; } .num-7 .a, .num-7 .b, .num-7 .c{ fill: red; } .num-8 .a, .num-8 .b, .num-8 .c, .num-8 .d, .num-8 .e, .num-8 .f, .num-8 .g{ fill: red; } .num-9 .a, .num-9 .b, .num-9 .c, .num-9 .d, .num-9 .f, .num-9 .g{ fill: red; } /* 写1-9的类名,到特定数字的时候就颜色变红 */

    html和css的样式写完大致就是图片的样子,然后我们开始写javascript部分

    Javascript部分

    <script> let sec=0,csec=0,intv=null; document.getElementById("start").addEventListener('click',e=>{ start_timer(); }) // 获取到id为start的button按钮,并且为它增加点击事件,点击它的时候执行函数 start_timer(); document.getElementById("stop").addEventListener('click',e=>{ stop_timer(); }) // 获取到id为stop的button按钮,并且为它增加点击事件,点击它的时候执行函数stop_timer(); document.getElementById("reset").addEventListener('click',e=>{ reset_timer(); }) // 获取到id为reset的button按钮,并且为它增加点击事件,点击它的时候执行函数reset_timer(); function start_timer(){ if(intv) return; intv=setInterval(counting,10); } // 创建函数start_timer();让他如果等于intv这个变量的时候就返回,不然intv变量就执行定时器 function stop_timer(){ clearInterval(intv); intv=null; } // 创建函数 stop_timer();让它清除定时器,并且变量变回空 function reset_timer(){ stop_timer(); sec=0; csec=0; set_time(0,0); } // 创建函数 reset_timer();让他执行 stop_timer()函数,并且全部变量都为0 function counting(){ csec++; if(csec>99){ sec++; csec=0; } if(sec>999){ sec=0; csec=0; } set_time(sec,csec); } // 创建定时函数 counting();让他进来末尾的数开始++,如果大于99的时候,就让前三位开始加,它本身清零 // 如果sec大于999的时候,就都清零,从头开始执行 function set_time(sec,csec){ psec=sec.pad(3); pcsec=csec.pad(2); document.getElementById("sec1").setAttribute('class','num-'+psec.substr(0,1)); document.getElementById("sec2").setAttribute('class','num-'+psec.substr(1,1)); document.getElementById("sec3").setAttribute('class','num-'+psec.substr(2,1)); document.getElementById("csec2").setAttribute('class','num-'+pcsec.substr(1,1)); document.getElementById("csec1").setAttribute('class','num-'+pcsec.substr(0,1)); } // setAttribute() 方法添加指定的属性,并为其赋指定的值。如果这个指定的属性已存在,则仅设置/更改值。 // 设置函数set_time(sec,csec),去更改他的class值 Number.prototype.pad=function(size){ let a=String(this); while(a.length<size){ a="0"+a; } return a; } </script>

    然后我们的定时器就完成了 第一次写博客,可能有很多地方写的不对,希望大家可以包容一下 再此谢谢大家啦!

    Processed: 0.013, SQL: 8