Adam Argyle 在 web.dev 上 发布了一篇文章 深入探讨了这个问题。 他从你需要进行垂直居中和水平居中的假设出发。 传统上,垂直居中对人们来说有点棘手,尤其是在内容高度未知的情况下。
我们有 一份完整的居中指南,涵盖了各种情况,如决策树。
Adam 详细介绍了处理此问题的五种(!) 方法,甚至深入到未知垂直和水平尺寸的居中,以及一些其他限制,如语言方向和多个元素。 我想关于 CSS 中居中困难的所有愚蠢笑话都需要更新了。 也许他们应该嘲笑CSS 中有这么多很棒的居中方法。
Adam 很好地列出了所有技术的优缺点,并清楚地演示了它们。 还有一个 视频。 他选择“温柔的 Flex”作为最佳方法
.gentle-flex {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1ch;
}
我总能在我的样式表中找到它,因为它对宏观和微观布局都有用。 这是一个全面的可靠解决方案,其结果符合我的预期。 此外,因为我是一个内在大小的狂热爱好者,所以我倾向于采用这种解决方案。 诚然,输入很多内容,但它带来的好处超过了额外的代码。
请记住,当你在“CSS 中居中”时,它并不总是处于这些极端情况。 让我们再看一个情况,只是为了好玩。 假设你需要水平居中一些inline-*
¹ 元素……text-align: center;
可以用一行代码实现
但是,如果你需要居中这些项目的父元素呢? 你可能会认为你可以使用经典的margin: 0 auto;
方法,而且你可以,但父元素很可能是块级元素,因此要么是全宽,要么具有固定宽度。 假设你希望它与它包含的内容一样宽。 你可以使父元素inline-*
,但是然后你需要另一个父元素来设置text-align
以使其居中。
Stefan Judis 最近 谈到了这一点。 诀窍是保持元素为块级,但使用width: fit-content;
老式的温柔 Flex 也许可以在这里发挥作用,但我们又需要一个额外的父元素。 总是需要考虑的事情。
- 我所说的
inline-*
是:inline
、inline-block
、inline-flex
、inline-grid
或inline-table
。 我错过了什么吗?
Safari 尚未支持 Gap 属性,那么这怎么算是一种可靠的方法呢?
Grid-gap
Gap 与居中问题实际上没有关系,但在任何情况下,它都处于 Safari 的 TP 状态……终于。
注意使用
fit-content
。IE 和 Firefox 的辅助功能存在问题
关于这方面有什么消息吗? 是不起作用还是以某种方式对辅助功能产生负面影响?
Firefox 取消了 width: fit-content,称其为无效属性值。 但是,在 Edge、Chrome 和 Safari 中运行良好。