灵活的盒子布局
随着CSS Flexible Box的问世,许多Web设计师的噩梦1得到了解决。hacky之一,垂直对齐。现在即使在未知高度也有可能。
“两十年的布局黑客活动即将结束。也许不是明天,而是很快,还有我们的余生。”
— CSS传奇Eric Meyer在W3Conf 2013上
柔性箱(或简称为Flexbox)是一种专门用于布局目的的新布局系统。该规范规定:
Flex布局在表面上类似于块布局。它缺少许多可用于块布局的更复杂的以文本或文档为中心的属性,例如浮点数和列。作为回报,它获得了简单而强大的工具,可以按照Web应用程序和复杂网页经常需要的方式来分配空间和对齐内容。
在这种情况下如何提供帮助?好的,我们等着瞧。
垂直对齐的列
使用Twitter Bootstrap,我们有.row
一些.col-*
。我们要做的就是将所需的.row
2显示为flex容器框,然后按属性将其所有flex项目 s(各列)垂直对齐align-items
。
此处示例 (请仔细阅读评论)
<div class="container">
<div class="row vertical-align"> <!--
^-- Additional class -->
<div class="col-xs-6"> ... </div>
<div class="col-xs-6"> ... </div>
</div>
</div>
.vertical-align {
display: flex;
align-items: center;
}
输出
彩色区域显示列的填充框。
澄清 align-items: center
8.3跨轴对齐:align-items
属性
伸缩项可以在伸缩容器的当前行的横轴上对齐,类似于justify-content
但在垂直方向上。align-items
为所有flex容器的项目设置默认对齐方式,包括匿名flex项目。
align-items: center;
按中心值,弹性项目的边距框位于行内交叉轴的中心。
大警报
重要说明#1: Twitter Bootstrap不会width
在超小型设备中指定列的,除非您为.col-xs-#
列提供类之一。
因此,在这个特定的演示中,我使用了.col-xs-*
类,以便在移动模式下正确显示列,因为它明确指定width
了列的。
但是,您也可以简单地通过更改为特定的屏幕尺寸来关闭 Flexbox布局。例如:display: flex;
display: block;
/* Extra small devices (767px and down) */
@media (max-width: 767px) {
.row.vertical-align {
display: block; /* Turn off the flexible box layout */
}
}
或者您可以仅在特定的屏幕尺寸上指定,.vertical-align
例如:
/* Small devices (tablets, 768px and up) */
@media (min-width: 768px) {
.row.vertical-align {
display: flex;
align-items: center;
}
}
在这种情况下,我会采用@KevinNelson的方法。
重要说明#2:由于简洁,省略了供应商前缀。Flexbox语法在此期间已更改。新的书面语法在旧版本的Web浏览器上将不起作用(但不能与Internet Explorer 9一样旧!Internet Explorer 10和更高版本支持Flexbox)。
这意味着您还应该display: -webkit-box
在生产模式下使用供应商前缀属性,例如等等。
如果在演示中单击“切换编译视图”,您将看到CSS声明的前缀版本(这要归功于Autoprefixer)。
具有垂直对齐内容的全高列
正如您在上一个演示中看到的那样,列(弹性项目)不再像其容器(弹性容器框,即.row
元素)那样高。
这是因为使用属性center
值align-items
。默认值为,stretch
以便项目可以填充父元素的整个高度。
为了解决这个问题,您还可以添加display: flex;
到列中:
此处示例 (再次,请注意评论)
.vertical-align {
display: flex;
flex-direction: row;
}
.vertical-align > [class^="col-"],
.vertical-align > [class*=" col-"] {
display: flex;
align-items: center; /* Align the flex-items vertically */
justify-content: center; /* Optional, to align inner flex-items
horizontally within the column */
}
输出
彩色区域显示列的填充框。
最后但并非最不重要的一点是,请注意,此处的演示和代码段旨在为您提供不同的想法,从而提供一种实现目标的现代方法。如果要在现实世界的网站或应用程序中使用此方法,请注意“ 大警报 ”部分。
为了进一步阅读,包括浏览器支持,这些资源将很有用:
1. 将div内的图像与响应高度垂直对齐
2.最好使用其他类,以免更改Twitter Bootstrap的默认值.row
。
div
,里面没有文本,像这样的jsfiddle.net/corinem/Aj9H9,但是在这个示例中,我不使用bootstrap