CSS 弹性盒模型
弹性盒模型(Flexbox)是CSS3中引入的一种一维布局模型,用于在容器内灵活地分配空间和对齐元素。Flexbox使得创建响应式布局变得更加容易。
基本概念
1. Flex容器(Flex Container)
通过设置display: flex或display: inline-flex将元素转换为Flex容器:
.container {
display: flex; /* 块级Flex容器 */
/* 或 */
display: inline-flex; /* 行内Flex容器 */
}
2. Flex项目(Flex Items)
Flex容器内的直接子元素称为Flex项目:
<div class="container">
<div class="item">项目1</div> <!-- Flex项目 -->
<div class="item">项目2</div> <!-- Flex项目 -->
<div class="item">项目3</div> <!-- Flex项目 -->
</div>
容器属性
1. flex-direction
flex-direction属性定义了Flex容器的主轴方向:
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
row(默认):主轴为水平方向,项目从左到右排列row-reverse:主轴为水平方向,项目从右到左排列column:主轴为垂直方向,项目从上到下排列column-reverse:主轴为垂直方向,项目从下到上排列
2. flex-wrap
flex-wrap属性定义了项目是否换行:
.container {
flex-wrap: nowrap | wrap | wrap-reverse;
}
nowrap(默认):不换行,项目可能会溢出容器wrap:换行,项目从上到下排列wrap-reverse:换行,项目从下到上排列
3. flex-flow
flex-flow是flex-direction和flex-wrap的简写:
.container {
flex-flow: <flex-direction> <flex-wrap>;
}
例如:
.container {
flex-flow: row wrap;
}
4. justify-content
justify-content属性定义了项目在主轴上的对齐方式:
.container {
justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly;
}
flex-start(默认):项目从主轴起点对齐flex-end:项目从主轴终点对齐center:项目在主轴上居中对齐space-between:项目之间的间距相等,两端对齐space-around:每个项目两侧的间距相等,项目之间的间距是项目与容器边缘间距的两倍space-evenly:项目之间的间距和项目与容器边缘的间距都相等
5. align-items
align-items属性定义了项目在交叉轴上的对齐方式:
.container {
align-items: stretch | flex-start | flex-end | center | baseline;
}
stretch(默认):项目拉伸以填充容器的交叉轴方向flex-start:项目从交叉轴起点对齐flex-end:项目从交叉轴终点对齐center:项目在交叉轴上居中对齐baseline:项目以基线对齐
6. align-content
align-content属性定义了多行项目在交叉轴上的对齐方式(仅当项目换行时有效):
.container {
align-content: stretch | flex-start | flex-end | center | space-between | space-around;
}
stretch(默认):多行拉伸以填充容器的交叉轴方向flex-start:多行从交叉轴起点对齐flex-end:多行从交叉轴终点对齐center:多行在交叉轴上居中对齐space-between:多行之间的间距相等,两端对齐space-around:每行两侧的间距相等,行之间的间距是行与容器边缘间距的两倍
项目属性
1. order
order属性定义了项目的排列顺序,数值越小,排列越靠前:
.item {
order: <整数>; /* 默认值为0 */
}
2. flex-grow
flex-grow属性定义了项目的放大比例,默认值为0,即不放大:
.item {
flex-grow: <数值>; /* 默认值为0 */
}
如果所有项目的flex-grow值都为1,则它们将等分剩余空间。如果一个项目的flex-grow值为2,其他项目为1,则该项目占据的剩余空间是其他项目的两倍。
3. flex-shrink
flex-shrink属性定义了项目的缩小比例,默认值为1,即当空间不足时,项目会缩小:
.item {
flex-shrink: <数值>; /* 默认值为1 */
}
如果所有项目的flex-shrink值都为1,当空间不足时,它们将等比例缩小。如果一个项目的flex-shrink值为0,其他项目为1,则当空间不足时,该项目不会缩小。
4. flex-basis
flex-basis属性定义了项目在主轴上的初始大小:
.item {
flex-basis: <长度> | auto; /* 默认值为auto */
}
<长度>:可以是px、em、%等auto(默认):项目的大小由其内容决定
5. flex
flex是flex-grow、flex-shrink和flex-basis的简写:
.item {
flex: <flex-grow> <flex-shrink> <flex-basis>;
}
常用的简写方式:
flex: 1:等同于flex: 1 1 0%flex: auto:等同于flex: 1 1 autoflex: none:等同于flex: 0 0 auto
6. align-self
align-self属性定义了单个项目在交叉轴上的对齐方式,覆盖容器的align-items属性:
.item {
align-self: auto | stretch | flex-start | flex-end | center | baseline;
}
auto(默认):继承容器的align-items属性- 其他值与
align-items属性相同
应用场景
1. 水平居中
<div class="container" style="display: flex; justify-content: center;">
<div class="item">居中内容</div>
</div>
2. 垂直居中
<div class="container" style="display: flex; align-items: center; height: 300px;">
<div class="item">垂直居中内容</div>
</div>
3. 水平垂直居中
<div class="container" style="display: flex; justify-content: center; align-items: center; height: 300px;">
<div class="item">水平垂直居中内容</div>
</div>
4. 两列布局
<div class="container" style="display: flex;">
<div class="sidebar" style="width: 250px;">侧边栏</div>
<div class="main" style="flex: 1;">主要内容</div>
</div>
5. 三列布局(中间自适应)
<div class="container" style="display: flex;">
<div class="left" style="width: 200px;">左侧栏</div>
<div class="center" style="flex: 1;">中间内容</div>
<div class="right" style="width: 200px;">右侧栏</div>
</div>
6. 导航栏
<nav style="display: flex; justify-content: space-between; background-color: #333; color: white;">
<div class="logo">Logo</div>
<ul style="display: flex; list-style: none;">
<li style="margin-right: 20px;"><a href="#">首页</a></li>
<li style="margin-right: 20px;"><a href="#">关于我们</a></li>
<li style="margin-right: 20px;"><a href="#">产品</a></li>
<li><a href="#">联系我们</a></li>
</ul>
</nav>
7. 卡片布局
<div class="card-container" style="display: flex; flex-wrap: wrap; justify-content: space-between;">
<div class="card" style="width: 30%; margin-bottom: 20px;">卡片1</div>
<div class="card" style="width: 30%; margin-bottom: 20px;">卡片2</div>
<div class="card" style="width: 30%; margin-bottom: 20px;">卡片3</div>
<div class="card" style="width: 30%; margin-bottom: 20px;">卡片4</div>
<div class="card" style="width: 30%; margin-bottom: 20px;">卡片5</div>
<div class="card" style="width: 30%; margin-bottom: 20px;">卡片6</div>
</div>
注意事项
-
一维布局:Flexbox是一维布局模型,主要用于处理行或列的布局,不适用于复杂的二维布局(可以考虑使用Grid)。
-
浏览器兼容性:Flexbox在现代浏览器中支持良好,但在一些旧版本浏览器中支持有限,需要考虑降级方案。
-
性能影响:Flexbox布局通常比传统布局技术(如浮动和定位)性能更好,但过多的嵌套Flex容器可能会影响性能。
-
方向切换:通过
flex-direction可以轻松切换布局方向,这对于响应式设计非常有用。 -
空间分配:Flexbox自动处理空间分配,不需要手动计算百分比,减少了布局错误。
浏览器兼容性
| 浏览器 | 版本 | 支持情况 |
|---|---|---|
| Chrome | 29+ | 完全支持 |
| Firefox | 28+ | 完全支持 |
| Safari | 9+ | 完全支持 |
| Edge | 12+ | 完全支持 |
| IE | 11 | 部分支持(需要前缀) |
总结
Flexbox是一种强大的一维布局模型,它使得创建灵活的响应式布局变得更加容易。通过容器属性和项目属性的组合,可以实现各种复杂的布局效果。Flexbox特别适用于导航栏、卡片布局、居中对齐等常见的UI模式。在现代Web开发中,Flexbox已经成为布局的首选技术之一。