css 之 Flexbox 的一生

Flexbox(弹性盒子布局)

是CSS3提供的一种一维布局模型,用于在单行或单列中排列项目,适合处理未知或动态尺寸的项目。

核心术语

Flex容器 :设置了display:flex;或display:inline-flex 的元素。 Flex项目 :Flex容器的直接子元素。 主轴 :项目排列的主要方向(由flex-direction决定) 交叉轴:与主轴垂直的方向

注意:主轴和交叉轴的方向会随着flex-direction的改变而变化。

容器属性

基础属性

css3 复制代码
.container {
    display:flex; /* 或者是inline-flex */
}

主轴方向控制(flex-direction)

css3 复制代码
.container {
    flex-direction: row; /* 默认值,水平排列(左→右)*/
    flex-direction: row-reverse; /* 水平方向(右→左)*/
    flex-direction: column; /* 垂直排列(上→下)*/
    flex-direction: column-reverse; /* 垂直排列(下→上)*/
}

换行控制(flex-wrap)

css3 复制代码
.container {
    flex-wrap: nowrap; /* 默认值,不换行 */
    flex-wrap: wrap; /* 正常换行 */
    flex-wrap: wrap-reverse; /* 反向换行 */
}

简单属性(flex-flow)

css3 复制代码
.container {
    flex-flow: row wrap; /* flex-direction 和 flex-wrap 的简写 */
}

主轴对齐(justify-content)

css3 复制代码
.container {
    justify-content: flex-start; /* 默认值,起始对齐 */
    justify-content: flex-end; /* 末尾对齐 */
    justify-content: center; /* 居中对齐 */
    justify-content: space-between; /* 两端对齐, 项目间 间隔相等 */
    justify-content: space-around; /* 每个项目两侧间隔相等 */
    justify-content: space-evenly; /* 所有间隔完全相等 */
}

交叉轴对齐(align-items)

css3 复制代码
.container {
    align-items: stretch; /* 默认值,拉伸填满容器高度 */
    align-items: flex-start; /* 起始对齐 */
    align-items: flex-end; /* 末尾对齐 */
    align=items: center; /* 居中对齐 */
    align-items: baseline; /* 基线对齐 */
}

多行对齐(align-content)

css3 复制代码
.container {
    align-content: stretch; /* 默认值,拉伸填满 */
    align-content: flex-start; /* 起始对齐 */
    align-content: flex-end; /* 末尾对齐 */
    align-content: center; /* 居中对齐 */
    align-content: space-between; /* 两端对齐 */
    align-content: space-around; /* 均匀分布 */
}

项目属性

排序控制(order)

css3 复制代码
.item {
    order: 0; /* 默认值,数值越大排列越后 */
}

伸缩比例(flex-grow)

css3 复制代码
.item {
    flex-grow: 0; /* 默认值,不放大 */
    flex-grow: 1; /* 按比例分配剩余空间 */
}

收缩比例(flex-shrink)

css3 复制代码
.item {
    flex-shrink: 1; /* 默认值,空间不足时缩小 */
    flex-shrink:0; /* 禁止缩小 */
}

初始尺寸(flex-basis)

css3 复制代码
.item {
    flex-basis: auto; /*默认值,基于内容或width */
    flex-basis: 200px; /* 固定尺寸 */
    flex-basis: 30%; /* 百分比尺寸 */
}

简单属性(flex)

css3 复制代码
.item {
    flex: none; /* 0 0 auto */
    flex: auto; /* 1 1 auto */
    flex: 1; /* 1 1 0% */
    flex: 0 0 20px; /* flex-grow flex-shrink flex-basis */
    flex: 2 1 30%; /* 组合使用 */
}

单独对齐(align-self)

css3 复制代码
.item {
    align-self: auto; /* 默认值, 继承父级*/
    align-self: flex-start; /* 起始对齐 */
    align-self: flex-end; /* 末尾对齐 */
    align-self: center; /* 居中对齐 */
    align-self: baseline; /* 基线对齐 */
    align-self: stretch; /* 拉伸填满 */
}

常见问题及解决方案

1、项目宽度超出容器

css3 复制代码
.container {
    min-width: 0; /* 修复min-width默认值问题 */
}

.item {
    overflow: hidden; /* 防止内容溢出 */
}

2、项目高度不一样

css3 复制代码
.container {
    align-items: stretch; /* 默认值即可 */
}

3、空白间距问题

css3 复制代码
.container {
    font-size: 0; /* 消除inline-block间隙 */
}

.container> * {
    font-size: 16px; /* 恢复字体大小 */
}

4、移动端距离适配

css3 复制代码
@media(max-width:768px) {
    .container {
        flex-direction: column;
    }
    
    .item {
        flex: 1 1 auto;
    }
}

实践经验

优先使用简写属性:flex 比 flex-grow\flex-shrink\flex-basis 更高效;

合理设置flex-basis:明确初始尺寸有助于布局稳定;

浏览器兼容性:旧版浏览器可能需要前缀;

结合其他布局方案,比如 结合grid使用;

性能优化:避免过度嵌套flex容器。

相关推荐
lichenyang45324 分钟前
React ajax中的跨域以及代理服务器
前端·react.js·ajax
呆呆的小草26 分钟前
Cesium距离测量、角度测量、面积测量
开发语言·前端·javascript
一 乐1 小时前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
testleaf2 小时前
前端面经整理【1】
前端·面试
好了来看下一题2 小时前
使用 React+Vite+Electron 搭建桌面应用
前端·react.js·electron
啃火龙果的兔子2 小时前
前端八股文-react篇
前端·react.js·前端框架
小前端大牛马2 小时前
react中hook和高阶组件的选型
前端·javascript·vue.js
刺客-Andy2 小时前
React第六十二节 Router中 createStaticRouter 的使用详解
前端·javascript·react.js
萌萌哒草头将军4 小时前
🚀🚀🚀VSCode 发布 1.101 版本,Copilot 更全能!
前端·vue.js·react.js
GIS之路4 小时前
OpenLayers 图层叠加控制
前端·信息可视化