如何在Flexbox中垂直和水平居中放置元素
以下是两个常规的居中解决方案。
一个用于垂直对齐的弹性项目(flex-direction: column
),另一个用于水平对齐的弹性项目(flex-direction: row
)。
在这两种情况下,居中div的高度可以是可变的,不确定的,未知的等。居中的div的高度无关紧要。
这是两者的HTML:
<div id="container"><!-- flex container -->
<div class="box" id="bluebox"><!-- flex item -->
<p>DIV #1</p>
</div>
<div class="box" id="redbox"><!-- flex item -->
<p>DIV #2</p>
</div>
</div>
CSS(装饰风格除外)
弹性物品垂直堆叠时:
#container {
display: flex; /* establish flex container */
flex-direction: column; /* make main axis vertical */
justify-content: center; /* center items vertically, in this case */
align-items: center; /* center items horizontally, in this case */
height: 300px;
}
.box {
width: 300px;
margin: 5px;
text-align: center; /* will center text in <p>, which is not a flex item */
}
演示
当伸缩项目水平堆叠时:
flex-direction
从上面的代码中调整规则。
#container {
display: flex;
flex-direction: row; /* make main axis horizontal (default setting) */
justify-content: center; /* center items horizontally, in this case */
align-items: center; /* center items vertically, in this case */
height: 300px;
}
演示
集中弹性项目的内容
一个范围柔性格式化的内容被限制为父子关系。子代之外的flex容器的后代不参与flex布局,并且将忽略flex属性。本质上,flex属性不能在子级之外继承。
因此,您始终需要将display: flex
或display: inline-flex
应用于父元素,以便将flex属性应用于子级。
为了使flex项目中包含的文本或其他内容垂直和/或水平居中,请将项目设为(嵌套的)flex容器,然后重复居中规则。
.box {
display: flex;
justify-content: center;
align-items: center; /* for single line flex container */
align-content: center; /* for multi-line flex container */
}
此处有更多详细信息:如何在Flexbox中垂直对齐文本?
或者,您可以将其应用于margin: auto
弹性项目的content元素。
p { margin: auto; }
auto
在此处了解有关弹性边距的信息:对齐弹性项目的方法(请参见框#56)。
将多行弹性项目居中
当flex容器具有多行(由于包装)时,该align-content
属性对于跨轴对齐将是必需的。
从规格:
8.4。包装伸缩线:align-content
属性
align-content
当横轴上有多余的空间时,此属性会在Flex容器内将Flex容器的线justify-content
对齐,类似于在主轴内对齐单个项目的方式。
注意,此属性对单行flex容器无效。
此处有更多详细信息:flex-wrap如何与align-self,align-items和align-content一起使用?
浏览器支持
除了IE <10以外,所有主流浏览器都支持Flexbox 。某些最新的浏览器版本(例如Safari 8和IE10)需要供应商前缀。要快速添加前缀,请使用Autoprefixer。此答案中有更多详细信息。
旧版浏览器的居中解决方案
有关使用CSS表和定位属性的替代居中解决方案,请参见以下答案:https : //stackoverflow.com/a/31977476/3597276