使用CSS居中的问题不是关于记住justify-content: center;
属性。更多的是与不同的布局结构有关的,它们有自己的规则,并且可能不尊重某种方法。
但是,首先,这篇指南是为谁创建的:
- 感到被
CSS
的“规则和条例”压倒的前端开发人员。
- 感到被
- 找不到使那个
div
永远居中的人。啊啊啊!
- 找不到使那个
- 困在结构混乱的模板/主题中的网站所有者。
在CSS
中,居中通常被称为垂直、水平或垂直和水平。
你也可以把它理解为左、右和左右。在某些情况下,你还可以看到它被称为上下。这些术语也将是我们在本指南中使用的术语。话虽如此,让我们从最受欢迎的方法开始。
内联与块级元素:text-align
最初可能不明显的一件事是,text-align: center;
不仅适用于段落。作为一个属性,它可以应用于任何被视为块级的元素。这意味着只要你的内容被包裹在<div>
或类似的元素中,就可以使用text-align
居中。
1 | <style> |
这种方法的好处是它适用于Grid
和Flexbox
。只要你将内容包裹在div
中,它对于诸如图像之类的内容也可以正常工作。
另外,它在列表中也很有效:
让我们看看如果我们尝试将一个<span>
元素居中,而不先将其包装在块级容器中会发生什么。
1 | .span-demo-container { |
结果是:
之所以这个<span>
元素没有居中,是因为它是一个内联元素。对于内联元素,你总是想要设置一个父元素。
因此,如果我们回头并将span-demo-center
类应用于<div>
,结果将是这样:
如果你使用大量的代码库或使用结构混乱的模板,这通常是居中不起作用的第一个原因。因此,请始终检查块级和内联元素,并查看它们是否正确嵌套。
使用固定宽度居中块级元素
另一种居中元素的流行方法是使用margin: auto;
,这在具有固定宽度的块级元素中最常用。
所以,想象一个大容器内的自定义div
。然后,你试图将内容放入该自定义div元素并将其居中。
让我们做一个实际的例子来看它是如何运作的:
1 | .margin-auto-container { |
在这个例子中,margin-auto-container
class
从这篇博文中取得容器,然后我们创建一个新class
叫margin-auto-inner
并对其应用了固定宽度的自定义样式。最后,我们应用margin: 0 auto;
确保我们的内部容器相对于主容器始终居中。
为什么加了
0
呢?我们添加了0
是因为我们希望保持垂直(上下)的边距不变,并在水平(左右)视图上应用自动边距。你可以更改这个值以指定单独的边距,例如"margin: 25px auto 50px;"
,这将在顶部保留25px
边距,并在底部保留50px
边距。
重要提示:你的
margin: auto;
没有居中的原因是因为你没有为要居中的元素设置固定宽度。
我们还指定text-align: center;
,因为这将使内部容器中的文本居中。
使用固定宽度居中内联元素
在内联元素的情况下,自定义设置的宽度会被忽略。
1 | .margin-auto-container { |
结果是:
正如你所看到的,尽管设置了margin: auto;
,但span
内联元素并未居中。
幸运的是,对此有一个简单的修复方法。通过向我们的margin-auto-inner-span
类添加display: block;
属性,我们可以告诉浏览器我们希望该特定元素被视为块级元素。现在它应该被居中了:
此时,你可能会想知道哪些HTML元素被视为块级元素,哪些被视为内联元素。可以理解的。我建议查看MDN.
如果你知道内联和块级之间的区别,找到适合你问题的居中解决方案就会更容易。”
Grid & Flexbox: 现代方式
网格(Grid
)和弹性盒子(Flexbox
)是现代网页设计中使用的两个布局模块。而Flexbox
是一种一维布局系统,Grid
则是基于二维方法的。
在这两种布局中,只需两行代码即可实现div
的居中。
通用解决方案:Vertical & Horizontal
对于Grid
和Flexbox
布局,你可以使用place-content: center;
属性。
1 | .center-div-grid-layout { |
place-content
属性是align-content
和justify-content
的简写形式。
使用place-content
,你可以做多种布局变化,取决于你正在处理的布局风格:
总的来说,只有极少数情况下,上述居中技术不足以满足需求。如果你正在使用古老的布局,最好的方法是在样式表中找到类名的不一致之处。然后找到一种适当的方法来正确嵌套元素,以便执行指定的居中逻辑。
绝对居中:transform
当你希望将某物居中“正中央”时,可以使用transform
属性——水平和垂直(左、右、上、下)。
1 | .transform-example-container { |
这通过将子元素的position
设置为absolute
来实现。
重要的是父元素必须具有相对位置,否则transform
属性将使用主布局作为其父级。
我们使用top
和left
来相对于左上角设置位置。之后,可以使用translate()
将元素拉入中心。margin
和padding
应设置为0
,否则会出现位置偏移。
如果你想精通使用CSS进行居中——启动你喜爱的代码编辑器,开始测试这些示例吧。