Stopwatch
Start, pause, and lap a clock that reads elapsed time from performance.now and paints hundredths of a second.
🔒 Processed entirely in your browser — nothing you enter here is ever uploaded.
Result
About this tool
Start records performance.now and begins a requestAnimationFrame loop. While the clock is running, the elapsed milliseconds are the time already accumulated before this run, plus performance.now minus the moment Start was pressed. Pause copies that total into the accumulated time, cancels the frame, and puts the button label back to Start. Pressing Start again adds a new interval on top of the paused total, so a pause does not zero the clock. The display is formatClock with hundredths turned on: minutes and seconds are always two digits, and the third field is the centiseconds, which are floor of (milliseconds modulo 1000) divided by 10. At 1500 milliseconds the display reads 00:01.50. At 3661000 milliseconds it reads 61:01.00, because minutes are floor(total seconds / 60) and there is no separate hour field.
Lap does nothing when the elapsed time is exactly 0, so a lap before the first Start, or after Reset, does not add a row. Otherwise it increments a counter and inserts a new list item at the top, formatted as the lap number, a period, and the same minutes:seconds.centiseconds string. The clock is not stopped by a lap. The list is only in the page: it is not copied to a file and it is not stored after you leave. Reset calls pause, sets the accumulated time and the lap counter back to 0, empties the list, and paints 00:00.00.
The frame loop is what repaints the digits. The number itself comes from performance.now, which keeps advancing if the browser only delays the paint. A background tab can throttle requestAnimationFrame, so the digits may sit still and then jump forward to the real elapsed time on the next frame that is allowed to run. The page does not use setInterval, and it does not try to lock the tick to the audio clock. There is no countdown mode here, no alarm tone, and no limit that stops the clock at 60 minutes or 24 hours. It runs until you pause or reset it, or until the tab is closed. Nothing about the start time or the laps leaves the browser. The buttons are Start, Lap, and Reset. Start becomes Pause while the frame loop is running. There is no split that shows the gap since the previous lap: every lap row is the total elapsed time at that press, not the length of that segment. If you need the gap, subtract the next row, which is the older total, from the newer one.
Example. 1500 milliseconds after Start reads 00:01.50. A lap at that moment inserts 1. 00:01.50 at the top of the list and leaves the clock running. 3661000 milliseconds reads 61:01.00.
Limit. There is no hour field and no automatic stop. A lap is ignored when elapsed time is exactly 0. Each lap row is the total since the last reset, not the gap since the previous lap.
Does pause reset the stopwatch?
No. Pause stores the elapsed milliseconds and stops the paint loop. Start continues from that stored total. Reset is the control that zeros the display, clears the lap list, and returns the button label to Start.
What does a lap record?
The row is the lap number and the total time on the clock at that click, in minutes:seconds.centiseconds. Newer laps are inserted above older ones. The clock keeps running. A press when the clock is still at 0 adds nothing.
Why can the minutes read 61?
Minutes are the total whole seconds divided by 60, with no hour wrap. 61 minutes and 1 second is 61:01.00. Centiseconds are the leftover milliseconds divided by 10 and floored, so 1500 milliseconds is 00:01.50.
Will a background tab lose time?
The elapsed value is computed from performance.now when a frame runs. If the browser delays animation frames, the digits can freeze and then jump to the real elapsed time. The page does not accumulate time by adding a fixed tick that would drift while the tab is hidden.