now in — Web

DarkReader API

很早之前用的客户端暗色插件现在支持服务端调用了 DarkReader API 那么正好写一个设置来支持切换深浅色模式,以及持久化用户设置。DarkReader 真的非常方便,理论上默认设置都能很好自动渲染网页生成对应的 CSS,如果有不正常的地方自己微调一下就行。

Setting Page

首先得有一个开关或者设置,这里我选择自己写了一个 Setting 用于存储用户数据,还有保存到 localStorage 之类的的( ) 这里初始化了一个按键的开关,作为被绑定的载体。

Toggle

1
2
3
4
5
6
7
8
<div class="setting-item">
<label for="theme-toggle" class="setting-label"><strong>Dark Mode</strong>:</label>
<span class="setting-description">Toggle the dark theme. It will sync with your system theme settings the first time.</span>
<label class="switch">
<input type="checkbox" id="theme-toggle">
<span class="slider round"></span>
</label>
</div>

JavaScript

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
window.onload = function() {
const cookieStatus = localStorage.getItem('allowCookies') === 'true';
const themeStatus = localStorage.getItem('darkMode') === 'true';

document.getElementById('cookie-toggle').checked = cookieStatus;
document.getElementById('theme-toggle').checked = themeStatus;

// Load dark mode settings from localStorage or auto
const darkModeStatus = localStorage.getItem('darkMode');
if (darkModeStatus !== null) {
if (darkModeStatus === 'true') {
DarkReader.enable({ brightness: 100, contrast: 100, sepia: 0 });
} else {
DarkReader.disable();
}
} else {
DarkReader.auto({ brightness: 100, contrast: 90, sepia: 10 });
localStorage.setItem('darkMode', DarkReader.isEnabled().toString());
}
};

// Dark mode toggle
document.getElementById('theme-toggle').addEventListener('change', function() {
const isDarkMode = this.checked;
localStorage.setItem('darkMode', isDarkMode.toString());
if (isDarkMode) {
DarkReader.enable({ brightness: 100, contrast: 100, sepia: 0 });
} else {
DarkReader.disable();
}
});

上面的 JS 调用的 window.onload 只是为了设置界面可以正常生效,并且持久化和每次自动从 localStorage 加载按键信息所用的,具体的全局设置可以参考这样

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
<!DOCTYPE html>
<html lang="{{ config.language }}">
<head>
{% include "_partial/head.swig" %}
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<script>
(function() {
const darkModeSetting = localStorage.getItem('darkMode');
if (darkModeSetting === 'true') {
DarkReader.enable({
brightness: 100,
contrast: 100,
sepia: 0
});
}
else if (darkModeSetting === 'false') {
DarkReader.disable();
}
else {
DarkReader.auto({
brightness: 100,
contrast: 90,
sepia: 10
});
}

const isEnabled = DarkReader.isEnabled();
localStorage.setItem('darkMode', isEnabled.toString());
})();
</script>
<div class="container">
{% include "_partial/header.swig" %}
<div class="container-inner" style="display:none;">
<main class="main" id="main">
<div class="main-wrapper">
{% block main %} {% endblock %}
</div>
</main>
{% include "./_partial/footer.swig" %}
</div>
{% include "./_partial/tagcloud.swig" %}
</div>
{% include "_partial/_feature/common.swig" %}
</body>
</html>

这里我之前踩过坑,那就是在最开始调用这个 JS 会导致加载过早, 导致后面渲染出来的页面完全没有被应用深色模式,如果用 window.onload 会导致深色模式的一瞬间加载的时候实际上是浅色主题,等加载完后才执行的 API, 所以你应该把这段 JS 塞在 _layout.swig 或者你使用的框架的合适地方, 比如整体 Web Body( )

Support DarkMode

Moment

WCH-Link CH549F
一堆?
MI A->C 10G
WCH-LinkE CH32V305
ST-Link V3 STM32F723
EV2400
USB Gigabit Ethernet Adapter
USB3.0 TF-Card Reader
PD SWAP
PCB RF 433Mhz
RF 433Mhz
LiThermal T113-S3
PW-Link GD32F303
DC24S1215
PD3.1 SRC IP2366
ESP32-PICO-D4
硅胶杜邦线(x)
Hello Hexo
吃灰灰
USBC24P 测线仪
彩色丝印的正确通途(x)
浅浅测试一下
ADUM3165
你们 Arch User 都是这样的嘛
Aurora
ArchLinux&Hyprland

WCH

WCH-Link CH549F
WCH-LinkE CH32V305
PD SWAP
WCH-LinkE

HRS

WCH-Link CH549F
WCH-LinkE CH32V305
ST-Link V3 STM32F723
PW-Link GD32F303
WCH-LinkE
PW-Link (DAP-CMSIS)

MI

MI A->C 10G

TI

MI A->C 10G
EV2400
USB Gigabit Ethernet Adapter
DC24S1215

JEA

MI A->C 10G
USBC24P 测线仪

mspxr

Micro Sub Pixel Rendering
Smooth Rounded Anti-Aliasing
mspxr V1.3

LCD

Micro Sub Pixel Rendering
Smooth Rounded Anti-Aliasing
吃灰灰
USBC24P 测线仪

ST

ST-Link V3 STM32F723
DC24S1215
USBC24P 测线仪
彩色丝印的正确通途(x)
Aurora

Realtek

USB Gigabit Ethernet Adapter

Molex

USB Gigabit Ethernet Adapter
ESP32-PICO-D4

PY

USB Gigabit Ethernet Adapter
PD SWAP

luxshare

USB3.0 TF-Card Reader
PD SWAP

TF

USB3.0 TF-Card Reader

LaTeX

LaTeX
Smooth Rounded Anti-Aliasing

C

Smooth Rounded Anti-Aliasing

RF

PCB RF 433Mhz
RF 433Mhz

LiThermal

LiThermal T113-S3

allwinner

LiThermal T113-S3

GD

PW-Link GD32F303
PW-Link (DAP-CMSIS)

PW

PW-Link GD32F303
PW-Link (DAP-CMSIS)

delta

DC24S1215
浅浅测试一下

isolated

DC24S1215

injoinic

PD3.1 SRC IP2366

Amass

PD3.1 SRC IP2366

ESP

ESP32-PICO-D4
吃灰灰

krconn

ESP32-PICO-D4
彩色丝印的正确通途(x)

Hexo

Hello Hexo

OpenSource

WCH-LinkE
PW-Link (DAP-CMSIS)

sky

USBC

USBC24P 测线仪

ADI

ADUM3165

ArchLinux

你们 Arch User 都是这样的嘛
ArchLinux&Hyprland

Aurora

Aurora
mspxr V1.3

Hyprland

ArchLinux&Hyprland

Wayland

ArchLinux&Hyprland

Nvidia

ArchLinux&Hyprland

Web

Support DarkMode

DarkReader

Support DarkMode

JS

Support DarkMode

CSS

Support DarkMode
1%

AltStyle によって変換されたページ (->オリジナル) /