弹性布局盒模型的核心,在于弹性容器中子元素的尺寸是弹性的,容器会根据布局的需要,自动调整子元素的尺寸和顺序,并以最佳方式填充所有可用空间。

当容器中有空白空间时,子元素可以扩展,以占据额外的空白空间;当容器中的空间不足时,子元素可以缩小尺寸,以防止超出容器范围。

在弹性布局盒模型中,浏览器会根据子元素的相关属性,来自动调整子元素的尺寸和顺序。这些属性见表 9‑8:

表 9-8 CSS3弹性布局盒模型子元素属性
属性 说明
order 定义子元素的排列顺序
flex-grow 定义子元素的拉伸因子,当容器空间过剩时,子元素按比例进行拉伸
flex-shrink 定义子元素的收缩因子,当容器空间不足时,子元素按比例进行收缩
flex-basis 定义为子元素分配的默认空间大小
flex 复合属性,定义子元素的拉伸因子、收缩因子、默认空间大小
align-self 定义子元素自身在侧轴方向上的对齐方式

order属性

默认情况下,弹性容器中子元素的排列顺序,取决于它们在HTML代码中的排列顺序,先出现的排在前面。

在弹性布局盒模型中,每个子元素有自己独立的 order属性,用来控制子元素的排列顺序,数值小的排在前面。语法格式为:

  1. order: <integer>

order属性的默认值为 0。可以为负值。指定 order 属性后,浏览器将根据 order属性的值,对子元素进行分组,order 值相同的元素属于一组,值小的组排在前面,组内则根据元素在HTML代码中出现的先后顺序,先出现的排在前面。

现在,为三个子元素定义 order属性,取值分别是 2、1、-1,就相当于把所有子元素分为 3 组,每组 1 个元素。CSS代码如下:

  1. .box1 {
  2.     order: 2;
  3.     background: #7f3ffd;
  4. }
  5. .box2 {  
  6.     order: 1;
  7.     background: #ef39d5;
  8. }
  9. .box3 {
  10.     order: -1;     
  11.     background: #1bb9f1;
  12. }

上述代码运行结果如图 9‑18 所示:

图9-18 order属性效果

可以看出,box1、box2、box3 的出现顺序与它们在HTML中的定义顺序无关,而是按照 order属性值的大小,数值小的排在前面。

flex-grow属性

flex-grow属性用来定义子元素的拉伸因子,当容器有多余的空间时,浏览器把所有子元素的 flex-grow属性值相加,再根据各自在总值中所占的份额,分配容器的多余空间。语法为:

  1. flex-grow: <number>

flex-grow属性的默认值为 0。支持整数或小数,不允许负值。如果某个子元素没有定义 flex-grow属性,或将 flex-grow属性显式设置为 0,或定义了固定尺寸,则不再为它分配父元素的多余空间。

  1. .father {
  2. width: 600px;
  3.     display: flex;
  4. }
  5. .father > div {
  6.     width: 100px;
  7. }
  8. .box1 {
  9.     flex-grow: 2;       
  10.     background: #7f3ffd;
  11. }
  12. .box2 {
  13.     flex-grow: 1;
  14.     background: #ef39d5;
  15. }
  16. .box3 {
  17.     background: #1bb9f1;
  18. }

上述代码中,父元素的宽度是 600px,每个子元素的宽度为 100px,于是,父元素的剩余宽度就变成 600 – 3×100 = 300px。

box1 和box2 定义了 flex-grow属性,box3 未定义。故 box1 和 box2 把剩余空间分成 2 + 1 = 3 份,box1 占 2/3,box2 占 1/3。于是,box1、box2 按 3:1 来分配这 300px,box3 不分配。box1 分得 300×(2/3) = 200px,box2 分得 300×(1/3) = 100px。

最终的结果是,box1 和 box2 在预分配空间的基础上,又分得了剩余空间,而 box3 仅有原本的 100px 而已。运行结果如图 9‑19 所示:

图9-19 flex-grow属性效果

可以看出,box1 的实际宽度为100 + 200 = 300px,box2的实际宽度为100 + 100 = 200px,box3 的实际宽度仍然是 100px。

flex-shrink属性

flex-shrink属性定义子元素的收缩因子,当容器空间不足时,浏览器把所有子元素的 flex-shrink属性值相加,再根据各自在总值中所占的份额进行收缩。语法为:

  1. flex-shrink: <number>

flex-shrink属性的默认值为 1。不允许负值,0 表示不收缩。如,父元素 father 下有两个子元素 box1、box2。HTML代码如下:

  1. <div class="father">
  2.     <div class="box1">1</div>
  3.     <div class="box2">2</div>
  4. </div>

CSS代码如下:

  1. .father {
  2. width: 600px;
  3.     display: flex;
  4. }
  5. .box1 {
  6.     width: 400px;
  7.     flex-shrink: 3;
  8.     background: #7f3ffd;
  9. }
  10. .box2 {  
  11.     width: 400px;      
  12.     background: #ef39d5;
  13. }

上述代码中,父元素的宽度是 600px,每个子元素的宽度是 400px,于是,父元素的宽度不足。为了能够容纳所有子元素,子元素需要收缩,待收缩的宽度为 2×400 – 600 = 200px。

box1 定义了 flex-shrink属性,box2 未定义,box2 的 flex-shrink属性使用默认值 1。box1, box2 把待收缩空间分成 3 + 1 = 4份,box1 占 3/4,box2 占 1/4。于是,box1 和 box2按 3:1 来分配这 200px,box1要收缩 200×(3/4) = 150px,box2 要收缩 200×(1/4) = 50px。

最终的结果是,box1 的实际宽度为 400 – 150 = 250px, box2 的实际宽度为400 – 50 = 350px。运行结果如图 9‑20 所示:

图9-20 flex-shrink属性效果

flex-basis属性

flex-basis属性用来定义为子元素预留的主轴尺寸。语法为:flex-basis: <length> | auto,默认值为 auto。

取值值为 auto 时,实际使用的值是主轴尺寸属性的值,即 width 或 height 属性的值。如果主轴尺寸属性的值也是 auto,则要根据其内容和 flex-grow属性来分配空间。

取值为长度值时,首先为该元素预留空间,预留后剩余的空间,再分配给所有子元素。这样一来,该元素除了预留空间外,还会分得容器的剩余空间。在父元素的空间有剩余时,该元素分配的空间 = flex-basis + flex-grow;在父元素空间不足时,该元素分配的空间 = flex-basis - flex-shrink。

如,父元素 father 下有两个子元素 box1、box2。HTML代码如下:

  1. <div class="father">
  2.     <div class="box1">1</div>
  3.     <div class="box2">2</div>
  4. </div>

CSS代码如下:

  1. .father {
  2.     width: 400px;
  3.     display: flex;
  4. }
  5. .box1 {
  6.     flex-grow: 1;
  7.     flex-basis: 200px;
  8.     background: #7f3ffd;
  9. }
  10. .box2 {
  11.     flex-grow: 1;
  12.     background: #ef39d5;
  13. }

上述代码中,父元素的宽度是 400px。box1 定义了 flex-basis属性,预留了 200px 的空间。而 box2 未定义 flex-basis属性,并未预留空间。这样一来,父元素剩余的空间就变成了 400 – 200 = 200px。

由于 box1, box2 的 flex-grow属性的值都是 1,故由 box1, box2 均分父元素的剩余空间,各分得 100px。最终结果是,box1 的实际宽度为 200 + 100 = 300px, box2 的实际宽度为 100px。运行结果如图 9‑21 所示:

图9-21 flex-basis属性效果

flex属性

flex属性是 flex-grow、flex-shrink、flex-basis 这 3 个属性的复合属性,用来定义子元素如何分配父元素的空白空间。语法格式为:

  1. flex: none | [ <"flex-grow"> <"flex-shrink">? || <"flex-basis"> ]

取值为关键字 none 时,相当于 flex-grow 的值为 0、flex-shrink 的值为 0、flex-basis的值为 auto。也就是说,flex: none 就相当于 flex: 0 0 auto。除此之外,flex属性还可以使用以下常用值:

1) flex: initial,这是 flex属性的初始值,它表示 flex-grow、flex-shrink、flex-basis 这 3 个属性均使用默认值,就相当于flex: 0 1 auto。

2) flex: auto,相当于 flex: 1 1 auto,表示子元素的实际尺寸为 width 或 height 属性的值,并子元素可以根据弹性容器的空间自由伸缩。

3) flex: <positive-number>,相当于 flex: <positive-number> 1 0%,表示为子元素预留的主轴尺寸为0,并根据设置的比率分配弹性容器的剩余空间。如果一个伸缩容器里的所有项目都使用此模式,则它们按各自指定的伸缩比率分配弹性容器的剩余空间。

align-self属性

align-self属性用来定义当容器在侧轴方向上有额外的空白空间时,该子元素如何分配多余的空间,或容器的空间不足时,如何分配溢出的空间。

align-self属性用来覆写容器上 align-items属性,除了 align-items属性的所有可选值外,align-self属性还可以设置为 auto,表示其计算值是弹性容器的 align-items属性值;如果弹性容器未定义 align-items属性,则为 stretch。

关于作者

歪脖先生,十五年以上软件开发经验,酷爱Web开发,精通 HTML、CSS、JavaScript、jQuery、JSON、Python、Less、Bootstrap等,著有《HTML宝典》、《揭秘CSS》、《Less简明教程》、《JSON教程》、《Bootstrap2用户指南》、《Bootstrap3实用教程》,并全部在 GitHub 上开源。

CSS3 Flex布局子元素的属性相关推荐

  1. css:flex布局子元素宽度被压缩问题

    问题 如题,父元素设置 flex 布局后,子元素如果超出长度则会被压缩,如图: 解决 子元素设置 flex-shrink: 0;,默认值为 1 介绍 flex-shrink 属性 flex-shrin ...

  2. Flex布局子元素对齐方式

    display display: flex | inline-flex ; display确定是否启用flexbox布局,flexbox布局下的子元素无论是内联元素的还是块状元素都会flex流的布局方 ...

  3. CSS基础:flex布局子元素被撑大(文本省略号)

    文本撑大子盒子 在使用flex布局中,会有下面这样一个问题. 这种问题不但会让盒子撑大,而且还有自己在再使用超过文本长度使用省略号的时候,也会再拉动窗口的时候,变的没有效果. 如下: <!DOC ...

  4. 解决uni-app中flex布局子元素宽度溢出

    在如下页面中,每一行使用flex布局,每行的头像宽度指定,右侧容器使用flex:1自适应,当name过长时,右侧容器宽度溢出. 页面布局如下 <view class="friend-l ...

  5. @css flex 布局子内容将父元素撑开

    flex 布局子内容将父元素撑开 遇到的问题: 需要显示的文本是通过富文本编辑器提交是文本(包含了p标签),展示时通过flex布局实现.如下图: 但是通过flex布局实现后发现文本内容过长时将后半部分 ...

  6. 关于H5、CSS3新增的一些元素及属性

    H5简介 HTML5是HTML最新的修订版本,具有新的元素,属性和行为. HTML5规范于2014年10月29日由万维网联盟正式宣布. 随着移动化的进程,HTML5终将成为主流. H5的新变化 H5文 ...

  7. CSS3 Flex布局弹性容器的属性

    为了实现对弹性子元素的灵活控制,在弹性容器上定义了相关属性,通过这些属性来控制主轴的方向.子元素溢出后的行为.子元素的对齐方式等.这些属性见表 9‑2: 表 9-2 父元素属性 属性 说明 flex- ...

  8. Flex布局里的align-self属性

    https://css-tricks.com/almanac/properties/a/align-self/ It makes possible to override the align-item ...

  9. CSS中flex弹性盒子——弹性容器属性,弹性元素属性(附图)

    网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,2009 ...

最新文章

  1. 科大星云诗社动态20201222
  2. offsetwidth/offsetheight的区别
  3. 聊聊我常用的5款动态数据可视化工具
  4. MAVEN [ERROR] 不再支持源选项 5。请使用 7 或更高版本。
  5. 漫画:如何证明sleep不释放锁,而wait释放锁?
  6. 做形态学方法的团队_图像分割实战-分水岭分割方法和GrabCut 算法
  7. Hadoop的Mapreduce中Mapper的key和Map的key的区别
  8. ubuntu软件安装、卸载
  9. C语言使用时间创建随机数
  10. notepad++列编辑操作
  11. 使用TinyPng来压缩图片
  12. 国际标准书号 ISBN API 数据接口
  13. 支付宝授权登陆php,支付宝app登录授权的infoStr授权登录流程
  14. 超链接标签a实现跳转
  15. 浏览器页面前端自适应方案
  16. EPOCH、INTERATION、BATCH_SIZE的区别
  17. sourceinsight常用宏
  18. Ant入门教程之常用命令
  19. 获取Windows 10上文件资源管理器的帮助
  20. 请别再问我什么是分布式事务

热门文章

  1. 2.4 shell 脚本基础
  2. Linux文本编辑器之vim
  3. ruby imap抓取inbox中所有邮件的主题
  4. startx启动过程分析
  5. 笔记本CPU和显卡的选择标准
  6. java catch中 return_JAVA中try、catch、finally带return的执行顺序总结
  7. linux c语言 电子相册,纯C语言开发(电子相册).doc
  8. flock SUSE/RHEL
  9. BZOJ 3729: Gty的游戏 [伪ETT 博弈论]【学习笔记】
  10. 各种控制列表--前缀列表