跟随 5 种居中技术,看它们如何通过一系列测试,找出哪种技术最能适应变化。
在 CSS 中居中是一个出了名的难题,充满了笑话和嘲讽。2020 CSS 已经成熟,现在我们可以坦然地笑对这些笑话,而不是咬牙切齿。
如果您更喜欢视频,可以观看此博文的 YouTube 版本:
挑战
居中方式有多种。因为用例不同、要居中的内容数量不同,等等。为了展示“胜出”的居中技术背后的原理,我创建了 Resilience Ringer。这是一系列压力测试,旨在让每种居中策略在其中达到平衡,并让您观察其性能。 最后,我会揭晓得分最高的技术,以及“最具价值”的技术。 希望您能从中收获新的居中技巧和解决方案。
抗压能力
Resilience Ringer 代表了我的信念,即居中策略应该能够灵活适应国际化布局、不同尺寸的视口、文本编辑和动态内容。这些原则有助于为居中技术制定以下弹性测试,以确保其能够经受住考验:
- 挤压: 居中应能够处理宽度变化
- Squashed: centering should be able to handle changes to height
- 重复:居中应根据内容数量动态调整
- 修改:居中应根据内容的长度和语言动态调整
- 流:居中应与文档方向和书写模式无关
获胜的解决方案应展现其弹性,在被挤压、压扁、复制、编辑以及切换到各种语言模式和方向时,内容仍能保持在中心位置。一个值得信赖、具有韧性且安全的中心。
Legend
我提供了一些视觉颜色提示,帮助您在上下文中保留一些元信息:
- 粉色边框表示居中样式的归属
- 灰色框是容器的背景,容器中的内容会居中显示
- 每个子元素都具有白色背景色,以便您查看居中技术对子元素框大小的影响(如果有)
5 位参赛者
5 种专注技巧进入抗逆力擂台,只有一种能获得抗逆力皇冠 👸。
1. 内容中心
- Squish:太棒了!
- Squash:太棒了!
- 复制:太棒了!
- 修改:太棒了!
- 心流:太棒了!
display: grid 和 place-content 简写形式的简洁性很难超越。由于它会集中并对齐子元素,因此对于要读取的元素组,这是一种可靠的居中技术。
.content-center {
display: grid;
place-content: center;
gap: 1ch;
}
- 即使在空间受限和溢出的情况下,内容也会居中
- 集中编辑和维护,一站式搞定
- Gap 可确保 n 个子项之间的间距相等
- 默认情况下,网格会创建行
- 最宽的子项 (
max-content) 会设置所有其他子项的宽度。Gentle Flex 中将对此进行详细讨论。
非常适合包含段落和标题的宏布局、原型或通常需要清晰居中的内容。
2. 柔和 Flex
- Squish:太棒了!
- 壁球:太棒了!
- 重复:太棒了!
- 编辑:太棒了!
- Flow:太棒了!
Gentle Flex 是一种更纯粹的仅居中策略。它柔和而温和,因为与 place-content: center 不同,在居中过程中,子级框的大小不会发生变化。所有内容都尽可能温和地堆叠、居中和留出间距。
.gentle-flex {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1ch;
}
- 仅处理对齐、方向和分布
- 编辑和维护都在一个位置完成
- Gap 可确保 n 个子项之间的间距相等
- 代码行数最多
非常适合宏观和微观布局。
3. Autobot
- 挤压:极佳
- 壁球:极佳
- 重复:罚款
- 修改:太棒了
- 心流:极佳
容器设置为 flex,没有对齐样式,而直接子元素则使用自动外边距进行样式设置。在元素的所有侧面进行操作,margin: auto会让人感到怀旧和美妙。
.autobot {
display: flex;
}
.autobot > * {
margin: auto;
}
- 趣味技巧
- 快速而粗糙
- 溢出时结果不理想
- 依赖分布而非间距意味着布局可能会出现子项触及边缘的情况
- 被“推”到某个位置似乎不是最佳选择,并且可能会导致子级框大小发生变化
非常适合居中图标或伪元素。
4. Fluffy Center
- 挤压:差
- 壁球:差
- 重复:不佳
- 编辑:太棒了!
- Flow:太棒了!(只要您使用逻辑属性)
“fluffy center”是目前为止听起来最美味的居中技术,也是唯一一种完全由元素/子元素控制的居中技术。看到我们单独的粉色内边框了吗!?
.fluffy-center {
padding: 10ch;
}
- 保护内容
- 原子
- 每项测试都暗含这种居中策略
- 字词间距是间隙
- 产生无用感
- 容器和内容之间存在冲突,因为它们都对自己的尺寸非常坚持
非常适合以字词或短语为中心的居中、标记、胶囊、按钮、条状标签等。
5. Pop & Plop
- Squish:好的
- 壁球:好
- 重复:不佳
- 修改:罚款
- 流量:正常
这会“弹出”,因为绝对定位会将元素从正常流程中弹出。名称中的“plop”部分源于我发现它最有用的时候:将其放在其他内容之上。这是一种经典且实用的叠加层居中技术,可根据内容大小灵活调整。有时,您只需要将界面放置在其他界面之上。
- 有用
- 可靠
- 在您需要时,它会发挥巨大作用
- 包含负百分比值的代码
- 需要
position: relative才能强制创建包含块 - 过早换行和突兀换行
- 每个包含块只能有 1 个,无需额外操作
非常适合模态、消息框和消息、堆叠和深度效果、弹出式窗口。
获胜者
如果我身处孤岛,只能使用一种静心技巧,我会选择…
[鼓声]
Gentle Flex 🎉
.gentle-flex {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 1ch;
}
您始终可以在我的样式表中找到它,因为它对宏布局和微布局都很有用。这是一个全方位可靠的解决方案,其结果符合我的预期。此外,由于我是内在尺寸的狂热爱好者,我倾向于采用这种解决方案。的确,这需要输入很多内容,但它带来的好处远大于额外代码带来的麻烦。
MVP
Fluffy Center
.fluffy-center {
padding: 2ch;
}
Fluffy Center 非常微观,很容易被忽略为居中技术,但它是我的居中策略的主要内容。它非常原子化,有时我甚至会忘记自己正在使用它。
总结
哪些因素会破坏您的居中策略?还有哪些挑战可以添加到抗逆力挑战中?我考虑过平移和容器上的自动高度切换…还有什么!?
现在,您已经知道我是如何做到的,那么您会怎么做呢?!让我们采用多样化的方法,学习在 Web 上构建应用的所有方式。按照此博文中的 Codelab 操作,创建您自己的居中示例,就像此博文中的示例一样。在 Twitter 上向我发送您的版本,我会将其添加到下面的社区混剪部分。
社区混剪
- CSS Tricks 发布的博文