pixel-daylight-switch-gsvegetable 1.3.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +207 -0
- package/README.md +134 -360
- package/README.zh-CN.md +207 -0
- package/app.js +664 -267
- package/package.json +19 -4
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Pixel Daylight Switch
|
|
2
|
+
|
|
3
|
+
[](https://github.com/GSvegetable/pixel-daylight-switch/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/pixel-daylight-switch-gsvegetable)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
**语言切换:** [English](README.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md)
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
*一个装在折射玻璃开关里的微缩像素世界。*
|
|
12
|
+
|
|
13
|
+
Pixel Daylight Switch 是一个可拖动的昼夜切换 UI 组件。拖动玻璃开关,可以让内部的像素世界从白天经过黄昏切换到夜晚。项目使用原生 JavaScript、WebGL2 和 Canvas 2D 回退渲染,不依赖第三方运行时库。
|
|
14
|
+
|
|
15
|
+
**[直接体验在线演示](https://gsvegetable.github.io/pixel-daylight-switch/)** · **[打开参数实验室](https://gsvegetable.github.io/pixel-daylight-switch/playground.html)** · **[npm 安装](https://www.npmjs.com/package/pixel-daylight-switch-gsvegetable)**
|
|
16
|
+
|
|
17
|
+
## 快速入口
|
|
18
|
+
|
|
19
|
+
| 你想做什么 | 直接打开 |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| 体验昼夜开关 | [在线演示](https://gsvegetable.github.io/pixel-daylight-switch/) |
|
|
22
|
+
| 调整场景与视觉参数 | [交互式参数实验室](https://gsvegetable.github.io/pixel-daylight-switch/playground.html) |
|
|
23
|
+
| 查看组件预览 | [Preview 页面](https://gsvegetable.github.io/pixel-daylight-switch/preview.html) |
|
|
24
|
+
| 用一个脚本嵌入网站 | [嵌入加载器源码](embed.js) |
|
|
25
|
+
| 在 JavaScript 项目中使用 | [npm 包](https://www.npmjs.com/package/pixel-daylight-switch-gsvegetable) |
|
|
26
|
+
| 阅读核心实现 | [运行时 app.js](app.js) · [样式 style.css](style.css) |
|
|
27
|
+
| 获取移动端构建 | [构建说明与限制](builds/README.md) · [GitHub Actions 构建任务](https://github.com/GSvegetable/pixel-daylight-switch/actions/workflows/mobile-build.yml) |
|
|
28
|
+
| 查看自动化测试 | [CI 工作流](https://github.com/GSvegetable/pixel-daylight-switch/actions/workflows/ci.yml) |
|
|
29
|
+
| 查看版本变化 | [更新日志](CHANGELOG.md) |
|
|
30
|
+
| 反馈问题 | [GitHub Issues](https://github.com/GSvegetable/pixel-daylight-switch/issues) |
|
|
31
|
+
|
|
32
|
+
## 功能特点
|
|
33
|
+
|
|
34
|
+
- 五种场景:乡村、日本街道、现代公寓、海边灯塔和山间木屋。
|
|
35
|
+
- WebGL2 折射玻璃效果;WebGL2 不可用或初始化失败时回退到 Canvas 2D。
|
|
36
|
+
- 支持连续拖动、点击/触控切换和键盘操作。
|
|
37
|
+
- 可配置运动速度、惯性、回弹、折射、玻璃细节、世界速度、天气和场景。
|
|
38
|
+
- 同一页面支持多个独立实例。
|
|
39
|
+
- 提供 switch 语义、状态播报和 `prefers-reduced-motion` 支持。
|
|
40
|
+
- 提供 `mount()`、`unmount()` 生命周期方法,适合动态页面。
|
|
41
|
+
- 页面隐藏或组件离开视口时暂停绘制。
|
|
42
|
+
|
|
43
|
+
## 快速开始:浏览器直接使用,无需构建
|
|
44
|
+
|
|
45
|
+
在页面中放置挂载节点,并引入运行脚本:
|
|
46
|
+
|
|
47
|
+
```html
|
|
48
|
+
<div data-ld-part="toggle-daylight" style="width: min(100%, 800px);">
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<script defer src="https://gsvegetable.github.io/pixel-daylight-switch/app.js"></script>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
浏览器运行时会自动查找挂载节点并生成组件界面。请为挂载元素设置可用宽度。
|
|
55
|
+
|
|
56
|
+
### 使用单脚本嵌入
|
|
57
|
+
|
|
58
|
+
如果希望脚本自动插入组件,可在希望显示组件的位置添加:
|
|
59
|
+
|
|
60
|
+
```html
|
|
61
|
+
<script src="https://gsvegetable.github.io/pixel-daylight-switch/embed.js"></script>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
加载器会自动插入容器、样式和运行脚本。目前它创建一个默认实例,并使用固定的最大展示尺寸;如果需要精确控制布局或配置属性,请使用上面的挂载节点方式。
|
|
65
|
+
|
|
66
|
+
## 通过 npm 安装
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npm install pixel-daylight-switch-gsvegetable
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**ES Modules**
|
|
73
|
+
|
|
74
|
+
```js
|
|
75
|
+
import PixelDaylightSwitch from 'pixel-daylight-switch-gsvegetable';
|
|
76
|
+
|
|
77
|
+
const root = document.querySelector('[data-ld-part="toggle-daylight"]');
|
|
78
|
+
PixelDaylightSwitch.mount(root);
|
|
79
|
+
|
|
80
|
+
// 从 DOM 移除 root 之前调用:
|
|
81
|
+
PixelDaylightSwitch.unmount(root);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**CommonJS**
|
|
85
|
+
|
|
86
|
+
```js
|
|
87
|
+
const PixelDaylightSwitch = require('pixel-daylight-switch-gsvegetable');
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
npm 包提供 ESM 和 CommonJS 入口,可在 SSR 环境中安全导入;只有在浏览器中且目标元素已经存在时,才能调用 `mount()`。npm 发布文件清单以 [package.json](package.json) 为准。
|
|
91
|
+
|
|
92
|
+
## 配置参数
|
|
93
|
+
|
|
94
|
+
所有参数均为可选项,写在挂载元素上。省略参数或参数值无效时使用默认值。
|
|
95
|
+
|
|
96
|
+
| HTML 属性 | 默认值 | 说明 |
|
|
97
|
+
| --- | ---: | --- |
|
|
98
|
+
| `data-speed` | `9.5` | 开关运动的基础响应速度,必须大于零。 |
|
|
99
|
+
| `data-refraction` | `1.24` | 玻璃镜片折射强度,必须大于零。 |
|
|
100
|
+
| `data-bezel` | `0.046` | 玻璃边缘的相对厚度,必须大于零。 |
|
|
101
|
+
| `data-start-night` | `false` | 精确设置为字符串 `"true"` 时,从夜晚状态开始。 |
|
|
102
|
+
| `data-friction` | `0.6` | 松手后的惯性阻尼,范围 `0.1–0.9`。 |
|
|
103
|
+
| `data-bounce` | `3.2` | 边缘回弹力度,范围 `0–12`。 |
|
|
104
|
+
| `data-dispersion` | `0.05` | 玻璃边缘 RGB 色散强度,范围 `0–0.25`。 |
|
|
105
|
+
| `data-shine` | `0.44` | 白天玻璃高光强度,范围 `0–1.5`。 |
|
|
106
|
+
| `data-time-speed` | `1` | 像素世界时间倍率,范围 `0–8`;设为 `0` 可冻结动态。 |
|
|
107
|
+
| `data-weather` | `default` | 支持 `default` 或 `snow`;未知值回退为 `default`。 |
|
|
108
|
+
| `data-scene` | `countryside` | 支持 `countryside`、`japanese-street`、`apartment`、`seaside`、`mountain-cabin`。 |
|
|
109
|
+
|
|
110
|
+
示例:
|
|
111
|
+
|
|
112
|
+
```html
|
|
113
|
+
<div
|
|
114
|
+
data-ld-part="toggle-daylight"
|
|
115
|
+
data-start-night="true"
|
|
116
|
+
data-scene="seaside"
|
|
117
|
+
data-weather="snow"
|
|
118
|
+
data-time-speed="1.4"
|
|
119
|
+
data-refraction="1.3">
|
|
120
|
+
</div>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 事件与状态
|
|
124
|
+
|
|
125
|
+
组件根元素通过 CSS 自定义属性 `--night` 暴露过渡进度:`0` 表示白天,`1` 表示夜晚,中间值表示过渡中。
|
|
126
|
+
|
|
127
|
+
当已确认的昼夜状态发生变化时,根元素会派发可冒泡、可跨越 Shadow DOM 边界的 `daylight:change` 事件,`event.detail.night` 为布尔值。该事件不会在每一帧动画中触发。
|
|
128
|
+
|
|
129
|
+
```js
|
|
130
|
+
const root = document.querySelector('[data-ld-part="toggle-daylight"]');
|
|
131
|
+
|
|
132
|
+
root.addEventListener('daylight:change', (event) => {
|
|
133
|
+
console.log(event.detail.night ? '夜晚' : '白天');
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## 渲染、无障碍与性能
|
|
138
|
+
|
|
139
|
+
- 使用 WebGL2 渲染玻璃折射;不可用或初始化失败时回退到 Canvas 2D。
|
|
140
|
+
- 根据容器尺寸调整渲染区域。
|
|
141
|
+
- 页面隐藏或组件离开视口时暂停绘制。
|
|
142
|
+
- 提供键盘操作、switch 语义和实时状态播报。
|
|
143
|
+
- 尊重系统的 `prefers-reduced-motion` 设置。
|
|
144
|
+
|
|
145
|
+
实际性能取决于浏览器、图形硬件、设备像素比以及同时显示的实例数量。
|
|
146
|
+
|
|
147
|
+
## 开发与测试
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
git clone https://github.com/GSvegetable/pixel-daylight-switch.git
|
|
151
|
+
cd pixel-daylight-switch
|
|
152
|
+
npm test
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
运行 Chromium 浏览器回归测试:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
npm install --no-save @playwright/test@1.56.1
|
|
159
|
+
npx playwright install chromium
|
|
160
|
+
npm run test:browser
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
GitHub Actions 会在 Node.js 18、20、22 环境中执行包与 SSR 检查,并运行 Chromium 交互和移动端回归测试。最新状态见 [CI 工作流](https://github.com/GSvegetable/pixel-daylight-switch/actions/workflows/ci.yml)。
|
|
164
|
+
|
|
165
|
+
## Android 与 iOS
|
|
166
|
+
|
|
167
|
+
仓库包含 Capacitor 8 构建流程,移动端复用同一套 Web 运行时。GitHub Actions 会生成 Android Debug APK 和未签名的 iOS 模拟器应用压缩包。它们属于开发测试产物,不是可直接上架的商店版本:Android APK 不是 Play Store 发布包,iOS 模拟器版本也不能安装到实体 iPhone/iPad。请查看[移动端构建说明](builds/README.md)和[移动端工作流](https://github.com/GSvegetable/pixel-daylight-switch/actions/workflows/mobile-build.yml)。
|
|
168
|
+
|
|
169
|
+
## 项目 / 目录结构
|
|
170
|
+
|
|
171
|
+
```text
|
|
172
|
+
pixel-daylight-switch/
|
|
173
|
+
├── .github/workflows/ # CI、原生移动端构建、npm 发布
|
|
174
|
+
├── assets/
|
|
175
|
+
│ └── scene-gallery.png # 五种场景总览图
|
|
176
|
+
├── builds/
|
|
177
|
+
│ └── README.md # 移动端产物说明;二进制由工作流生成
|
|
178
|
+
├── mobile/
|
|
179
|
+
│ ├── index.html # Capacitor 应用入口
|
|
180
|
+
│ └── mobile.css # 移动端专用布局
|
|
181
|
+
├── scripts/
|
|
182
|
+
│ └── prepare-mobile.cjs # 为 Capacitor 准备共用 Web 运行时
|
|
183
|
+
├── tests/
|
|
184
|
+
│ ├── browser/ # Playwright 交互与移动端回归
|
|
185
|
+
│ ├── fixture.html
|
|
186
|
+
│ ├── mobile-smoke.cjs
|
|
187
|
+
│ ├── package-smoke.cjs
|
|
188
|
+
│ └── server.cjs
|
|
189
|
+
├── app.js # 组件运行时、场景、交互与渲染
|
|
190
|
+
├── style.css # 组件样式
|
|
191
|
+
├── embed.js # 单脚本网站嵌入加载器
|
|
192
|
+
├── index.html # 在线演示主页
|
|
193
|
+
├── preview.html # 组件预览
|
|
194
|
+
├── playground.html # 交互式参数实验室
|
|
195
|
+
├── index.mjs / index.cjs # ESM 与 CommonJS 包入口
|
|
196
|
+
├── package.json # npm 元数据与脚本
|
|
197
|
+
├── capacitor.config.json # Capacitor 配置
|
|
198
|
+
├── playwright.config.cjs # 浏览器测试配置
|
|
199
|
+
├── CHANGELOG.md
|
|
200
|
+
├── llms.txt
|
|
201
|
+
├── LICENSE
|
|
202
|
+
└── README*.md # 英文、简体中文、日文文档
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## 许可证
|
|
206
|
+
|
|
207
|
+
项目采用 [Unlicense](LICENSE)。你可以自由复制、修改、发布、分发,并用于个人或商业项目,无需署名。软件按现状提供,不附带任何担保。
|