JavaScript のお勉強でストップウォッチを作ってみた
JavaScript を勉強する機会があったので、ストップウォッチを作ってみました。
タスク名を入力する欄があり、現在時刻、経過時間と一緒に記録することができるので、「あのタスクに何分くらいかかったか記録しておきたい」というときに使えるかもしれません。もしくは、カップ麺を食べる際のお供にどうぞw
![[画像] JavaScriptによるストップウォッチ](http://www.kagitaku.com/diary/images/100708_js-stopwatch.png)
はい、上のはダミーでただの画像ですw すみませんw 下にあるのが本物です。本物のほうは見た目がかわいそうになっていますが、ダウンロードできる一式は上の画像のような見た目になります。
JavaScriptによるストップウォッチ
- スタート時刻と現在時刻の差分から経過時間を算出します
- ラップを記録することができます
- タスク名を記入すれば、記録日時とタスク名、そして経過時間を記録します
自分のサイトに載せたいとか、ダウンロードしてローカルで使いたいとか、そういう奇特な方がもしいらっしゃったら、以下のリンクからダウンロードできます(まとめて ZIP ファイルにしてありますのでダウンロード後に解凍してください)。特に制限とかもないので、常識の範囲内でご自由にお使いください。
» 「JavaScriptによるストップウォッチ」のファイル一式をダウンロード
おまけ:HTML、CSS、JavaScript のソース
HTML
HTML ファイルの中身は以下のような感じです。ダウンロードできるほうのソースです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml"> <head> <title>JavaScriptのお勉強でストップウォッチを作ってみた | きにきじ</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Language" content="ja" /> <meta http-equiv="X-UA-Compatible" content="chrome=1" /> <link rel="stylesheet" type="text/css" href="style.css" media="all" /> </head> <body> <div id="wrapper"> <h1>JavaScriptによるストップウォッチ</h1> <ul> <li>スタート時刻と現在時刻の差分から経過時間を算出します</li> <li>ラップを記録することができます <ul> <li>タスク名を記入すれば、記録日時とタスク名、そして経過時間を記録します</li> </ul></li> </ul> <form action="#" name="formStopWatch" id="formStopWatch"> <h2>タスク名:<input type="text" name="taskDisplay" id="taskDisplay" /></h2> <p class="center"><input type="text" value="00:00'00^00" name="timeDisplay" id="timeDisplay" /></p> <p class="center"><input type="button" value="スタート" name="buttonStartStop" id="buttonStartStop" onclick="return startOrStop()" /> <input type="button" value="リセット" name="buttonResetLap" id="buttonResetLap" onclick="return resetOrLap()" /></p> <h2>Lap 履歴</h2> <p><textarea name="lapDisplay" id="lapDisplay" rows="10" cols="40"></textarea></p> <p><input type="button" value="ラップをクリア" name="buttonLapClear" id="buttonLapClear" onclick="return lapClear()" /></p> </form> </div> <!-- JavaScript --> <script type="text/javascript" src="function.js" charset="UTF-8"></script> </body> </html> |
CSS
上のようなひどい見た目ではなくもう少しだけましな見た目にするための CSS です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | @charset "UTF-8"; /*-------------------------------------------------- Initialize Browser's Default Style --------------------------------------------------*/ * { margin: 0; padding: 0; color: #333; font-family: "Meiryo UI", "メイリオ", Meiryo, "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", Osaka, "MS Pゴシック", "MS UI Gothic", Verdana, Arial, sans-serif; } /*-------------------------------------------------- Define Main Selectors --------------------------------------------------*/ body { margin: 0; background-color: #ffffff; text-align: left; } h1 { margin: 20px 10px 10px 10px; padding: 3px 5px 3px 7px; padding: 8px 5px 8px 15px; border-top: 2px solid #10688a; border-bottom: 1px solid #10688a; background: url(bg-mainCaption.png) no-repeat; color: #10688a; line-height: 130%; font-size: 130%; text-shadow: 0px 1px 1px #10688a; } h2 { margin: 15px 10px 10px 15px; padding: 4px 5px; border-top: 1px solid #ebebeb; border-left: 5px solid #ed9f49; border-right: 1px solid #ebebeb; border-bottom: 1px solid #ebebeb; background-image: url(slash.png) !important; background-image: url(slash_ie6.png); line-height: 130%; font-size: 110%; text-shadow: 1px 1px 1px gray; } p { margin: 0 15px 10px 25px; padding: 0; font-size: 100%; line-height: 130%; text-align: left; } ul { list-style-type: none; margin: 0 10px 10px 40px; line-height: 130%; } ul li { padding: 0 0 0 17px; background: url(list-icon.png) no-repeat left 3px; } ul li ul, ol li ol { margin: 0 0 5px 3px; } .center { text-align: center; } /*-------------------------------------------------- Form Elements --------------------------------------------------*/ input, textarea { padding: 2px 5px; font-size: 100%; } #taskDisplay { width: 320px; } #timeDisplay { width: 200px; text-align: center; font-size: 120%; } #lapDisplay { width: 430px; height: 200px; } #taskDisplay, #timeDisplay, #lapDisplay { border: 2px solid #ccc; background: url(form-bg-shadow.png) repeat-x; } #taskDisplay:focus, #timeDisplay:focus, #lapDisplay:focus { border: 2px solid #edb475; } #buttonStartStop, #buttonResetLap, #buttonLapClear { height: 30px; } #buttonStartStop, #buttonResetLap { width: 100px; } /*-------------------------------------------------- Others --------------------------------------------------*/ div#wrapper { margin: 0 auto; width: 500px; } |
JavaScript
ちなみに、JavaScript の中身は以下のような感じです。最初、10ミリ秒ごとにカウントを増やしていって、1秒になったら秒を1カウントアップして10ミリ秒を0に、1分になったら分を1カウントアップして秒を0に、1時間になったら時間を1カウントアップして分を0に……ということをやったのですが、これだと時間が経つうちに微妙に遅れてしまうので、結局、スタート時刻と現在時刻の差分から経過時間を算出するというやり方にしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | /* * ストップウォッチ機能 * スタート時刻と現在時刻の差分から経過時間を算出する * ラップを記録することが可能 * タスク名を記入すれば記録日時とタスク名、そして経過時間を記録する */ //グローバル変数を宣言 var fsw = document.formStopWatch; //ストップウォッチ用フォーム var tbTime = fsw.timeDisplay; //経過時間のテキストボックス var tbLap = fsw.lapDisplay; //ラップを記録するテキストボックス var myTime; //時間の差分をとるための変数 var myChk = 0; //スタート/ストップのチェック用変数 //経過時間をカウント function count() { //現在時刻を記録 var nowDate = new Date(); var nowH = nowDate.getHours(); //時 var nowM = nowDate.getMinutes(); //分 var nowS = nowDate.getSeconds(); //秒 var nowT = Math.floor(nowDate.getMilliseconds() / 10); //10ミリ秒 var nowTime = nowH * 60 * 60 * 100 + nowM * 60 * 100 + nowS * 100 + nowT; //現在時刻総合 //現在時刻から、スタート時刻を引く var diffTime = nowTime - myTime; var h = Math.floor(diffTime / (60 * 60 * 100)); //時 diffTime = diffTime - (h * 60 * 60 * 100); //分取得のため変換 var m = Math.floor(diffTime / (60 * 100)); //分 diffTime = diffTime - (m * 60 * 100); //秒取得のため変換 var s = Math.floor(diffTime / 100); //秒 var t = diffTime % 100; //10ミリ秒 //経過時間を数値から文字列に変換して再セット var hs = String(h); //時 var ms = String(m); //分 var ss = String(s); //秒 var ts = String(t); //10ミリ秒 //経過時間が1桁であれば10の位に "0" を加える hs = (h < 10)? "0" + hs: hs; //時 ms = (m < 10)? "0" + ms: ms; //分 ss = (s < 10)? "0" + ss: ss; //秒 ts = (t < 10)? "0" + ts: ts; //10ミリ秒 //経過時間を書き込む tbTime.value = hs + ":" + ms + "'" + ss + "^" + ts; document.title = hs + ":" + ms + "'" + ss + " - JavaScriptのお勉強でストップウォッチを作ってみた | きにきじ"; } //時間計測を開始する/停止する function startOrStop() { //チェックが "0" ならば=計測中でないならば if (myChk===0) { //テキストボックスより数値を取得 var getH = tbTime.value.substr(0, 2); //時 var getM = tbTime.value.substr(3, 2); //分 var getS = tbTime.value.substr(6, 2); //秒 var getT = tbTime.value.substr(9, 2); //10ミリ秒 //経過時間がちゃんと "XX:XX'XX^XX" の形式になっているなら if (tbTime.value.substr(2, 1)===":" && tbTime.value.substr(5, 1)==="'" && tbTime.value.substr(8, 1)==="^" && !getH.match(/[^0-9]/g) && !getM.match(/[^0-9]/g) && !getS.match(/[^0-9]/g) && !getT.match(/[^0-9]/g)) { //ボタンの表示を変更してチェックを "1" にする fsw.buttonStartStop.value = "ストップ"; fsw.buttonResetLap.value = "ラップ"; myChk = 1; //スタート時刻を記録 var startDate = new Date(); var startH = startDate.getHours(); //時 var startM = startDate.getMinutes(); //分 var startS = startDate.getSeconds(); //秒 var startT = Math.floor(startDate.getMilliseconds() / 10); //10ミリ秒; var startTime = startH * 60 * 60 * 100 + startM * 60 * 100 + startS * 100 + startT; //スタート時刻総合 //経過時間を文字列から数値に変換してスタート時刻から引く var getTime = parseFloat(getH) * 60 * 60 * 100 + parseFloat(getM) * 60 * 100 + parseFloat(getS) * 100 + parseFloat(getT); //テキストボックスの数値総合 myTime = startTime - getTime; //カウント開始(10ミリ秒ごと) timer = setInterval("count()", 10); //経過時間の形式が間違っていれば } else { window.alert("時間が不正です。\"XX:XX'XX^XX\" の形式にしてください。"); } //チェックが "1" ならば=計測中ならば } else { //ボタンの表示を変更してチェックを "0" にする fsw.buttonStartStop.value = "スタート"; fsw.buttonResetLap.value = "リセット"; myChk = 0; //カウント停止 clearInterval(timer); } } //経過時間をリセットする/ラップを記録する function resetOrLap() { //チェックが "0" ならば=計測中でないならば if (myChk===0) { //経過時間をリセット tbTime.value = "00:00'00^00"; document.title = "JavaScriptのお勉強でストップウォッチを作ってみた | きにきじ"; //チェックが "1" ならば=計測中ならば } else { //テキストボックスから経過時間とタスク名を取得 var lapTime = tbTime.value + "\n"; //時間 var taskName = "「" + fsw.taskDisplay.value + "」 "; //タスク名 //タスク名が空欄なら "タスクなし" にする if (taskName==="「」 ") { taskName = "「タスクなし」 "; } //日付と時刻を取得 var myDate = new Date(); var myYear = myDate.getYear(); myYear = (myYear < 2000)? myYear + 1900: myYear; var myMonth = myDate.getMonth() + 1; myMonth = (myMonth < 10)? "0" + myMonth: myMonth; var myDay = myDate.getDate(); myDay = (myDay < 10)? "0" + myDay: myDay; var myH = myDate.getHours(); myH = (myH < 10)? "0" + myH: myH; var myM = myDate.getMinutes(); myM = (myM < 10)? "0" + myM: myM; var myS = myDate.getSeconds(); myS = (myS < 10)? "0" + myS: myS; myDate = myYear + "/" + myMonth + "/" + myDay + " " + myH + ":" + myM + "'" + myS + " "; //ラップ記録欄が空白ならそのまま記録 if (tbLap.value==="") { tbLap.value = myDate + taskName + lapTime; //すでにラップが記録されているならその下に追記 } else { tbLap.value = tbLap.value + myDate + taskName + lapTime; } } } //ラップを消去する function lapClear() { tbLap.value = ""; } |
よろしければ以下の関連(してそうな)記事もどうぞ!
- 2010年にお世話になった、10個のお薦めGreasemonkeyスクリプト
- テーブルやリストの背景を1行ごとに変更する方法:JavaScriptを使うかCSSだけでやるか
- 2010年にお世話になった、10個のお薦めFirefoxアドオン(おまけ10個)
- 古いIE利用者にバージョンアップを勧めるJavaScript「sevenup」
- 最初や最後の行だけ違うスタイルを可能にするJavaScript「yuga.js」
![[画像] 今日の気になる記事「きにきじ」QR Code](http://www.kagitaku.com/diary/images/qrcode.png)
![[画像] きにきじ Feed](http://www.kagitaku.com/diary/images/Newspaper_Feed_128x128_ie6.png)
![[画像] kagitaku.com ロゴ](http://www.kagitaku.com/common/images/logo.png)





![[画像] 最上部へ](http://www.kagitaku.com/common/images/pageNavi-toTop.png)
![[画像] 最下部へ](http://www.kagitaku.com/common/images/pageNavi-toBottom.png)
![[画像] 履歴を戻る](http://www.kagitaku.com/common/images/pageNavi-back.png)
![[画像] 履歴を進む](http://www.kagitaku.com/common/images/pageNavi-forward.png)
![[画像] Contact](http://www.kagitaku.com/common/images/pageNavi-contact.png)
![[画像] Sitemap](http://www.kagitaku.com/common/images/pageNavi-sitemap.png)
JavaScriptのお勉強でストップウォッチを作ってみた | きにきじ http://www.kagitaku.com/diary…
ライフハック ジャパン
» このコメントを引用してコメントする
JavaScriptのお勉強でストップウォッチを作ってみた | きにきじ http://bit.ly/bl2OoU
lifehack_japan
» このコメントを引用してコメントする
JavaScriptのお勉強でストップウォッチを作ってみた | きにきじ http://htn.to/Tiuzpd
japanrock
» このコメントを引用してコメントする
ストップウォッチ
efcl
» このコメントを引用してコメントする
Javascript: JavaScriptのお勉強でストップウォッチを作ってみた | きにきじ : http://www.kagitaku.com/diary/2010/07/08/javascript-stopwatch.html
bsiyo
» このコメントを引用してコメントする
JavaScriptのお勉強でストップウォッチを作ってみた | きにきじ http://bit.ly/ciThBv
webdesignstatio
» このコメントを引用してコメントする