ダーク / ライトテーマ
こぴぺったりのダーク・ライトテーマ切り替え機能、CSS 変数ベースの実装、リロード時のフラッシュを防ぐ仕組みを解説します。
「こぴぺったり」はダーク / ライトの 2 テーマに対応しています。設定はブラウザに保存され、次回起動時にも維持されます。リロード時に画面が一瞬白く光るような フラッシュ問題 を回避する実装になっており、ダークテーマを使っている方でも快適に使えます。
テーマの切り替え
右上の ≡ メニュー を開くと、上部にテーマ切り替えのトグルがあります。タップすると即座に画面全体のテーマが切り替わります。
切り替え後は localStorage の clipapp_theme キーに "dark" または "light" が保存され、次回起動時にも復元されます。
それぞれの特徴
ダーク (デフォルト)
- 背景:
#0e1116(ほぼ黒に近い深い紺) - 前景: 明るい青みがかった白
- アクセント: シアン (
#5cd9d9) — 落ち着いたダーク系の印象 - 用途: 夜間作業、長時間使用時の眼精疲労軽減、コーディングシーン
ライト
- 背景:
#fbfcfe(ほぼ白) - 前景: 紺に近い濃いグレー
- アクセント: ティール (
#0f8e8e) — ダークと色相を揃えつつコントラスト確保 - 用途: 屋外利用、ドキュメント作成中、明るい部屋
システム連動 (OS 設定追従)
現バージョンでは 手動切替のみ で、OS のダークモード設定 (prefers-color-scheme) には連動していません。これは「こぴぺったりでは OS と違うテーマを使いたい」というユーザーが一定数いることを考慮した設計です。
将来「OS に従う」という第3のオプションを追加する可能性はありますが、現時点では明示的選択を優先しています。
フラッシュなしの仕組み (技術メモ)
ライトテーマで保存しているのに、起動時にダーク背景が一瞬表示されてからライトに切り替わる ── このフラッシュ問題は、テーマシステムを CSS だけで実現しているサイトでよく発生します。
「こぴぺったり」では、index.html の <head> 内、React がマウントされる前のスクリプトでテーマ判定と class 付与を行うことで、初回ペイントの段階から正しいテーマで描画されるようにしています。
<script>
(function () {
try {
var t = localStorage.getItem("clipapp_theme");
if (t === "light") document.documentElement.classList.add("theme-light");
} catch (e) {}
})();
</script>
このスクリプトは:
- localStorage から保存テーマを読む
- ライトなら
<html>にtheme-lightクラスを付与 - CSS は
:rootの変数値とhtml.theme-lightの変数値を切り替える
という流れで、JavaScript のロード前に実行されるため、フラッシュが発生しません。
CSS 変数ベースのテーマシステム
こぴぺったりは CSS 変数 (Custom Properties) を使ってテーマを定義しています。
:root {
--bg: #0e1116;
--fg: #e8eef7;
--accent: #5cd9d9;
}
html.theme-light {
--bg: #fbfcfe;
--fg: #16202d;
--accent: #0f8e8e;
}
各コンポーネントの CSS は var(--bg) のように変数を参照するだけです。新しいテーマ (例: セピア、ハイコントラスト) を将来追加する場合も、html.theme-sepia のような class を増やして変数値を上書きするだけで済みます。
アクセシビリティに関する補足
- ダークテーマの背景
#0e1116と前景#e8eef7のコントラスト比は約 17:1 (WCAG AAA 達成) - ライトテーマの背景
#fbfcfeと前景#16202dのコントラスト比は約 15:1 (WCAG AAA 達成) - アクセントカラーは見出しやリンクに使用、本文は白/濃グレーのみ → 色覚多様性への配慮
関連ページ
- 使い方ガイド — テーマ切替メニューの位置を画面構成順に解説
- localStorage の仕組み — テーマ設定が保存される
clipapp_themeキーについて