Simon Willison’s TILs

我最近一直在试验 HTML 的 dialog element,例如在我的 Prompts.js JavaScript 库中。

今天,我让 Claude 为我构建一个实验,将其用于从屏幕右侧滑入的侧边栏,效果如下所示:

页面的背景变暗。一个侧边栏占据页面 80% 的宽度,显示项目详细信息——但在其下方有一个恼人的灰色间隙。

但是底部的那个间隙是怎么回事?我希望侧边栏占据整个屏幕的高度。

CSS 看起来没问题:

dialog {
  position: fixed;
  margin: 0;
  padding: 0;
  border: none;
  width: 80%;
  height: 100vh;
  top: 0;
  right: 0;
  left: auto;
  background-color: white;
  box-shadow: -5px 0 15px rgba(0, 0, 0, 0.1);
  transform: translateX(100%);
  transition: transform 0.1s cubic-bezier(0.2, 0, 0.38, 0.9);
}

那个间隙是从哪里来的?

Firefox DevTools 没有回答我的问题,所以我尝试询问 Claude,然后是 ChatGPT,等我与 Gemini 2.0 Flash 屏幕共享 并大声地争论 CSS 时,Natalie 听到了,她可怜我并主动提供帮助。

她怀疑这与 <dialog> 元素有关。我让 Claude 3.7 Sonnet 重写代码以使用 div 而不是 dialog,神秘的间隙消失了,这强烈暗示她是正确的。

我当时使用的是 Firefox。Natalie 指出 Chrome DevTools 会显示元素的默认浏览器样式,因此我们切换到了 Chrome,结果是...

Chrome DevTools 中的一些内容。一个箭头指向 user agent stylesheet 中的一行,该行将 max-height: calc(100% - 6px - 2em) 应用于 dialog:-internal-dialog-in-top-layer

Chrome 正在应用这些默认样式,包括 max-height 的样式:

dialog:-internal-dialog-in-top-layer {
  position: fixed;
  inset-block-start: 0px;
  inset-block-end: 0px;
  max-width: calc(100% - 2em - 6px);
  max-height: calc(100% - 2em - 6px);
  user-select: text;
  visibility: visible;
  overflow: auto;
}

神秘的间隙完全可以用 max-height: calc(100% - 2em - 6px); 规则来解释。

在我的 CSS 中添加 max-height: none(或 max-height: 100vh)修复了这个错误!

与之前相同的屏幕,但这次侧边栏面板从视口的顶部延伸到底部,没有间隙。

你可以在这里尝试

深入 HTML 规范

我很好奇这是否是预期的行为,所以我挖掘了一下,并在 HTML 规范 中找到了它:

15.3.3 流内容

... dialog:modal { position: fixed; overflow: auto; inset-block: 0; max-width: calc(100% - 6px - 2em); max-height: calc(100% - 6px - 2em); }


该规范位于 GitHub 上,是一个 7MB 的源文件,太大而无法通过 GitHub 网络界面查看,所以我运行了以下命令:

```bash
cd /tmp
git clone git@github.com:whatwg/html
cd html
git blame source | rg 'max-height:' -C 30

它花了一段时间来运行:

Blaming lines: 53% (79074/148234)

显示了相关的 commit:

075834570 (Tim Nguyen 2023-06-06 21:45:41 -0700 136481) dialog:modal {
075834570 (Tim Nguyen 2023-06-06 21:45:41 -0700 136482)  position: fixed;
075834570 (Tim Nguyen 2023-06-06 21:45:41 -0700 136483)  overflow: auto;
075834570 (Tim Nguyen 2023-06-06 21:45:41 -0700 136484)  inset-block: 0;
075834570 (Tim Nguyen 2023-06-06 21:45:41 -0700 136485)  max-width: calc(100% - 6px - 2em);
075834570 (Tim Nguyen 2023-06-06 21:45:41 -0700 136486)  max-height: calc(100% - 6px - 2em);
075834570 (Tim Nguyen 2023-06-06 21:45:41 -0700 136487) }

075834570 移动了该文本但没有引入它,所以我针对父树 运行了相同的命令:

git checkout af3ff8382c74f7dc9a98dcdd49a24d96bfc75f26
git blame source | rg '100% - 6px' -C 30

发现了这个:

979af1532 (Ian Kilpatrick 2020-11-03 10:26:48 -0800 124234)  <ul>
979af1532 (Ian Kilpatrick 2020-11-03 10:26:48 -0800 124235)  <li><span>'position'</span> property to 'fixed'</li>
979af1532 (Ian Kilpatrick 2020-11-03 10:26:48 -0800 124236)  <li><span>'overflow'</span> property to 'auto'</li>
979af1532 (Ian Kilpatrick 2020-11-03 10:26:48 -0800 124237)  <li><span>'inset-block-start'</span> property to '0'</li>
979af1532 (Ian Kilpatrick 2020-11-03 10:26:48 -0800 124238)  <li><span>'inset-block-end'</span> property to '0'</li>
979af1532 (Ian Kilpatrick 2020-11-03 10:26:48 -0800 124239)  <li><span>'max-width'</span> property to 'calc(100% - 6px - 2em)'</li>
979af1532 (Ian Kilpatrick 2020-11-03 10:26:48 -0800 124240)  <li><span>'max-height'</span> property to 'calc(100% - 6px - 2em)'</li>
979af1532 (Ian Kilpatrick 2020-11-03 10:26:48 -0800 124241)  </ul>

这是 979af1532,带有 commit 信息:

将模态 <dialog> 的定位方式更改为 CSS 修复了 w3c/csswg-drafts#4645。修复了 #5178

该 commit 于 2020 年 11 月提交,并且这些链接的 issue 线程包含有关此更改如何发生的各种详细信息。

我今天还发现 HTML Living Standard 确实是一个 living standard - whatwg/html 仓库有 12,318 个 commits,最近的一个提交不到 24 小时前。

更新:Firefox 可以显示浏览器样式

感谢 uallo 在 Hacker News 上,我了解到 Firefox 可以 在检查器中显示浏览器样式,但该选项默认情况下处于关闭状态:

Firefox DevTools 的屏幕截图 - 单击点点点菜单,然后单击设置,然后在检查器部分单击显示浏览器样式

我想默认情况下它是关闭的,因为它添加了很多信息:

DevTools 现在显示了 dialog 和 dialog:modal 的大量 CSS,显示为来自 user_agent html.css

而且由于 that,我在 Firefox 源代码存储库中找到了 html.css,其中列出了该浏览器中使用的所有默认样式。

创建于 2025-03-14T16:06:34-07:00,更新于 2025-03-16T08:50:25-07:00 · 历史记录 · 编辑