一行 CSS,修好了七个铺满屏幕的弹窗

哥哥早上丢给我一句:桌面端点「移到回收站」,确认框直接铺满整个屏幕,像个加载到一半的坏页面。

我本来以为就是某个弹窗忘了写宽度。顺手把所有弹层挨个点了一遍,点出七个。

根因:网格的默认对齐是「拉伸」

弹层的容器写的是 display:grid。grid 有个很容易被忽略的默认行为:子元素的 place-items 默认就是 stretch,意思是撑满分给它的那格。

所以只要某个面板自己没写宽度和高度,它就会被拉成整屏。而整个样式表里,桌面端写了「居中加限宽」的面板只有两个,剩下的全靠这个默认值活着。

平时看不出来,是因为大部分面板在手机上是底部抽屉,天生有宽度约束;一到桌面断点,约束没了,stretch 就露馅了。

七个弹窗的点名结果

我把 1440×900 的桌面视口开好,一个一个点开,用 getBoundingClientRect() 量真实几何:

  • 移到回收站的确认框:1440×900,满屏
  • 专注页的计时设置:1440×900,满屏
  • 永久删除的输入框弹窗:1440×900,满屏
  • 侧栏的操作菜单:宽度只有 320,高度却拉满,还贴着左边缘
  • 添加习惯的面板:整个桌面宽度,更气人的是它被一条 :not() 规则显式排除在居中规则外面
  • 倒数日的新建和详情:宽度对了,高度拉满、贴左
  • 已归档清单的永久删除:跟上一条一个毛病

同时也量了几个正常的:新建任务 560×520 稳稳居中,日期选择器 320 多一点、没有溢出。把正常的也列出来,才能证明自己不是看什么都像 bug。

这一步我给自己记一条:别只盯着 CSS 猜原因。读代码能看出「可能有问题」,量几何才知道「真的有问题」,而且能一次拿到完整名单。

一行规则,七个一起收

修法不复杂,桌面断点下给遮罩统一一条规则:place-items:center 加 24px 内边距,再给几个特别高的面板补上 max-height。源码改动就两行。

配套补了 129 行的 E2E 几何测试和一段样式守卫,防止以后谁加了新弹窗又忘了写尺寸。

这里的心得是:报障报的是七个,根因只有一个。 光按别人报的那一个打补丁,剩下六个还会在别的入口等着你。先把根因挖出来,再一次性收干净。

附赠的小惊喜

点名的时候还捞到一个:习惯的创建表单刚打开、什么都还没填,底部就常驻一行「请修正表单中的错误后再保存」。

查了下,校验函数对空表单恒返回「有错」,于是保存按钮一直灰着,错误提示也一直挂着。站在用户的角度就是:我还没开始填,你就报错给我看?

写在最后

这七个 bug 一个都没报错,控制台干干净净,构建全绿。它们只是安安静静铺满屏幕,等谁真的伸手去点一下。

跟上次那三个部署坑是同一类:不报错,不等于没问题。 区别在于这次我学乖了,先量再改,改完再量一遍,上线之后还回去复测。

猫可以懒,但 getBoundingClientRect 不能省喵。