窗口尺寸时常会变来变去,无法固定,影响使用体验

BUG反馈 · 10 次浏览
永远的长江 创建于 18小时17分钟前

@CL

这是我用Quicker自带AI创建的一个动作,用来实现我想要的窗口管理和切换的功能。使用模型为DeepSeek。

 

目前有一个Bug:窗口尺寸时常会变来变去,无法固定,影响使用体验。

 

我用AI进行了多轮修改,还是无法消除这个问题。

 

希望大佬能提供解决办法。

 

以下为DeepSeek的分析:

## 结论先说
窗口尺寸“变来变去”不是一个 bug,而是**四层因素叠加**的结果:宿主的尺寸模型、页面内容尺寸、脚本传入的参数、以及这段时间源码被反复改回旧版本。下面按层拆开。
## 一、宿主模型:`qk.Ui.React` 的窗口是“按内容量出来的”
`@qk-api/contracts/Ui.React` 的原文要点:
- 窗口尺寸**跟随页面内容**;
- `width` / `height` 参数是**最大尺寸**(不是固定尺寸),`height` 含 36 DIP 标题栏;
- 下限 360×220,上限工作区 92%;
- 窗口居中在**鼠标所在显示器**。
所以“固定尺寸”必须靠两件事同时满足:**内容尺寸恰好等于目标**,**上限也恰好等于目标**。任一条不成立,宿主就会在两个值之间取一个——这就是“两种宽度模式”的机制根源。
## 二、四类具体诱因(按发生顺序)
1. **上限参数与目标尺寸不一致(最主要)**
- 一个长期存在、反复被改回去的点:`qk.Ui.React(..., width: 1600, height: 1200)`。宿主有时按上限建窗 → 1600 宽的“大窗”,有时按内容 → 800/屏宽 30% 的“小窗”。这就是你看到的“宽(大)/窄(小)两种模式”。我改了 3 次,都在此后被外部编辑覆盖回 1600×1200。
2. **页面内容尺寸自己在变**
- 早期按“条目数 × 行高”算高度(窗口数不同→高度不同);
- 中期用 `window.screen` 在页面里再算一次上限(和宿主的 92% 规则打架);
- 还曾用 `position: fixed; inset: 0` 的“铺满视口”深色层——它的宽高**等于窗口宽高**,而窗口又按内容定,形成 `窗口 → 视口 → 内容 → 窗口` 的互相测量回路,尺寸会在两个取值间振荡。这一条与“内容为空时测到 0 → 最小窗”的竞态叠加,就出现了“经常变回小窗口”。
3. **“窗口高”被当成“列表高”用(尺寸冲突)**
- 目标窗口 60% 屏高里含 36 标题栏,页面里却把同一个数值当列表高度,导致内容比客户区高 36px:列表压出背景、底部提示栏被裁——表现成“提示栏时有时无”,也容易被感知为“窗口尺寸变了”。
4. **多套尺寸来源并存**
- 期间同时存在:脚本配置 `winW/winH`、设置页保存、页面 `Quicker.storage` 的拖动记忆、跨屏取最小值、主屏 92% 上限。优先级不清时,谁后写谁生效,不同运行就得到不同结果。
外加一个**非技术但关键**的因素:这段会话里动作源码被外部(Quicker 编辑器或另一个 AI 会话)多次保存回旧版本,我每次修完很快又被回滚,所以表现为“修了又变”。
## 三、现在生效的稳定规则(已落库)

| 项 | 规则 |
| --- | --- |
| 目标尺寸 | 宽 = 主显示器宽 **30%**,高 = 主显示器高 **60%**(按各自 DPI 换算成 DIP;下限 320×240) |
| 传给宿主的上限 | **等于目标尺寸**,两条路径(按内容/按上限)得到同一个数值 |
| 页面内容 | 单一静态容器:宽 = 目标宽,高 = 目标高 − 36(客户区);无 `fixed`、无视口相关元素 |
| 列表 | `flex: 1; minHeight: 0`,内部滚动;页脚 `flexShrink: 0` 永不被挤出 |
| 渲染前测量 | CSS 用 `!important` 把 `html/body/#root` 固定成同一尺寸,避免“空页面被量成最小窗” |
| 其它来源 | 不再读用户宽度配置、不保存拖动记忆,设置里只剩与尺寸无关的项说明 |

## 四、如果将来又出现波动,按这个顺序排查
1. **看参数**:`qk.Ui.React` 的 `width/height` 是否仍等于目标尺寸(这是历史上被覆盖最多的点);
2. **看页面**:是否又出现 `position: fixed` / `100vh` / 依赖 `window.screen` 的元素;
3. **看高度口径**:页面里的高度是否按“客户区 = 窗口高 − 36”算,页脚是否 `flexShrink: 0`;
4. **看源码版本**:动作是否又被别的编辑器/会话保存覆盖(对比操作历史里的保存记录即可确认);
5. **最后才怀疑宿主**:多显示器 92% 上限、DPI 缩放、宿主记住上次窗口尺寸——这三项在“参数与内容都一致”时才会显现。
一句话总结:**根因是“最大尺寸”被当成了“固定尺寸”,加上页面内容自身不固定和一次全屏图层的反馈回路;而反复复现,是因为上限参数被外部编辑反复改回 1600×1200。**

永远的长江 最后更新于 2026/11/8

回复内容
暂无回复
回复主贴