在CSS3的世界里,实现垂直居中的方式的确是越来越丰富了,而且许多新方法都非常简洁高效。抛开那些老掉牙的`lineheight`跟随、`verticalalign: middle`配合`display: tablecell`的老套路,纯CSS3确实给我们带来了不少令人耳目一新的解决方案。
我一直觉得,最能体现CSS3进步的一点,就是它赋予了我们更多控制元素布局的“权力”。其中,Flexbox(弹性盒子模型)和Grid(网格布局)无疑是这场革命的两位主角,它们在垂直居中方面表现尤为出色。
Flexbox:布局的瑞士军刀,居中也不在话下
Flexbox的强大之处在于它能以一种“盒子”的概念来处理元素间的关系。想象一下,你有一个容器,里面装着你想垂直居中的元素。通过给容器设置`display: flex;`,我们就启动了这个弹性布局模式。
然后,关键的魔法就落在了`alignitems`属性上。如果你想让容器内的所有子元素(也就是我们想居中的那个元素)在交叉轴(默认是垂直方向)上居中,那么简单地给容器加上`alignitems: center;`就可以了。
举个例子,假设我们有一个`div`作为容器,里面还有一个`div`是我们想要垂直居中的:
```html
```
给`.container`加上样式:
```css
.container {
display: flex; / 开启Flexbox布局 /
alignitems: center; / 在交叉轴(垂直方向)上居中 /
/ 为了更好地展示效果,给容器一些高度 /
height: 300px;
border: 1px solid black; / 方便查看 /
}
.item {
backgroundcolor: lightblue; / 方便查看 /
padding: 20px;
}
```
就这样,那个`.item`就会非常漂亮地出现在`.container`的垂直中心了。是不是很简单?
而且,Flexbox的`alignitems`还可以接受`flexstart`(顶部对齐)、`flexend`(底部对齐)等值,非常灵活。如果你只想让某一个特定的子元素居中,而不是所有子元素,可以给那个子元素本身设置`alignself: center;`,它会覆盖容器的`alignitems`设置。
Grid:二维布局的王者,居中简直不费吹灰之力
Grid布局比Flexbox更进一步,它能同时处理行和列,实现真正的二维布局。在垂直居中这件事上,Grid提供了两种同样令人惊喜的方法。
方法一:利用`alignitems`和`justifyitems`(类似Flexbox的思路)
与Flexbox类似,给Grid容器设置`display: grid;`后,我们也可以使用`alignitems`属性来控制子项在垂直方向上的对齐。
```html
```
给`.gridcontainer`加上样式:
```css
.gridcontainer {
display: grid; / 开启Grid布局 /
alignitems: center; / 在垂直方向(行轴)上居中 /
/ 同样,给容器一些高度 /
height: 300px;
border: 1px solid black;
}
.griditem {
backgroundcolor: lightgreen;
padding: 20px;
}
```
这里,`alignitems: center;`的作用和Flexbox中几乎一模一样。Grid还有一个`justifyitems`属性,用于控制子项在水平方向(列轴)上的对齐。如果你同时设置`justifyitems: center;`,那么你的元素就会实现完美的水平和垂直居中。
方法二:利用`placeitems`(更简洁的写法)
CSS Grid还提供了一个更简洁的复合属性`placeitems`,它可以同时设置`alignitems`和`justifyitems`。
所以,上面的Grid例子可以进一步简化:
```css
.gridcontainer {
display: grid;
placeitems: center; / 同时在垂直和水平方向上居中 /
height: 300px;
border: 1px solid black;
}
.griditem {
backgroundcolor: lightgreen;
padding: 20px;
}
```
`placeitems: center;`简直是实现元素完全居中的利器,一行代码就搞定。它的语法是`alignitems`的值在前,`justifyitems`的值在后,所以`placeitems: center;`等同于`alignitems: center; justifyitems: center;`。
为什么说这些是“新方法”?
之所以称它们为“新方法”,是因为相较于以前那些需要“ hacks”(技巧)或者依赖特定HTML结构(比如tablecell)的方案,Flexbox和Grid是CSS标准本身提供的、更具语义化和更易于维护的布局解决方案。它们改变了我们看待和组织页面布局的方式,而垂直居中只是它们众多强大功能中的一个小小体现。
总而言之,如果你想在现代CSS中实现垂直居中,优先考虑Flexbox或Grid。它们不仅强大,而且代码写起来也让人心情舒畅,真正体会到了CSS3带来的便利和优雅。