手軽屋
ツール一覧

時計UIの設計:Intl.DateTimeFormatとモノスペース・アクセシビリティ

Web上でデジタル時計を表示するとき、「数字がカクカク動かない」「スクリーンリーダーで読み上げられる」「視認距離10mでも読める」UIを作るための実装観点を整理します。ECMA-402 Intl.DateTimeFormat、等幅フォント、WCAG 2.2の基準を解説。

ECMA-402 Intl.DateTimeFormat の使い方

ブラウザに標準実装されているIntl.DateTimeFormatは、ロケール別の時刻書式化APIです。

自前で「Date.getHours()を2桁ゼロパディング」のような処理を書くより、Intl.DateTimeFormatを使うほうがロケール対応・将来の仕様変更に強くなります。

数字が踊らない:等幅フォントとタブラー数字

時計の数字が秒ごとに微妙に動いて落ち着かない経験はありませんか。これは多くの欧文プロポーショナル数字(プロポーショナルナンバー)が幅可変だからです。

OS標準フォントだけでもUIフォント(SF Pro, Segoe UI, Inter, BIZ UDPGothic)はtabular-nums対応のものが多いので、明示的にCSSで指定すれば安定します。

アクセシビリティ:aria-liveとaria-label

視覚障がい者がスクリーンリーダーを使うとき、時計が変化するたびに延々と読み上げると邪魔になります。WAI-ARIAでは次の方法が推奨されます。

時計はあくまで参考表示なので、フォーカス可能要素にはせず、隣に「時刻を読み上げる」ボタンを別に置く設計のほうが親切なケースもあります。

WCAG 2.2のコントラスト比基準

会議室や教室で離れた席から読む時計は、視認性が命。W3CのWCAG 2.2は次のコントラスト比基準を定めています。

時計の数字は大きいため大半は3:1基準で済みますが、夜間や寝室では暗い画面モードに切り替えると、まぶしさを避けつつコントラスト基準を満たせます。本サイトのデジタル時計は暗い画面切替を備えています。

setInterval(60_000) vs requestAnimationFrame

時計の更新タイミングは、表示精度と電力消費のトレードオフがあります。

手法更新間隔使い分け
setInterval(60_000)毎分秒非表示時は省電力。タイマー誤差最大1分
setInterval(1000)毎秒秒表示の定番。負荷ほぼゼロ
setInterval(250)4回/秒秒の境界ズレを最小化したい場合
requestAnimationFrame画面リフレッシュごとアナログ時計の秒針アニメ向き

ノートPCやスマホでは、不要なrequestAnimationFrameはCPUとバッテリーを浪費するので、デジタル表示なら1秒間隔で十分です。

同シリーズの記事