当前位置: 首页 > news >正文

深入掌握CSS Flex布局:从原理到实战

一、Flex布局革命性突破

1.1 Flex布局诞生背景

2009年W3C提出的Flexible Box Layout模块标志着网页布局进入新时代。传统布局方式面临的三大痛点:

  1. 垂直居中实现困难
  2. 等高列布局复杂度高
  3. 响应式适配维护成本大

1.2 核心优势对比

特性浮动布局Flex布局
布局方向单一水平流向任意方向自由控制
空间分配手动计算自动分配
对齐控制有限支持全方位精确控制
响应式适应依赖媒体查询内置弹性适应机制

1.3、flex弹性盒子模型布局定义

Flex(弹性盒子)是 CSS3 中的一种布局模式,旨在提供一种更有效的方式来对容器中的子元素进行排列、对齐和分配空间。它特别适用于响应式设计,可以轻松实现动态调整的布局。

二、flex布局的模式设定

属性名作用对象常用值及解释用途
display容器flex:将容器设为弹性布局模式定义弹性容器,使子元素成为弹性项目
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>47-flex布局-体验</title><style>/* flex布局不会脱标 */.box{display: flex;/* height: 300px; */border: 1px solid rgb(0, 0, 0);}.box div{width: 200px;height: 100px;background-color: #26a848;border: red 1px solid;}</style>
</head>
<body><div class="box"><div>1</div><div>2</div><div>3</div></div>
</body>
</html>

通过运行结果我们可以发现div标签原本是块级元素,会自动换行,但是由于我们给父容器设置了disply:flex属性,我们的子div盒子并没有换行,而是在一行排列。而且虽然我们没有给我们的父容器设置高度,但是父容器的高度也由子盒子的高度默认撑开了,说明flex布局不会使盒子脱标

三、flex布局的常用父属性

属性名作用对象常用值及解释用途
display父容器flex:将容器设为弹性布局模式定义弹性容器,使子元素成为弹性项目
flex-direction父容器

row(默认,主轴水平向右)

row-reverse(主轴水平向左)

column(主轴垂直向下)

column-reverse(主轴垂直向上)

定义主轴方向,决定子元素排列顺序
justify-content父容器

flex-start(左对齐)

flex-end(右对齐)

center(居中)

space-between(两端对齐,项目间隔相等)

space-around(项目两侧间隔相等)

space-evenly(项目之间的间隔相等 )

控制主轴方向上的对齐方式
align-items父容器

stretch(默认,拉伸填满容器)

flex-start(顶部对齐)

flex-end(底部对齐)

center(垂直居中)

baseline(基线对齐)

控制交叉轴方向上的对齐方式
flex-wrap父容器

nowrap(默认,不换行)

wrap(换行,第一行在上方)

控制子元素是否换行
align-content父容器

stretch(默认,拉伸占满容器)

flex-start(顶部对齐)

flex-end(底部对齐)

center(垂直居中)

space-between(行间距平均分布)

space-around;(项目两侧间隔相等)

space-evenly(项目之间的间隔相等 )

多行子元素在交叉轴的对齐方式(需配合 flex-wrap: wrap 使用)

3.1 flex-direction:定义主轴方向,决定子元素排列顺序

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>50-flex布局(主轴与侧轴对齐方式)</title><style>.container{margin: 0 auto;border: 1px solid rgb(0, 0, 0);width: 1000px;height: 1000px;display: flex;/* 主轴方向为水平方向:顺序排列 *//* flex-direction: row; *//* 主轴方向为水平方向:逆序排列 *//* flex-direction: row-reverse; *//* 主轴方向为垂直方向:顺序排列 *//* flex-direction: column; *//* 主轴方向为垂直方向:逆序排列 */flex-direction: column-reverse;}.container div{width: 200px;height: 200px;background-color: skyblue;}</style>
</head>
<body><div class="container"><div>1</div><div>2</div><div>3</div></div>
</body>
</html>

 效果展示:

1、flex-direction: row;

2、flex-direction: row-reverse;

3、flex-direction: column;

4、flex-direction: column-reverse;

3.2 justify-content:控制主轴方向上的对齐方式

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>flex主轴对齐方式</title><style>.container{margin: 0 auto;border: 1px solid rgb(0, 0, 0);width: 1000px;height: 1000px;display: flex;/* flex-start(左对齐) *//* justify-content: start; *//* flex-end(右对齐) *//* justify-content: end;    *//* center(居中) *//* justify-content: center;  *//* space-between(两端对齐,项目间隔相等) *//* justify-content: space-between; *//* space-around(项目两侧间隔相等) *//* justify-content: space-around; *//* space-evenly(项目之间间隔相等) *//* justify-content: space-evenly; */}.container div{width: 200px;height: 200px;background-color: skyblue;}</style>
</head>
<body><div class="container"><div>1</div><div>2</div><div>3</div></div>
</body>
</html>

1、justify-content: start; 

2、justify-content: end;    

 3、justify-content: center;  

4、justify-content: space-between; 

 5、justify-content: space-around; 

6、justify-content: space-evenly; 

3.3 align-items:控制交叉轴方向上的对齐方式

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>交叉轴的对齐方式</title><style>.container{margin: 0 auto;border: 1px solid rgb(0, 0, 0);width: 1000px;height: 1000px;display: flex;/* stretch(默认,拉伸填满容器,没设置高度的时候生效) */align-items: stretch;/* flex-start(顶部对齐) *//* align-items: flex-start; *//* flex-end(底部对齐) *//* align-items: flex-end; *//* center(垂直居中) *//* align-items: center; *//* baseline(基线对齐) *//* align-items: baseline; */}.container div{width: 200px;/* height: 200px; */background-color: skyblue;}</style>
</head>
<body><div class="container"><div>1</div><div>2</div><div>3</div></div>
</body>
</html>

1、align-items: stretch;

2、 align-items start;

3、align-items: end;

4、align-items: center;

5、align-items: baseline;

3.4 flex-wrap:控制子元素是否换行

1、flex-wrap:换行

3.5 align-content:多行子元素在交叉轴的对齐方式

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>多行子元素交叉轴对齐方式</title><style>.container{margin: 0 auto;border: 1px solid rgb(0, 0, 0);width: 1000px;height: 1000px;display: flex;/* wrap:换行 */flex-wrap: wrap;justify-content: space-between;/* flex-start(顶部对齐) */align-content: flex-start;/* flex-end(底部对齐) *//* align-content: flex-end;   *//* center(垂直居中) *//* align-content: center; *//* space-between(行间距平均分布) *//* align-content: space-between; *//* space-around;(项目两侧间隔相等) *//* align-content: space-around; *//* space-evenly(项目之间的间隔相等 ) *//* align-content: space-evenly; */}.container div{width: 300px;height: 300px;background-color: skyblue;}</style>
</head>
<body><div class="container"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div></div>
</body>
</html>

1、align-content: flex-start; 

2、align-content: flex-end;   

3、align-content: center; 

4、align-content: space-between; 

 5、align-content: space-around; 

6、align-content: space-evenly; 

四、flex布局常用的子属性

属性名作用对象常用值及解释用途
align-self子元素auto(继承容器的align-items)<br>flex-start/flex-end/center/baseline/stretch(单独覆盖容器设置)单独控制某个子元素在交叉轴的对齐方式
flex子元素1(等分容器剩余空间)<br>0 0 auto(固定尺寸)<br>2 1 20px(简写形式,定义 grow/shrink/basis控制子元素在主轴方向的伸缩比例(简写属性,包含 flex-growflex-shrinkflex-basis

4.1  align-self:单独控制某个子元素在交叉轴的对齐方式

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>50-flex布局(主轴与侧轴对齐方式)</title><style>.container{border: 1px solid rgb(0, 0, 0);width: 1000px;height: 400px;display: flex;justify-content: space-evenly;}.container div:nth-child(2){/* align-self设置单个弹性盒子,结合结构伪类使用 */align-self: center;}.container div{width: 200px;height: 200px;background-color: skyblue;}</style>
</head>
<body><div class="container"><div>1</div><div>2</div><div>3</div></div>
</body>
</html>

4.2 flex:控制子元素在主轴方向的伸缩比例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>/* 在默认情况下,主轴的尺寸通过内容撑开,侧轴的尺寸撑满容器 */.container{border: 1px solid rgb(0, 0, 0);width: 1000px;height: 400px;display: flex;flex-direction: column;}.container div{height: 200px;background-color: pink;}.container div:nth-child(1){width: 200px;}.container div:nth-child(2){flex:1;}.container div:nth-child(3){flex:2;}</style>
</head>
<body><div class="container"><div>1</div><div>2</div><div>3</div></div>
</body>
</html>

五、综合案例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>flex综合案例</title><style>
/* 
CSS 书写顺序:
1). 盒子模型属性
2). 文字样式 
3). 圆角、阴影等修饰属性
*/*{margin: 0;padding: 0;/* 内减模式 */box-sizing: border-box;}/* 去掉列表的项目符号 */li{list-style: none;}.box{width: 1200px;height: 418px;border: 1px solid #aeadad;margin: 0 auto;border-radius: 8px;}.box ul{display: flex;/* 盒子换行 */flex-wrap: wrap;height: 418px;padding: 90px 40px 90px 60px;/* 调整主轴对齐方式 */justify-content: space-between;/* 调整行对齐方式 */align-content: space-between;}.box li{display: flex;height: 88px;width: 500px;}div img{margin-right: 15px;height: 88px;}.box .text h4{line-height: 40px;font-size: 20px;font-weight: 400;color: #333;}.box .text p{font-size: 14px;color:#666;}</style>
</head>
<body><div class="box"><ul><li><div class="pic"><img src="./bijiimges/1.svg" alt=""></div><div class="text"><h4>一键发布到多端</h4><p>发布视频到抖音短视频、西瓜视频及今日头条</p></div>  </li><li><div class="pic"><img src="./bijiimges/2.svg" alt=""></div><div class="text"><h4>管理视频内容</h4><p>支持修改已发布稿件状态和实时查询视频审核状态</p></div>  </li><li><div class="pic"><img src="./bijiimges/3.svg" alt=""></div><div class="text"><h4>发布携带组件</h4><p>支持分享内容携带小程序、地理位置信息等组件,扩展内容及突出地域性</p></div>  </li><li><div class="pic"><img src="./bijiimges/4.svg" alt=""></div><div class="text"><h4>数据评估分析</h4><p>获取视频在对应产品内的数据表现、获取抖音热点,及时进行表现评估</p></div>  </li></ul></div>
</body>
</html>

六、总结

属性名作用对象常用值及解释用途
display父容器flex:将容器设为弹性布局模式定义弹性容器,使子元素成为弹性项目
flex-direction父容器

row(默认,主轴水平向右)

row-reverse(主轴水平向左)

column(主轴垂直向下)

column-reverse(主轴垂直向上)

定义主轴方向,决定子元素排列顺序
justify-content父容器

flex-start(左对齐)

flex-end(右对齐)

center(居中)

space-between(两端对齐,项目间隔相等)

space-around(项目两侧间隔相等)

space-evenly(项目之间的间隔相等 )

控制主轴方向上的对齐方式
align-items父容器

stretch(默认,拉伸填满容器)

flex-start(顶部对齐)

flex-end(底部对齐)

center(垂直居中)

baseline(基线对齐)

控制交叉轴方向上的对齐方式
flex-wrap父容器

nowrap(默认,不换行)

wrap(换行,第一行在上方)

控制子元素是否换行
align-content父容器

stretch(默认,拉伸占满容器)

flex-start(顶部对齐)

flex-end(底部对齐)

center(垂直居中)

space-between(行间距平均分布)

space-around;(项目两侧间隔相等)

space-evenly(项目之间的间隔相等 )

多行子元素在交叉轴的对齐方式(需配合 flex-wrap: wrap 使用)
align-self子元素auto(继承容器的align-items)<br>flex-start/flex-end/center/baseline/stretch(单独覆盖容器设置)单独控制某个子元素在交叉轴的对齐方式
flex子元素1(等分容器剩余空间)<br>0 0 auto(固定尺寸)<br>2 1 20px(简写形式,定义 grow/shrink/basis控制子元素在主轴方向的伸缩比例(简写属性,包含 flex-growflex-shrinkflex-basis

http://www.xdnf.cn/news/410995.html

相关文章:

  • 数组作为指针计算大小时的误区
  • Android13 wifi设置关闭后断电重启会自动打开
  • JGEW-9液位流量压力温度实验装置
  • Genspark超级智能体调研
  • 从数据到洞察:解析结构化数据处理的智能跃迁
  • 苹果电脑笔记本macos Mac安装mixly 米思齐软件详细指南
  • 免费多线程下载工具
  • 电商物流的“速度与激情”:从城际运输到即时配送的全链路解析
  • 动态网站 LNMP
  • 每日Prompt:超现实交互场景
  • 全视通智慧病房无感巡视解决方案:科技赋能,重塑护理巡视新篇
  • 开关电源滤波器讲解
  • Cursor 配置 Browser MCP(基于浏览器底层协议控制)及浏览器插件安装
  • Blender 入门教程(一):模型创建
  • rust 全栈应用框架dioxus server
  • 大模型数据分析破局之路20250512
  • 架构、构架、结构、框架之间有什么区别?|系统设计|系统建模
  • 互联网大厂Java面试实战:Spring Boot到微服务的技术问答解析
  • Datawhale AI春训营 day
  • 基于ESP32的健康智能机器人
  • 23.(vue3.x+vite)引入组件并动态切换(component)
  • 嵌入式Linux I2C驱动开发详解
  • 火山RTC 6 自定义视频
  • BUUCTF——杂项渗透之look
  • 代理IP:电商与营销领域的“隐形加速器”
  • OpenCV实现一个视频播放器
  • 基于FastAPI框架的日志模块设计
  • 2025年网站安全防御全解析:应对DDoS与CC攻击的智能策略
  • 处理 Websocket 超时问题
  • Python 处理图像并生成 JSONL 元数据文件 - 固定text版本