Skip to content

Flexbox 布局

Flexbox 简介

Flexbox(弹性盒子)是一种一维布局模型,可以轻松实现水平或垂直方向的布局。

基本概念

Flex 容器

css
.container {
  display: flex;
}

Flex 项目

Flex容器的直接子元素自动成为Flex项目。

html
<div class="container">
  <div class="item">项目1</div>
  <div class="item">项目2</div>
  <div class="item">项目3</div>
</div>

容器属性

1. flex-direction(主轴方向)

css
.container {
  flex-direction: row;           /* 水平方向,从左到右 */
  flex-direction: row-reverse;   /* 水平方向,从右到左 */
  flex-direction: column;        /* 垂直方向,从上到下 */
  flex-direction: column-reverse; /* 垂直方向,从下到上 */
}

2. flex-wrap(换行)

css
.container {
  flex-wrap: nowrap;      /* 不换行(默认) */
  flex-wrap: wrap;        /* 换行 */
  flex-wrap: wrap-reverse; /* 反向换行 */
}

3. flex-flow(方向和换行)

css
.container {
  flex-flow: row wrap;
  flex-flow: column nowrap;
}

4. justify-content(主轴对齐)

css
.container {
  justify-content: flex-start;    /* 起点对齐 */
  justify-content: flex-end;      /* 终点对齐 */
  justify-content: center;        /* 居中对齐 */
  justify-content: space-between; /* 两端对齐 */
  justify-content: space-around;  /* 环绕对齐 */
  justify-content: space-evenly;  /* 均匀对齐 */
}

5. align-items(交叉轴对齐)

css
.container {
  align-items: stretch;    /* 拉伸(默认) */
  align-items: flex-start; /* 起点对齐 */
  align-items: flex-end;   /* 终点对齐 */
  align-items: center;    /* 居中对齐 */
  align-items: baseline;  /* 基线对齐 */
}

6. align-content(多行交叉轴对齐)

css
.container {
  align-content: stretch;    /* 拉伸(默认) */
  align-content: flex-start; /* 起点对齐 */
  align-content: flex-end;   /* 终点对齐 */
  align-content: center;    /* 居中对齐 */
  align-content: space-between; /* 两端对齐 */
  align-content: space-around;  /* 环绕对齐 */
  align-content: space-evenly;  /* 均匀对齐 */
}

项目属性

1. order(顺序)

css
.item {
  order: 0;    /* 默认值 */
  order: -1;   /* 排在前面 */
  order: 1;    /* 排在后面 */
}

2. flex-grow(放大比例)

css
.item {
  flex-grow: 0; /* 不放大(默认) */
  flex-grow: 1; /* 放大 */
  flex-grow: 2; /* 放大2倍 */
}

3. flex-shrink(缩小比例)

css
.item {
  flex-shrink: 1; /* 缩小(默认) */
  flex-shrink: 0; /* 不缩小 */
}

4. flex-basis(基准大小)

css
.item {
  flex-basis: auto;  /* 自动(默认) */
  flex-basis: 200px; /* 固定宽度 */
  flex-basis: 50%;   /* 百分比 */
}

5. flex(简写)

css
.item {
  flex: 0 1 auto;    /* 默认值 */
  flex: 1 1 auto;    /* 放大 */
  flex: 0 0 auto;    /* 固定 */
  flex: 1;           /* flex: 1 1 0% */
  flex: auto;        /* flex: 1 1 auto */
  flex: none;        /* flex: 0 0 auto */
}

6. align-self(单独对齐)

css
.item {
  align-self: auto;     /* 继承父元素(默认) */
  align-self: stretch;  /* 拉伸 */
  align-self: flex-start; /* 起点对齐 */
  align-self: flex-end;   /* 终点对齐 */
  align-self: center;     /* 居中对齐 */
  align-self: baseline;   /* 基线对齐 */
}

常用布局

1. 水平居中

css
.container {
  display: flex;
  justify-content: center;
}

2. 垂直居中

css
.container {
  display: flex;
  align-items: center;
}

3. 水平垂直居中

css
.container {
  display: flex;
  justify-content: center;
  align-items: center;
}

4. 两端对齐

css
.container {
  display: flex;
  justify-content: space-between;
}

5. 等分布局

css
.container {
  display: flex;
}

.item {
  flex: 1;
}

6. 固定+自适应

css
.container {
  display: flex;
}

.sidebar {
  width: 200px;
}

.main {
  flex: 1;
}

7. 多列布局

css
.container {
  display: flex;
  flex-wrap: wrap;
}

.item {
  flex: 0 0 33.33%;
  box-sizing: border-box;
}

8. 垂直布局

css
.container {
  display: flex;
  flex-direction: column;
}

9. 圣杯布局

css
.container {
  display: flex;
  min-height: 100vh;
  flex-direction: column;
}

.header {
  height: 60px;
}

.main {
  flex: 1;
  display: flex;
}

.sidebar {
  width: 200px;
}

.content {
  flex: 1;
}

.footer {
  height: 60px;
}

实际应用

1. 导航栏

css
.nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 20px;
  height: 60px;
  background-color: #333;
  color: white;
}

.logo {
  font-size: 24px;
  font-weight: bold;
}

.menu {
  display: flex;
  gap: 20px;
}

.menu a {
  color: white;
  text-decoration: none;
}

2. 卡片布局

css
.card-container {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
}

.card {
  flex: 0 0 calc(33.33% - 20px);
  background-color: white;
  border-radius: 8px;
  box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  overflow: hidden;
}

.card img {
  width: 100%;
  height: 200px;
  object-fit: cover;
}

.card-content {
  padding: 20px;
}

3. 表单布局

css
.form-group {
  display: flex;
  flex-direction: column;
  margin-bottom: 20px;
}

.form-group label {
  margin-bottom: 5px;
  font-weight: bold;
}

.form-group input {
  padding: 10px;
  border: 1px solid #ccc;
  border-radius: 4px;
}

.form-row {
  display: flex;
  gap: 20px;
}

.form-row .form-group {
  flex: 1;
}

4. 响应式布局

css
.container {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
}

.item {
  flex: 0 0 100%;
}

@media (min-width: 768px) {
  .item {
    flex: 0 0 50%;
  }
}

@media (min-width: 1024px) {
  .item {
    flex: 0 0 33.33%;
  }
}

面试常见问题

1. Flexbox 的优势是什么?

  • 简化布局代码
  • 容易实现居中对齐
  • 支持响应式布局
  • 容易实现等高列
  • 支持反向排列

2. justify-content 和 align-items 的区别?

  • justify-content: 控制主轴方向的对齐方式
  • align-items: 控制交叉轴方向的对齐方式
css
.container {
  display: flex;
  justify-content: center;  /* 主轴居中 */
  align-items: center;     /* 交叉轴居中 */
}

3. flex: 1 的含义是什么?

flex: 1flex: 1 1 0% 的简写,表示:

  • flex-grow: 1(可以放大)
  • flex-shrink: 1(可以缩小)
  • flex-basis: 0%(基准大小为0)
css
.item {
  flex: 1;
}

4. 如何实现水平垂直居中?

css
.container {
  display: flex;
  justify-content: center;
  align-items: center;
}

5. flex-wrap 的作用是什么?

flex-wrap控制Flex项目是否换行。

css
.container {
  flex-wrap: nowrap;      /* 不换行 */
  flex-wrap: wrap;        /* 换行 */
  flex-wrap: wrap-reverse; /* 反向换行 */
}

通过理解Flexbox的各种属性和应用,可以轻松实现各种复杂的布局效果。

好好学习,天天向上