Flexbox 弹性布局详解
中等 🟡CSS 布局
3 个标签
预计阅读时间:6 分钟
CSSFlexbox弹性布局
Flexbox 弹性布局详解
Flexbox(弹性盒子布局)是 CSS3 引入的一维布局模型,专门用于处理元素在容器中的排列、对齐和分布。
Flexbox 基础概念
Flex 容器和项目:
•display: flex 创建 Flex 容器
•容器的直接子元素成为 Flex 项目
•主轴(main axis)和交叉轴(cross axis)
主轴方向:
•flex-direction: row(默认值,水平从左到右)
•flex-direction: row-reverse(水平从右到左)
•flex-direction: column(垂直从上到下)
•flex-direction: column-reverse(垂直从下到上)
换行控制:
•flex-wrap: nowrap(默认值,不换行)
•flex-wrap: wrap(允许换行)
•flex-wrap: wrap-reverse(反向换行)
主轴对齐
justify-content 属性:
•flex-start:项目向主轴起点对齐
•flex-end:项目向主轴终点对齐
•center:项目在主轴上居中
•space-between:项目均匀分布,首尾贴边
•space-around:项目均匀分布,周围有空间
•space-evenly:项目均匀分布,间距相等
交叉轴对齐
align-items 属性(单行):
•stretch(默认值):项目拉伸填充容器
•flex-start:项目向交叉轴起点对齐
•flex-end:项目向交叉轴终点对齐
•center:项目在交叉轴上居中
•baseline:项目基线对齐
align-content 属性(多行):
•stretch(默认值):行拉伸填充容器
•flex-start:行向交叉轴起点对齐
•flex-end:行向交叉轴终点对齐
•center:行在交叉轴上居中
•space-between:行均匀分布
•space-around:行均匀分布,周围有空间
Flex 项目属性
flex-grow:
•定义项目的放大比例
•默认值为 0,不放大
•值为 1 时,项目占据剩余空间
flex-shrink:
•定义项目的缩小比例
•默认值为 1,空间不足时缩小
•值为 0 时,项目不缩小
flex-basis:
•定义项目在分配多余空间之前的初始大小
•可以是长度值或 auto
•优先级高于 width/height
flex 简写:
•flex: flex-grow flex-shrink flex-basis
•flex: 1 表示 flex: 1 1 0%
•flex: auto 表示 flex: 1 1 auto
代码示例
水平垂直居中
cssCode
/* 方法1:最常用的居中方式 */
.center-container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
/* 方法2:使用 margin: auto */
.center-container {
display: flex;
height: 100vh;
}
.center-item {
margin: auto;
}
/* 方法3:使用 place-items(简写) */
.center-container {
display: flex;
place-items: center;
height: 100vh;
}三栏布局(两边固定,中间自适应)
cssCode
.container {
display: flex;
height: 100vh;
}
.sidebar-left {
width: 200px;
flex-shrink: 0; /* 防止缩小 */
background-color: #f5f5f5;
}
.main-content {
flex: 1; /* flex-grow: 1, flex-shrink: 1, flex-basis: 0% */
background-color: #fff;
}
.sidebar-right {
width: 250px;
flex-shrink: 0; /* 防止缩小 */
background-color: #f5f5f5;
}
/* 响应式:小屏幕时改为单列 */
@media (max-width: 768px) {
.container {
flex-direction: column;
}
.sidebar-left,
.sidebar-right {
width: 100%;
}
}等高布局
cssCode
.card-container {
display: flex;
gap: 20px;
}
.card {
flex: 1;
/* align-items: stretch 是默认值,所以卡片会自动等高 */
padding: 20px;
border: 1px solid #ddd;
}
/* 即使卡片内容高度不同,所有卡片也会等高 */最佳实践
•优先使用 Flexbox 进行一维布局
•合理使用 flex 简写属性
•注意浏览器兼容性(IE10+)
•结合媒体查询实现响应式布局
•避免过度嵌套 Flex 容器
•使用 flex: 1 实现自适应布局
•使用 gap 属性设置间距(现代浏览器)