我们终于学会了让 div 居中,然后浏览器又加了侧边栏
摘要
一篇关于 CSS/JS 技术和小工具的博客文章,该工具在考虑浏览器侧边栏和开发者工具的情况下正确居中 div,并通过指针事件校正位置。
<p><a href="https://lobste.rs/s/ikkudb/we_finally_learned_center_div_then">评论</a></p>
查看缓存全文
缓存时间: 2026/08/04 23:51
# 我们终于学会了居中一个 div,然后浏览器又加了侧边栏
来源:http://seg6.space/posts/center-div/
过去,让一个 div 居中需要这样一个小小的仪式:
``
.thing {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
``
如今,它简直变得容易得令人失望:
``
body {
display: grid;
min-height: 100dvh;
place-items: center;
}
``
我用了这个方法来实现你现在正在读的 `\.site` div。它看起来是居中的,直到我在一个带有可见侧边栏的浏览器中打开它。
`.site` div 仍然完美居中,只是在一个错误的矩形内。我觉得解决办法应该很简单:JavaScript 知道 webview 和浏览器窗口的宽度。
``
window.innerWidth // webview 的宽度
window.outerWidth // 整个浏览器窗口的宽度
const browserChrome = window.outerWidth - window.innerWidth;
``
当侧边栏在左侧时,我可以将 `.site` 往回移动这个差值的一半:
``
const shift = -browserChrome / 2;
``
``
.site {
translate: var(--window-center-shift, 0px);
}
``
这个方法一直有效,直到我打开了 DevTools。
我的 DevTools 停靠在右侧,所以现在的宽度差异包含了浏览器两侧的 UI。它给了一个总数,却无法告诉我这个总数是怎么分配的。
最终提供那个缺失坐标的是指针(pointer)。一个可信的 pointer 事件知道它在屏幕上的位置,也知道它在 webview 中的位置,这足以确定 webview 在窗口中的位置:
``
const viewportLeft = event.screenX - event.clientX * scale;
const viewportRight = viewportLeft + innerWidth * scale;
const left = viewportLeft - window.screenX;
const right = window.screenX + outerWidth - viewportRight;
const shift = (right - left) / (2 * scale);
``
Firefox 直接暴露了相同的视口位置。Chromium 则没有,所以这个站点先使用左侧边栏的估算值,一旦指针进入页面就进行修正。
## center, actually
我想在我无法控制的页面上尝试同样的修正,所以我做了 **center, actually** (https://github.com/seg6/center-div)。它会自己找出被居中的元素;如果猜错了,我可以手动选一个。演示页面 (https://seg6.space/center-div/) 是查看差异的最简单的地方。
相似文章
修复全宽CSS
一位前端开发者讨论了经典CSS全宽辅助类的缺陷,并提出了使用CSS容器和容器单位的现代修复方法,以避免与滚动条相关的裁剪问题。
CSS:不可避免的坏部分
一位非Web开发者的个人博客文章讨论了CSS中不可避免的坏部分,包括布局难题、浏览器默认设置和过度使用包装器,同时强调了可处理简单任务的子集。
锚点定位入门
一份全面的CSS锚点定位API指南,解释了如何使用 `position-anchor` 和 `position-area` 属性将元素锚定到其他元素,涵盖了如工具提示和下拉菜单等常见用例。
关于 <dl>
Ben Meyer 的一篇博客文章分享了一些关于 HTML <dl> 元素的新鲜知识,包括多个 <dd> 可以跟在同一个 <dt> 后面、可以在 <div> 内分组、ARIA 标注,以及自 2008 年起它们就被称为“描述列表”。
我如何在博客中使用CSS View Transitions
作者详细介绍了如何在静态博客上仅使用CSS跨文档视图过渡来为页面导航添加动画,无需JavaScript路由,包括设置布局列和动画。