💄 修复安卓端界面适配:动态视口高度 + 窄屏表格/设置行/日志统计条重排#1636
Conversation
安卓浏览器(Firefox / Edge / Kiwi 等)上: - 整页外壳用 100vh,而 vh 取「大视口」,显示地址栏时外壳比可见区域高, 且外壳内部滚动导致文档本身不可滚动,底部 Tab 栏/操作栏落在可视区外无法触达; 软键盘默认只压缩可视视口,编辑器底部工具栏与输入框被键盘遮挡。 改为 h-dvh / min-h-dvh,并在整页入口声明 interactive-widget=resizes-content。 - 编辑器「储存 / 资源」子视图是桌面表格:工具栏单行溢出(清空按钮被裁切)、 固定列宽让表头文案在窄屏重叠。移动端改为竖排卡片行 + 换行工具栏, 桌面端用 md:contents 保持原有列对齐。 - 设置 / 工具页的 SettingRow 横排 + 固定宽控件,把文案挤成每行一两个词; 移动端改为竖排。脚本设置子视图的固定宽控件补 max-w-full 避免越界。 close scriptscat#1555 Co-authored-by: RenjiYuusei <daoluc.yy@gmail.com>
日志页「范围 / 统计条」在窄屏(移动端)下,统计文字会压到右侧「自动清理超过 N 天 的日志」上。原因是该条为单行 flex justify-between:左侧分组带 min-w-0 会被压缩, 但其中的计数 span 是 shrink-0,被压缩后内容溢出自身盒子并直接画到右侧分组上—— 是溢出,而不是换行或截断,所以两段文字叠在一起。 改为窄屏竖向堆叠(md 以上仍是原来的单行左右分布):两个分组各 w-full 独占一行, 长文本才能在行内截断;「自动清理」分组允许换行,避免超窄屏横向溢出。同时给 「当前 / 实时」两个徽标补 shrink-0 whitespace-nowrap,避免被挤成两行折字;统计 分隔符从全角「,」改为「 ·」,与顶栏一致,在非中文语言下更易读。 真实构建下用 Playwright 复现与验证(vi-VN,400px 宽):修复前两段文字 X 轴重叠 57.6px、Y 轴完全重叠;修复后 400/360/1280 宽在浅色与深色主题下均无重叠、无横向 溢出,桌面端布局不变。 Co-authored-by: RenjiYuusei <daoluc.yy@gmail.com>
上一版只把窄屏(<768px)改成竖向堆叠,≥768px 仍是单行 flex justify-between, 因此手机横屏、平板、以及浏览器「请求桌面版网站」(980px 布局视口)这类宽度只要 内容放不下,统计文字仍会溢出压到「自动清理超过 N 天的日志」上。 实测 vi-VN + 开启自动刷新(多出「实时 · 5 秒」徽标)时,768px 宽下 「Tổng 2 · Đã lọc 2」与「Tự động xóa nhật ký cũ hơn」重叠 30.2px。根因与窄屏 同一个:统计文字是 shrink-0,单行装不下时压缩只能发生在别处并溢出。 给统计条补 md:flex-wrap(配合 md:gap-x-2 md:gap-y-1 md:py-1),放不下时让自动 清理分组整行下移;宽度足够时(1280px)仍是原来的单行左右分布,未回归。 验证:vi-VN 下 320/360/388/412/480/600/767 及 768/820/900/980/1024 宽逐一测量 两分组全部子元素两两包围盒,无任何重叠、无横向溢出(docScrollWidth == clientWidth)。 Co-authored-by: RenjiYuusei <daoluc.yy@gmail.com>
|
CI 首次运行结果(run 30214918418):
E2E 3/4 的两条失败与本 PR 无关,在未改动的 复现方式: 定位: 本 PR 只改动样式类名、viewport meta 与文档,未触碰安装页逻辑( |
|
感谢,上游issue反馈的是mv2的旧版本UI的问题,不知道你测试验证使用是最新的版本吗?有复现出问题,并确定解决了吗? |
|
@RenjiYuusei please reply within one week to confirm whether this pr is valid or not the issue was for the old version (old branch) for invalid pr, we will close it. |
It's still valid with the 1.5.0 interface on phones; it's working better than the current 1.5.0 version in the repo. |
@CodFrm it seems tested by the user already. please test and follow up |
Checklist / 检查清单
背景
上游 issue scriptscat/scriptcat#1555 反馈安卓端界面几乎不可用。经复现,问题不限于 Firefox Android:所有支持扩展的安卓浏览器(Edge Android / Kiwi 等)都会命中,根因有三类:
100vh。vh取「大视口」(浏览器可收起 UI 收起后的高度),因此显示地址栏时外壳比当前可见区域更高;又因为外壳是「顶栏 + 内部滚动容器 + 底栏」结构,文档自身不可滚动(实测documentElement.scrollHeight == clientHeight),底部 Tab 栏 / ActionBar 落在可视区外且无法滚动出来。软键盘默认interactive-widget=resizes-visual只压缩可视视口,vh/dvh都不变,于是编辑器底部工具栏与被聚焦输入框被键盘挡住。Value/Type在 360px 下互相重叠;设置 / 工具页的SettingRow横排 + 固定宽控件把说明文案挤成每行一两个词。总计 x,已筛选 y与右侧「自动清理超过 N 天的日志」叠印在一起。该条是单行flex justify-between,左侧分组带min-w-0会被压缩,但其中的计数span是shrink-0,被压到比内容更窄后文字溢出自身盒子并直接画到右侧分组上——是溢出,不是换行或截断。实测:vi-VN 400px 宽下两个文字盒 X 轴重叠 57.6px、Y 轴完全重叠;开启自动刷新(多出「实时 · 5 秒」徽标)后,768px 宽同样重叠 30.2px,即手机横屏、平板、以及浏览器「请求桌面版网站」(980px 布局视口)也会命中。该问题与语言无关,英文界面同样重现。本次改动
src/pages/全部整页外壳h-screen/min-h-screen→h-dvh/min-h-dvh(options 布局、Sidebar、install、import、batchupdate、confirm)。options/install/import/batchupdate/confirm的 viewport meta 增加interactive-widget=resizes-content,让键盘压缩布局视口,dvh外壳与 Monaco(automaticLayout: true)自动重排到键盘上方。popup.html是固定尺寸面板、页面整体可滚动,未纳入。px-4、搜索独占一行、操作按钮换行;数据行竖排为卡片(键 / 值 / 类型徽章 + 操作),窄屏隐藏会重叠的表头。桌面端用md:contents让类型/大小/操作回到原来的独立列,列对齐不变。SettingRow移动端竖排(文案整行 + 控件在下方),桌面端仍为左文案右控件;脚本设置子视图的w-52下拉与w-40标签输入框补max-w-full,窄屏不再越界。flex-col),两个分组各w-full md:w-auto独占整行,长时间范围文本在行内truncate而不是溢出压字;「自动清理」分组窄屏允许flex-wrap(md:flex-nowrap md:shrink-0),≤360px 时换行而非横向溢出。md:flex-wrap(配合md:gap-x-2 md:gap-y-1 md:py-1):一行装不下时「自动清理」分组整行下移,而不是被统计文字压字(覆盖手机横屏 / 平板 / 桌面版网站模式)。shrink-0 whitespace-nowrap,不再被挤成两行折字;统计分隔符由全角,改为·,与顶栏一致,非中文语言下更易读。docs/references/design-patterns.md§ Layout & responsive 新增「Viewport height & on-screen keyboard」,写明外壳只能用动态视口单位、整页入口需声明interactive-widget=resizes-content及其原因。实现考虑
dvh而不是svh:svh固定按「小视口」算,地址栏收起后会留白;dvh跟随当前可见高度,与「外壳内部滚动」的结构配合最自然。md:contents:移动端需要把「类型 + 操作」并成一行卡片底栏,桌面端又要它们各占一列。用一层flex ... md:contents包裹,桌面端该容器display: contents直接消失,子元素回到原来的 flex 列位置,避免为两种形态各写一套 DOM。shrink-0)的计数文本,压缩就一定发生在别处并溢出,靠调间距治不了。窄屏让两组各占整行、宽屏允许换行后,剩余压缩由带truncate的时间范围文本吸收,任何宽度下行为都可预期。换行按 flex 的行断裂规则由内容宽度触发,因此 1280px 等常规桌面宽度仍是单行,不影响原有观感。useIsMobile与 Tailwindmd:同阈值),本次纯布局适配全部用 CSS 变体,不新增 JS 分支与重渲染。已知限制
interactive-widget目前主要由 Chromium 系实现,Firefox 会忽略该值;Firefox Android 上「键盘遮挡」只能靠dvh+ 浏览器自身把焦点元素滚入视口来缓解。建议审查重点
md:contents那层包裹)。SettingRow竖排后,Switch / 颜色选择器等控件在移动端的对齐是否可接受。src/pages/viewport-meta.test.ts覆盖)。py-1.5+gap-1,保留min-h-[34px])是否符合设计规范。关联
验证
pnpm run typecheck→ 通过pnpm run lint→ 通过(eslint + prettier + i18n + issue 模板检查)pnpm vitest run(全量)→ 3507 passed / 1 failed;失败项为src/pkg/utils/encoding.test.ts的 windows-1252 用例,在未改动的干净树上同样失败(沙箱 Node 的 legacy 编码支持所致),与本次改动无关src/pages/viewport-meta.test.ts(5 项,改动前全部失败)、src/pages/options/App.test.tsx新增「外壳使用动态视口单位」(2 项,改动前失败)、src/pages/options/routes/Logger/LoggerMobile.test.tsx新增「移动端范围/统计条竖向堆叠,统计与自动清理各自独占整行」(改动前失败:getByTestId("logger-stats-bar")找不到元素)、src/pages/options/routes/Logger/index.test.tsx新增「范围/统计条允许换行,窄桌面宽度下自动清理设置整行下移而非被统计文字压字」→ 改动后全部通过pnpm exec vitest run src/pages/options/routes/Logger/→ 5 files / 60 tests passede2e/scratch/,未纳入正式套件),证据留在本地test-results/verify/mobile-shell/、test-results/verify/logger-stats-bar/(gitignore):rowHeight=45(键/值/类型挤在一行、表头重叠)、清空按钮被裁出视口;设置页文案每行 1–2 词;日志统计条 400px 宽overlapX=57.609375 overlapY=16 overlapping=true,768px 宽(开启自动刷新)"Tổng 2 · Đã lọc 2" ✕ "Tự động xóa nhật ký cũ" ox=30.2rowHeight=89且窄屏表头隐藏、docScrollWidth == clientWidth == 360无横向溢出;设置页文案整行显示;日志统计条在 vi-VN 下把两个分组的所有子元素两两包围盒逐一比对,320 / 360 / 388 / 412 / 480 / 600 / 767 及 768 / 820 / 900 / 980 / 1024 宽(含开启自动刷新的「实时」徽标)均无任何重叠,且docScrollWidth == clientWidth无横向溢出;浅色与深色主题各测一遍[176, 386, 80, 64],数据行前两列 left489 / 677与表头完全一致;设置行仍同行(label left 473 / control left 1032);日志统计条 1280 宽仍为单行左右分布(summary x=216 / clean x=1005.84)dist/ext/src/options.html产物确认含interactive-widget=resizes-contentvh == svh == dvh == lvh(无可收起工具栏、无软键盘,探针脚本已确认),安卓真机上的工具栏/键盘行为按docs/references/develop-testing.md的「平台行为无法可靠自动化」例外以复现记录 + 规范依据留证,未提交低价值用例