我们终于学会了让 div 居中,然后浏览器又加了侧边栏

Lobsters Hottest 工具

摘要

一篇关于 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

Lobsters Hottest

一位前端开发者讨论了经典CSS全宽辅助类的缺陷,并提出了使用CSS容器和容器单位的现代修复方法,以避免与滚动条相关的裁剪问题。

CSS:不可避免的坏部分

Lobsters Hottest

一位非Web开发者的个人博客文章讨论了CSS中不可避免的坏部分,包括布局难题、浏览器默认设置和过度使用包装器,同时强调了可处理简单任务的子集。

锚点定位入门

Lobsters Hottest

一份全面的CSS锚点定位API指南,解释了如何使用 `position-anchor` 和 `position-area` 属性将元素锚定到其他元素,涵盖了如工具提示和下拉菜单等常见用例。

关于 <dl>

Simon Willison's Blog

Ben Meyer 的一篇博客文章分享了一些关于 HTML <dl> 元素的新鲜知识,包括多个 <dd> 可以跟在同一个 <dt> 后面、可以在 <div> 内分组、ARIA 标注,以及自 2008 年起它们就被称为“描述列表”。

我如何在博客中使用CSS View Transitions

Lobsters Hottest

作者详细介绍了如何在静态博客上仅使用CSS跨文档视图过渡来为页面导航添加动画,无需JavaScript路由,包括设置布局列和动画。