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容器。

相关推荐
我爱加班、、2 分钟前
Websocket能携带token过去后端吗
前端·后端·websocket
AAA阿giao2 分钟前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架
杨超越luckly8 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
hedley(●'◡'●)38 分钟前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_81151751540 分钟前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育41 分钟前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
百锦再41 分钟前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
CappuccinoRose1 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
这儿有一堆花1 小时前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集