在flex布局中,默认情况下flex容器内的子元素会沿着主轴方向排列,不会自动换行,当子元素总宽度超过容器宽度时会被压缩。flex-wrap属性就是用来改变这种默认行为的,它可以控制子元素在超出容器时是否换行,以及换行的方向。

flex-wrap的基本取值
flex-wrap是flex容器的属性,总共有三个可选值,不同的取值对应不同的换行逻辑:
- nowrap:默认值,不换行,子元素会被压缩以适配容器宽度
- wrap:换行,当子元素超出容器主轴方向宽度时,自动换到下一行,换行方向为主轴的正方向
- wrap-reverse:反向换行,换行方向与wrap相反,超出时换到上一行
基础使用示例
下面通过一个简单的代码示例演示三个取值的实际效果,父容器宽度固定为400px,每个子元素宽度100px,总宽度超过父容器宽度:
/* 基础容器样式 */
.flex-container {
display: flex;
width: 400px;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 20px;
}
.flex-item {
width: 100px;
height: 80px;
background-color: #4CAF50;
color: white;
text-align: center;
line-height: 80px;
margin: 5px;
font-size: 16px;
}
/* 不换行 */
.nowrap {
flex-wrap: nowrap;
}
/* 正常换行 */
.wrap {
flex-wrap: wrap;
}
/* 反向换行 */
.wrap-reverse {
flex-wrap: wrap-reverse;
}
对应的HTML结构如下:
<h3>flex-wrap: nowrap(默认不换行)</h3>
<div class="flex-container nowrap">
<div class="flex-item">1</div>
<div class="flex-item">2</div>
<div class="flex-item">3</div>
<div class="flex-item">4</div>
<div class="flex-item">5</div>
</div>
<h3>flex-wrap: wrap(正常换行)</h3>
<div class="flex-container wrap">
<div class="flex-item">1</div>
<div class="flex-item">2</div>
<div class="flex-item">3</div>
<div class="flex-item">4</div>
<div class="flex-item">5</div>
</div>
<h3>flex-wrap: wrap-reverse(反向换行)</h3>
<div class="flex-container wrap-reverse">
<div class="flex-item">1</div>
<div class="flex-item">2</div>
<div class="flex-item">3</div>
<div class="flex-item">4</div>
<div class="flex-item">5</div>
</div>
换行布局的常见调整技巧
调整行对齐方式
换行后多行的对齐方式可以通过align-content属性调整,它用来设置多行内容在交叉轴上的对齐方式,常见取值有flex-start、flex-end、center、space-between、space-around等,示例如下:
/* 换行后多行居中对齐 */
.wrap-center {
flex-wrap: wrap;
align-content: center;
height: 300px; /* 给容器设置固定高度才能看到交叉轴对齐效果 */
}
控制子元素间距
换行布局中如果需要统一调整子元素之间的间距,除了给子元素加margin,还可以使用gap属性,它会自动在子元素之间生成间距,不会在容器边缘产生多余间距:
/* 子元素之间水平和垂直间距都是10px */
.wrap-gap {
flex-wrap: wrap;
gap: 10px;
}
注意事项
- flex-wrap只对flex容器生效,需要先将容器设置为
display: flex或display: inline-flex - 如果子元素设置了
flex-shrink: 0,那么即使flex-wrap设置为nowrap,子元素也不会被压缩,会直接溢出容器 - flex-wrap是CSS3的属性,在部分非常老旧的浏览器中可能存在兼容性问题,实际开发时如果需要兼容旧浏览器可以添加对应的前缀