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

8.5 CSS3-flex弹性盒子

lex弹性盒子

2009年,W3C提出了一种崭新的方案----Flex布局(即弹性伸缩布局),它可以简便、完整、响应式地实现各种页面布局,包括一直让人很头疼的垂直水平居中也变得很简单地就迎刃而解了。 伸缩布局 = 弹性布局 = flex布局

原理:通过给父盒子添加flex属性,来控制盒子的位置和排列方式

弹性盒子分为两块:box布局(老版本) 和flex布局(新版本) Flexbox模型是2012年9月提出的工作草案,这个草案是由W3C 推出的最新语法。这个版本立志于指定标准,让新式的浏览器全面兼容,在未来浏览器的更新换代中实现统一。

注意,设为 Flex 布局以后,子元素的 float 、clear 和 vertical-align 属性将失效。

容器: 采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器
项目 容器的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目“
![[1111111.PNG]]

容器属性项目属性
flex-direction 主轴方向order
flex-wrap 主轴换行方式flex-grow
flex-flow符合形式flex-shrink
justify-content 主轴对齐方式flex-basis
align-items 交叉轴对齐方式flex
align-content 多根主轴对齐方式align-self
flex基础弹性盒子

语法:display:flex 表示给当前元素添加弹性盒子
案例一:使用flex弹性盒子让那个div里面的内容在一行显示

flex基础弹性盒子

语法:display:flex 表示给当前元素添加弹性盒子
案例一:使用flex弹性盒子让那个div里面的内容在一行显示

<style>.box{width: 100%;display: flex;}.inner{border: 1px solid #f00;background-color: aquamarine;}
</style>
<div class="box"><div class="inner">响应式网站设计是一种网络页面设计布局,其理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境进行相对应的布局。</div><div class="inner">响应式网站设计是一种网络页面设计布局,其理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境进行相对应的布局。</div><div class="inner">响应式网站设计是一种网络页面设计布局,其理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境进行相对应的布局。</div><div class="inner">响应式网站设计是一种网络页面设计布局,其理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境进行相对应的布局。</div>
</div>

display:-webkit-box;和float的区别在于 float浮动之后,高度会随着内容变化,高度不定;并且浮动之后,当盒子缩小时,浮动的内容会自动被挤下来 display:box 不需要设置盒子高度,会自动使多个盒子高度保持一致; 并且弹性盒子设置好之后,屏幕缩小不会让内容自动换行,但是还是没有实 线弹性盒子

flex-direction 决定主轴方向(即项目排列方向)

属性值: row(默认值):主轴为水平方向,起点在左端。 row-reverse:主轴为水平方向,起点在右端。 column:主轴为垂直方向,起点在上沿。 column-reverse:主轴为垂直方向,起点在下沿。

[[1280X1280 (2).PNG]]
案例一:正常布局

 <style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;flex-direction: row-reverse;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;height: 100px;}
</style>
<div class="box"><div class='inner'>1此概念于2010年5月由国外著名网页设计师Ethan Marcotte所提出。</div><div class='inner'>2响应式网站设计(Responsive Web design)的理念是:页面的设计与开发应当根据用户行为以及设备环境(系统平台、屏幕尺寸、屏幕定向等)进行相应的响应和调整</div><div class='inner'>3论用户正在使用笔记本还是iPad,我们的页面都应该能够自动切换分辨率、图片尺寸及相关脚本功能等,以适应不同设备;换句话说,页面应该有能力去自动响应用户的设备环境。响应式网页设计就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本</div>
</div>

![[28d06925-e8e7-40e2-800d-517abb0a76ff.png]]
案例二:row-reverse,起点在右端

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/* 右对齐 */flex-direction: row-reverse;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;height: 200px;width: 300px;}
</style>

![[dd34f01f-d04b-4324-9be8-076717a95b9a.png]]
案例三:column 从上往下按行排放

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/* 从上往下排放 */flex-direction: column;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;height: 200px;width: 300px;}
</style>

![[61b011c5-be4f-436b-81fc-cd6058f291b5.png]]
案例四:column-reverse 从下往上,数据颠倒排放

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/*  从下往上,数据颠倒排放 */flex-direction: column-reverse;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;height: 200px;width: 300px;}
</style>

![[0ae29b5b-eb94-4b55-ab61-7fc9b305a44b.png]]

flex-wrap 设置项目换行方式

默认情况下,项目都排在一条线(又称”轴线”)上。 flex-wrap 属性设置如果一条轴线排不下,项目如何换行。
语法:flex-warp:warp nowrap (默认):不换行,都在一行或者一列中显示 wrap:换行,第一行在上方。 wrap-reverse:伸缩项目无法容纳时,自动换行,方向和wrap相反,这个效果和使用float的效果是一样的。
![[8eea5a83-55f6-49fd-ba3a-3b63a8f4253d.png]]
![[cf6b9902-b11e-4f35-8f04-0806ee175814.png]]
案例一:warp换行显示

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/*  换行显示 */flex-wrap: wrap;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;height: 200px;width: 500px;}
</style>

![[e0e99c66-ab48-484e-87ac-6fe38cc28ada.png]]
案例二:warp-reverse、

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/*  换行显示,并且内容会颠倒 */flex-wrap: wrap-reverse;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;height: 200px;width: 500px;}
</style>

![[daecadce-9605-4d0e-b5ba-9ed2133e763f.png]]

flex-flow 主轴方向和换行方式的简写

语法:flex-flow:row nowarp 默认值:row nowrap
案例一:向右对齐 并且 换行

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/*  颠倒显示,并且换行 */flex-flow: row-reverse wrap ;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;height: 200px;width: 500px;}
</style>
justify-content 定义项目在主轴上的对齐方式【使用的多】

语法:justify-content:center
属性值: 语法:justify-content:center

属性值: flex-start(默认值): 主轴起点对齐 flex-end主轴终点对齐 center:居中 space-between:两端对齐,项目之间的间隔都相等。

space-around: 每个项目两侧的间隔相等。所以,项目之间间隔比项目与边框间隔大一倍。
space-evenly: 可以使每个元素之间和元素距离边距的距离都相等,但是兼容性比较差。
![[a5b43fdf-2c0d-421b-9698-fbb54f2df438.png]]
![[6680ee58-cd0a-4c01-99e4-18232e043d34.png]]
![[6594e641-d9f2-494e-bfcb-c13ced9a4ef0.png]]
![[72369b44-acbf-4b20-a74f-91235cb28448.png]]案例一:中间对齐,两侧不固定

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/* 整体居中对齐 */justify-content: center;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;height: 200px;width: 300px;}
</style>

![[42faeb42-7d03-4104-9439-f99729466a69.png]]
案例二:平均分布,两侧没有缝隙

 <style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/* 两端对齐 */justify-content: space-between;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;height: 200px;width: 300px;}
</style>

![[2dfa1f49-0e75-4b73-8558-a185018810e6.png]]
案例三:整行平均分布

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/* 中间间距一致 */justify-content: space-around;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;height: 200px;width: 300px;}
</style>

![[325a116d-3527-47f1-9e60-bf89ba359753.png]]
案例四:整个每个盒子之间的间距一致

<style>.box {display: flex;display: -webkit-flex;border: 1px solid #f00;/* 间距一致 */justify-content: space-evenly;}.inner {background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;height: 200px;width: 300px;}
</style>
<div class="box"><div class="inner">项目1</div><div class="inner">项目2</div><div class="inner">项目3</div>
</div>
align-content属性起作用的条件【针对多行主轴】

对父元素设置自由盒属性display:flex;
并且设置排列方式为横向排列flex-direction:row; (默认值)
设置换行,flex-wrap:wrap;
![[2a27003b-3c49-4b27-b328-e91dce8d677f.png]]
![[43a312de-d122-4931-b6b6-4b9b85199ab4.png]]
![[9d533f0e-9ec1-491e-b4c8-7c269e3f3228.png]]
![[1d21892d-f557-4511-a607-f0f828b79c11.png]]
![[591e0f77-675d-49a7-97b7-f4bafc4244b1.png]]
![[5d142bc4-c6c4-4dff-9cba-7f26924033f3.png]]

align-items 项目在交叉轴上对齐方式【针对单个主轴】

语法:align-items:flex-end 属性值:
flex-start:交叉轴的起点对齐。
flex-end:交叉轴的终点对齐。
center:交叉轴的中点对齐。
baseline: 项目的第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为 auto,项目将占满整个容器的高度。

案例一:在交叉轴起点对齐

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/* 交叉轴的起点对齐 */align-items: flex-start;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;width: 300px;}
</style>

![[4908d0b7-b5ab-4393-9f09-edf9d38a258b.png]]
案例二:在交叉轴终点对齐

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/* 交叉轴的终点对齐 */align-items: flex-end;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;width: 300px;}
</style>

![[37fce746-bb83-42bb-840c-f6137f68e6d1.png]]
案例三:交叉轴的中心对齐

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/* 交叉轴的中心对齐 */align-items: center;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;width: 300px;}
</style>

![[08ea1b3f-7a61-4822-9d3a-3e5f5ba93566.png]]
案例四:第一行文字的基线对齐

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;/* 交叉轴的基线对齐 */align-items: baseline;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;width: 300px;}
</style>

![[3adec215-1438-4986-83d0-c2cb6837661e.png]]

align-self 清理额外空间,单独设置某一个伸缩项目

align-self 和align-items 一样,都是清理额外空间,但它是单独设置某一个伸缩项目的。所有的值和align-itmes 一致

案例一:单独给第二个元素清除多余空间

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;width: 300px;}/* 单独给第二个元素清除多余空间 */.inner:nth-child(2){align-self: center;}
</style>

![[Pasted image 20250805150753.png]]

flex 控制伸缩容器的比例分配

用来控制伸缩容器的比例分配,按比例分配

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;width: 300px;}/* 单独给第二个元素清除多余空间 */.inner:nth-child(1){flex: 1;}.inner:nth-child(2){flex: 2;}.inner:nth-child(3){flex: 3;}
</style>

![[67165ecb-8bd8-47c7-a07b-63eb6b669dac.png]]

order 控制伸缩项目出现的顺序

数值越小,排列越靠进主轴起点,默认为 0。 注:以下效果图给容器设置了 justify-content: space-between;
![[757fdd9d-d7c7-473a-86aa-aa5c067cf20f.png]]

<style>.box{display: flex;display: -webkit-flex;border: 1px solid #f00;}.inner{background-color: yellowgreen;border: 1px solid #f00;margin: 5px;padding: 5px;width: 300px;}/* 排序 */.inner:nth-child(1){order: 3;}.inner:nth-child(2){order: 1;}.inner:nth-child(3){order: 2;}
</style>

![[95bac62d-5b00-4cee-a695-ef65cfaff783.png]]

flex-grow 放大比例 / flex-shrink 缩小比例

定义项目的放大比例。默认为0,即如果存在剩余空间,也不放大。
flex布局发生在父容器和子容器之间。父容器需要有flex的环境(display:flex;),子容器才能根据自身的属性来布局,简单的说,就是瓜分父容器的空间。相反就是说如果父容器没有flex的环境,那么子容器就无法使用flex的规则来划分父容器的空间。

<style>.box{width: 500px;height: 300px;border: 1px solid #f00;display: flex;}.inner:nth-child(1){width: 100px;height: 100px;background-color: #f00;}.inner:nth-child(2){width: 100px;height: 100px;background-color: green;}.inner:nth-child(3){width: 100px;height: 100px;background-color: blue;}
</style>
<div class="box"><div class="inner1">1</div><div class="inner2">2</div><div class="inner3">3</div>
</div>

现在大盒子为500,每个inner的宽度为100px,默认情况下,200px的剩余空间是不会被占用的; flex-grow 的作用就是就是用来瓜分剩余空间的 我们假设box的width是500px,现在我们再假设inner1、inner2、inner3的width是100px,那么剩余空间就是500-100*3=200。 知道了剩余空间有什么用呢?这个时候flex-grow就该出场了,假如我们这个时候对inner1设置flex-grow:1,那么我们会发现,inner1把inner2和inner3都挤到右边了,也就是说剩余的200px空间都被inner1占据了,所以此时inner1的width比实际设置的值要大。

面试题:flex:0 1 auto 是什么意思

flex:是flex-grow,flex-shrink和flex-basis的简写
flex-grow:定义项目的的放大比例;
flex-shrink:定义项目的缩小比例;
flex-basis: 定义在分配多余空间之前,项目占据的主轴空间(main size),浏览器根据此属性计算主轴是否有多余空间,

  • 默认值为auto,即 项目原本大小;
  • tranform:rotate3D( 0/1 ,y,z,deg);
  • 数据类型:布尔值(true 1/false 0)
    所以flex属性的默认值为:0 1 auto (不放大会缩小) flex为none:0 0 auto (不放大也不缩小) flex为auto:1 1 auto (放大且缩小)

面试题:怎么让元素上下左右居中

综合案例-淘宝移动端底部Tab效果

![[ecb8b29d-3d7d-48a4-9b35-4c6a479a314c.png]]
删除或者添加一个底部tab选项,都不需要调整样式,flex弹性盒子会根据内容的多少,调整元素和元素之间的距离

<link rel="stylesheet" href="http://at.alicdn.com/t/font_2924794_90p693jkqb5.css"><style>.all{width: 620px;height: 3000px;margin: 0 auto;border: 1px solid #0f0;}.box{width: 560px;position: fixed;bottom: 0;display: flex;/* 两端对齐 */justify-content: space-between;background-color: beige;padding: 0 30px;}.box div{text-align: center;}.box i{font-size: 26px;}</style><div class="all"><div class="box"><div><i class="iconfont icon-shouji"></i><br/>首页</div><div><i class="iconfont icon-kefu"></i><br/>客服</div><div><i class="iconfont icon-kefu"></i><br/>客服</div><div><i class="iconfont icon-kefu"></i><br/>客服</div><div><i class="iconfont icon-smile"></i><br/>客服</div></div></div>

案例一:使用弹性盒子制作骰子效果
![[61dc8a45-6f69-40c8-baf3-39532d7941ad.png]]

http://www.dtcms.com/a/315402.html

相关文章:

  • 从达梦到 StarRocks:国产数据库实时入仓实践
  • NFS CENTOS系统 安装配置
  • RAGFlow 0.20.0 : Multi-Agent Deep Research
  • Java Date类介绍
  • 计算机网络:(十三)传输层(中)用户数据报协议 UDP 与 传输控制协议 TCP 概述
  • Python 基础语法(二):流程控制语句详解
  • FPGA实现Aurora 8B10B视频点对点传输,基于GTP高速收发器,提供4套工程源码和技术支持
  • [按键精灵]
  • 【C++详解】⼆叉搜索树原理剖析与模拟实现、key和key/value,内含优雅的赋值运算符重载写法
  • 豆包新模型与 PromptPilot 实操体验测评,AI 辅助创作的新范式探索
  • Python装饰器函数《最详细》
  • 06 基于sklearn的机械学习-欠拟合、过拟合、正则化、逻辑回归、k-means算法
  • 深度残差网络ResNet结构
  • 补:《每日AI-人工智能-编程日报》--2025年7月30日
  • 第二十四天(数据结构:栈和队列)队列实践请看下一篇
  • 数据集相关类代码回顾理解 | np.mean\transforms.Normalize\transforms.Compose\xxx.transform
  • MySQL中COUNT(\*)、COUNT(1)和COUNT(column),到底用哪个?
  • 8.4 Codeforces练习
  • 库克宣布苹果ALL-IN AI战略:效仿iPhone模式实现弯道超车 | AI早报
  • 机器学习——基本算法
  • LangChain4j + Milvus 从0-1实现会话管理与RAG检索的AIChat超详细教程
  • 数据结构——队列(Queue)
  • Linux学习—数据结构(链表2)
  • 红队信息收集工具oneforall子域名搜集爆破工具安装使用教程详细过程
  • 句子表征-文本匹配--representation-based/interactive-based
  • 【华为机试】685. 冗余连接 II
  • 补:《每日AI-人工智能-编程日报》--2025年7月28日
  • 【深度学习新浪潮】近三年零样本图像分类研发进展调研
  • mongodb 和 mysql 相关操作
  • 【C++】语法基础篇