ブラウザでタイマーを動かして別のタブで作業していたら、戻ったときに残り時間がおかしい。あるいは時間になっても音が鳴らなかった。Webのタイマーを使っていると、かなりの頻度でこれが起きます。
結論から言うと、これはツールの不具合というより「ブラウザが裏タブのJavaScriptを意図的に間引いている」仕様です。そして、同じ間引きを受けてもずれるタイマーとずれないタイマーがあります。差は実装方式の1点だけで、外から見分ける方法もあります。この記事では、Chrome・Firefoxの公式仕様を確認したうえで、ずれる/ずれないの分かれ目、手元1分でできる検証手順、鳴らないときの切り分けを整理します。
なぜ裏タブでタイマーがずれるのか
ブラウザは、見えていないタブでCPUとバッテリーを浪費しないよう、setTimeout や setInterval の実行頻度を落とします。これは省電力のための正式な仕様で、Chromeの場合はMDNに3段階として整理されています。
- 最小限の抑制(minimal throttling): ページが表示中、または直前まで音を鳴らしていた等でアクティブと見なされる状態。タイマーはほぼ指定どおりの間隔で動く
- 抑制(throttling): 非表示になって5分未満、ネストが5回未満、WebRTCが動作中などの状態。タイマーの確認は1秒に1回まで落とされ、似た時刻のタイマーとまとめて処理される
- 集中的な抑制(intensive throttling): 非表示が5分超、無音が30秒超、ネスト5回以上、WebRTC不使用がすべて成立した状態。タイマーの確認は1分に1回まで落ちる
この「集中的な抑制」はChrome 88(2021年1月)で導入されたもので、Chrome公式ブログにも「この場合、ブラウザはこのグループのタイマーを1分に1回だけ確認する」と明記されています。500ミリ秒後に実行してほしい処理が、最大で1分近く放置されうるということです。
Firefoxも同様で、MDNには「Firefox デスクトップは非アクティブなタブに対して最小1秒のタイムアウトを課す」、さらに「Firefox for Android は非アクティブなタブに対して最小15分のタイムアウトを課し、タブを完全にアンロードすることがある」と書かれています。スマホで裏に回したタブは、そもそも生きていない可能性があるわけです。
なお、HTML標準そのものにも「入れ子の setTimeout が5回連続した時点で最小4ミリ秒を強制する」というクランプ規定があります。裏タブの話とは別軸ですが、「ブラウザはタイマーを指定どおりには動かさない」という前提は、標準の時点で織り込み済みです。
ずれるタイマーと、ずれないタイマーの違い
同じ間引きを受けても結果が変わるのは、残り時間の数え方が2通りあるからです。
ずれる方式: カウンターを足し引きする
「1秒ごとに残り秒数を1減らす」という素朴な実装です。読みやすい代わりに、間引かれた分がそのまま消えます。1分に1回しか動かない状態が10分続けば、減るのは10秒だけ。タブに戻ると残り時間が実際よりはるかに多く表示されます。
ずれない方式: 終了時刻との差分で毎回計算し直す
スタート時に「終わる時刻(絶対時刻)」を確定させ、画面を描くたびに「終了時刻 − 今の時刻」を計算する方式です。途中で何回間引かれようが、タブに戻った瞬間に壁時計基準の正しい残り時間へ復帰します。ストップウォッチなら「今の時刻 − 開始時刻」で同じことをします。
Mihataが無料公開している集中時計のタイマーも、この後者の方式です。実装上は、タイマーごとに終了時刻を持たせ、専用のWeb Workerが250ミリ秒間隔で残り時間を計算して画面側に渡す構成にしています。Workerを挟んでいるのは、まさに「タブが裏に回るとメインスレッドの定期処理が1秒に1回まで絞られる」問題を避けるためです。ページを再読み込みしても、保存してある終了時刻から残り時間を計算し直すので、リロードで巻き戻ることもありません。
ただし正直に書くと、Workerを使っても「間引きをゼロにできる」わけではありません。ブラウザやOSの判断で、裏に回ったタブの処理はやはり遅くなります。効いているのは「遅れても、戻った瞬間に正しい値へ復帰する」という設計のほうで、Workerは表示のなめらかさを保つための補助です。ここを取り違えて「裏でも1秒刻みで完璧に動く」と書いてあるツールがあれば、それは疑ってよいポイントです。
手元1分でできる「ずれるかどうか」の検証手順
使おうとしているタイマーが安全かどうかは、本番で試す前に1分で判定できます。
- タイマーを3分にセットしてスタートする
- スマホなど別の時計で同時に3分を計り始める(あるいは現在時刻をメモする)
- タイマーのタブを裏に回し、1分ほど別のタブで作業する
- タイマーのタブに戻り、残り時間が別の時計と一致しているかを見る
戻った瞬間に数字が正しければ、終了時刻ベースの実装です。戻った直後に「残り2分50秒」のように多めに表示されて、そこからじわじわ追いつく(あるいは追いつかない)なら、カウンター方式でずれています。会議や試験のように「ずれたら困る」場面で使う道具は、事前にこの30秒のテストを1回通しておくだけで事故が減ります。
より厳密に測りたい場合は、区間ごとに記録が残るラップ記録に対応した無料Webストップウォッチを並走させると、どこでズレが発生したか追いやすくなります。
時間になっても「鳴らない」ときの切り分け
ずれとは別に、「時間は合っているのに音や通知が来ない」も頻出です。原因は主に3つに分かれます。
1. 音声の自動再生がブロックされている
ブラウザは、ユーザーが一度もそのページを操作していない状態での音の再生を止めます。タイマーをセットしてスタートを押すという操作自体が許可のきっかけになるため、通常は問題になりません。逆に「ページを開いて何も触らずに放置した」ケースでは鳴らないことがあります。
2. ブラウザ通知の権限が許可されていない
デスクトップ通知は、ブラウザの通知権限が「許可」でなければ出ません。集中時計では通知トグルをオンにしたタイミングで権限を要求する作りにしており、初回訪問でいきなり権限ダイアログは出しません。拒否されている場合は通知だけが出ず、チャイムは通常どおり鳴ります。権限はブラウザのアドレスバー左側のアイコンから確認・変更できます。
3. ページを閉じている
ここは正直に書いておきます。集中時計はプッシュ通知(Service Worker経由のPush)を使っていません。そのため、タブを閉じてしまうと通知は届きません。裏タブに置いたままにするか、ブラウザを起動したままにしておく必要があります。「アプリを完全に閉じても後から通知が飛んでくる」挙動が必須なら、Webではなくネイティブアプリを選ぶのが正解です。
関連して、集中時計では期限が切れた状態でページを再読み込みしても、アラームは鳴らしません。復元したタイマーは「完了」として表示するだけです。ユーザーが見ていなかった時間の音を後から鳴らしても意味がない、という判断です。
Webタイマーで「できないこと」を先に知っておく
ブラウザで完結する手軽さと引き換えに、構造上できないことがあります。集中時計の実装を踏まえて、正直に並べます。
- アプリを閉じた後の通知は届かない(Push未使用。前述)
- 端末間の同期はできない。設定もタイマーも保存先はその端末のブラウザ内(localStorage)で、サーバーには送っていません。PCで作ったタイマーがスマホに現れることはありません
- アカウント登録・ログインの仕組みがない。裏返せば個人情報を預ける必要もありませんが、ブラウザのデータを消すと記録も消えます
- オフラインでは一部しか動かない。時計本体はキャッシュされますが、背景の写真・動画・音源は容量が大きいため意図的にキャッシュしていません
- アラーム音量の設定項目はない(固定値。BGMの音量とは別系統)
逆に、この制約を飲めるなら得られるものははっきりしています。インストール不要で、共用PCや持ち出し禁止端末でもURLを開くだけで使え、複数のタイマーを同時に走らせられる点はネイティブアプリより身軽です。料理と勉強を並行するような使い方は複数タイマーを同時に使える無料Webツールで詳しく整理しています。
まとめ: 「戻った瞬間に正しいか」だけ見ればいい
裏タブでのずれは、ブラウザ側の省電力仕様である以上、ツールを変えても間引き自体は避けられません。判断すべきは「間引かれた後、正しい値に戻ってくるか」の一点です。終了時刻との差分で計算する実装なら戻ります。3分のタイマーで1回テストすれば確認できます。
残り時間を大きく映しながら使いたい場合は、全画面タイマーをブラウザで無料表示する方法もあわせてどうぞ。経過時間を測るだけならストップウォッチのほうが素直です。
ポモドーロタイマーをブラウザで使う場合も同様の間引きが起こり得ます。無料のブラウザ版ポモドーロタイマーの選び方はポモドーロタイマー無料ブラウザ版おすすめ比較で紹介しています。
よくある質問
ブラウザのタイマーを裏タブに回すと止まるのはなぜですか?
ブラウザが省電力のために非表示タブのJavaScriptタイマーを間引くためです。Chromeでは非表示のページのタイマーが1秒に1回、さらに非表示5分超・無音30秒超などの条件がそろうと1分に1回まで確認頻度が落ちます(Chrome 88以降の仕様)。Firefoxデスクトップは非アクティブタブで最小1秒、Firefox for Androidは最小15分でタブ自体をアンロードすることもあります。
間引かれても残り時間がずれないタイマーはありますか?
あります。スタート時に終了時刻(絶対時刻)を確定し、描画のたびに「終了時刻 − 現在時刻」で残りを計算し直す実装なら、間引かれてもタブに戻った瞬間に正しい残り時間へ復帰します。逆に「1秒ごとにカウンターを1減らす」実装は、間引かれた分がそのまま消えてずれます。
使おうとしているタイマーがずれるかどうか、簡単に確かめる方法は?
タイマーを3分にセットしてスタートし、同時に別の時計でも3分を計ります。1分ほど別タブで作業してから戻り、残り時間が別の時計と一致していればOKです。戻った直後に多めに表示されて、そこから追いつこうとする挙動ならカウンター方式でずれています。
時間になっても音が鳴らない・通知が来ないのはなぜですか?
主な原因は3つです。(1)ページを一度も操作していないと音声の自動再生がブロックされる、(2)ブラウザの通知権限が許可になっていない、(3)タブを閉じている。Mihataの集中時計はService Worker経由のプッシュ通知を使っていないため、タブを閉じると通知は届きません。裏タブに置いたままにしてください。
Web Workerを使えば裏タブでも完璧に動きますか?
完璧にはなりません。Workerを使っても、ブラウザやOSの判断で裏タブの処理は遅くなります。集中時計がWeb Workerで250ミリ秒ごとに残り時間を計算しているのは表示のなめらかさを保つためで、正確さを担保しているのは終了時刻との差分計算のほうです。「裏でも1秒刻みで完璧」と書いてあるツールは疑ってよい部分です。
PCで作ったタイマーをスマホでも引き継げますか?
集中時計ではできません。タイマーや設定の保存先はその端末のブラウザ内(localStorage)で、サーバーには送っていないため端末間の同期はありません。アカウント登録が不要な代わりに、ブラウザのデータを消すと設定も記録も消えます。