Css3引入了新的盒模型——弹性盒模型,该模型决定一个盒子在其他盒子中的分布方式以及如何处理可用的空间。这与XUL(火狐使用的用户交互语言)相似,其它语言也使用相同的盒模型,如XAML 、GladeXML。

使用该模型,可以很轻松的创建自适应浏览器窗口的流动布局或自适应字体大小的弹性布局。本文的例子使用以下的HTML代码:

<body>
<div id="box1">1</div>
<div id="box2">2</div>
<div id="box3">3</div>
</body>

传统的盒模型基于HTML流在垂直方向上排列盒子。使用弹性盒模型可以规定特定的顺序,也可以反转之。要开启弹性盒模型,只需设置拥有子盒子的盒子的display的属性值为box(或inline-box)即可。

display: box;

水平或垂直分布

“box-orient”定义分布的坐标轴:vertical和horizional。这两个值定义盒子如何显示

body{
display: box;
box-orient: horizontal;
}

反向分布

“box-direction”可以设置盒子出现的顺序。默认情况下,只需定义分布坐标轴——box随html流分布。如果为水平坐标轴,则从左到 右分布;垂直坐标轴则从上到下分布。定义“box-direction”的属性值为“reverse”,则反转盒子的排列顺序。

body {
display: box;
box-orient: vertical;
box-direction: reverse;
}

具体分布

属性“box-ordinal-group”定义盒子分布的顺序。可以随意的控制其分布顺序。这些组以一个从“1”开始的数字定义,盒模型将首先分布这些组,所有这些盒子将在每个组中。分布将从小到大排列。

body {
display: box;
box-orient: vertical;
box-direction : reverse;
}
#box1 {
box-ordinal-group: 2;
}
#box2 {
box-ordinal-group: 2;
}
#box3 {
box-ordinal-group: 1;
}

盒子尺寸

默认情况下,盒子并不具有弹性,如果box-flex的属性值至少为1时,则变得富有弹性。

如果盒子不具有弹性,它将尽可能的宽使其内容可见,且没有任何溢出,其大小由“width”和“height”来决定(或min-height、min-width、max-width、max-height)。

如果盒子是弹性的,其大小将按下面的方式计算:

  1. 具体的大小声明(width、height、min-width、min-height、max-width、max-height);
  2. 父盒子的大小和所有余下的可利用的内部空间

如果盒子没有任何大小声明,那么其大小将完全取决于父box的大小。即:盒子的大小等于父级盒子的大小乘以其box-flex在所有子盒子box-flex总和中的百分比(子盒子的大小=父盒子的大小*子盒子的box-flex/所有子盒子的box-flex值的和)。

如果一个或更多的盒子有一个具体的大小声明,那么其大小将计算其中,余下的弹性盒子将按照上面的原则分享剩下的可利用空间。

看看下面的例子,理解起来更容易。

所有盒子都是弹性的

下面的例子中,box1的大小为box2的两倍,box2与box3大小一样。看起来好像是用百分比定义盒子的大小,但是有一个区别:使用弹性盒模型,增加一个盒子,无须重新计算其大小。

body {
display: box;
box-orient: horizontal;
}
#box1 {
box-flex: 2;
}
#box2 {
box-flex: 1;
}
#box3 {
box-flex: 1;
}

一些盒子有固定大小

下面的例子中,box3并不是弹性的,宽度为160px;这样box1和box2将有240px的可利用空间。因此,box1的宽度为160px(240*2/3),box2的宽度为80px(240*1/3)。

body {
display: box;
box-orient: horizontal;
width: 400px;
}
#box1 {
box-flex: 2;
}
#box2 {
box-flex: 1;
}
#box3 {
width: 160px;
}

溢出管理

因为是弹性盒子、非弹性盒子混排,有可能所有盒子的尺寸大于或小于父盒子的尺寸。这样就有可能空间太多或空间不足。

空间太多如何处理

可利用空间的分布取决于两个属性值:box-align 和 box-pack。

属性“box-pack”管理水平方向上的空间分布,有以下四个可能属性:start、end、 justify、 or center。

  1. start 所有盒子在父盒子的左侧,余下的空间在右侧;
  2. end所有盒子在父盒子的右侧,余下的空间在左侧;
  3. justify 余下的空间在盒子间平均分配;
  4. center 可利用的空间在父盒子的两侧平均分配。

属性“box- align”管理垂直方向上的空间分布,有以下五个可能属性之:start、 end,、center、 baseline和 stretch。

  1. start 每个盒子沿父盒子的上边缘排列,余下的空间位于底部;
  2. end 每个盒子沿父盒子的下边缘排列,余下的空间位于顶部;
  3. center 可用空间平均分配,上面一半,下面一半;
  4. baseline 所有盒子沿着它们的基线排列,余下的空间可前可后;
  5. stretch 每个盒子的高度调整到适合父盒子的高度

body {
display: box;
box-orient: horizontal;
width: 400px;
}
#box1 {
box-flex: 2;
}
#box2 {
box-flex: 1;
}
#box3 {
width: 160px;
}

空间不足怎么办

与传统的盒模型一样,overflow属性用来决定其显示方式。为了避免溢出,你可以设置box-lines为multiple使其换行显示。

弹性盒模型看起来很不错,Gecko 和 WebKit对该模型都有一些尝试性的测试。在这些属性之前加上-moz和-webkit即可使用该属性。也即是说,firefox、safari、chrome可以使用这些特性,可以看看这个弹性盒模型的demo。

作为前端开发者来说,该模型对我们解决网页设计中一些常见的问题非常方便,如:表单布局、垂直居中、视觉上分离html流,等等。不就的将来它将成为一个web标准,早早熟悉它不是什么坏事

针对WebKit内核浏览器,一个简单的示例如下代码所示:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<title>HTML5</title>
<style>
body{
display: -webkit-box; /* 设定body为弹性盒子 */
-webkit-box-orient: horizontal; /* 设定弹性盒子为水平方向 */
height: 100px;
}
#box1{
-webkit-box-flex: 2; /* box1占据的宽度为2份 */
background: blue;
}
#box2{
-webkit-box-flex: 1; /* box2占据的宽度为1份 */
background: green;
}
#box3{
-webkit-box-flex: 1; /* box3占据的宽度为1份 */
background: olive;
}
div{
border: 1px black solid;
margin-left: 10px;
}
</style>
</head>
<body>
<div id="box1"></div>
<div id="box2"></div>
<div id="box3"></div>
</body>
</html>
该示例的运行效果如下图所示。

拖动以改变浏览器的大小时,可以看到,随着body宽度的变化,box1、box2和box3三个盒子的宽度也会随之变化,但是都保持着定义好的2∶1∶1比例。

css3教程:弹性盒模型相关推荐

  1. 学习css3的弹性盒模型

    Flexbox通常能让我们更好的操作他的子元素布局,例如: 如果元素容器没有足够的空间,我们无需计算每个元素的宽度,就可以设置他们在同一行: 可以快速让他们布局在一列: 可以方便让他们对齐容器的左.右 ...

  2. (转)详解css3弹性盒模型(Flexbox)

    今天刚学了css3的弹性盒模型,这是一个可以让你告别浮动.完美实现垂直水平居中的新特性. Flexbox是布局模块,而不是一个简单的属性,它包含父元素和子元素的属性. Flexbox布局的主体思想是似 ...

  3. css3弹性盒模型兼容性,彻底弄懂css3的flex弹性盒模型

    由于在日常工作中使用css或者bootstrap的栅格系统已经能很好的满足业务需求,所以一直以来对css3的弹性布局不是很感冒. 近日有幸在一篇文章中领略了flex的魅力--简洁优雅.随试之. /*容 ...

  4. CSS3弹性盒模型之box-orient box-direction

    Css3引入了新的盒模型--弹性盒模型,其实上一篇文章已经讲到了一个box-flex,今天来讲讲另外的两个弹性盒模型属性box-orient 和 box-direction. 1.box-origen ...

  5. CSS3弹性盒模型布局模块介绍

    来源:Robert's talk 原文:http://robertnyman.com/2010/12/02/css3-flexible-box-layout-module-aka-flex-box-i ...

  6. html弹性盒模型,Css3 弹性盒模型

    我们来介绍一下Css3 弹性盒模型.Css3引入了新的盒子模型--弹性盒模型,该模型决定一个盒子在其他盒子中的分布方式以及如何处理可用的空间.这与XUL(火狐使用的用户交互语言)相似,其它语言也使用相 ...

  7. css3的弹性盒子模型,css3弹性盒子模型——回顾。

    1.box-flex属性规定框的子元素是否可伸缩其尺寸. 父元素必须要声明display:box;子元素才可以用box-flex. 语法:box-flex:value; 示例: .test_box { ...

  8. CSS3 建立弹性盒布局 Flex布局

    弹性盒布局模型中引入了一些新的属性,只要设置好相应属性,盒子就具有弹性,在改变浏览器窗口大小时,盒子大小也会自动发生变化.并且,盒子的大小由浏览器自动计算,使页面布局更加灵活.更加简单,可以很轻松创建 ...

  9. 从零开始学前端:弹性盒模型(flex布局) --- 今天你学习了吗?(CSS:Day19)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(CSS) 复习:从零开始学前端:字体图标的引入 - 今天你学习了吗?(CSS:Day18) 文章目录 从零开始学前端:程序猿小白也可以完全 ...

最新文章

  1. loadscript加载
  2. 初探云原生应用管理(二): 为什么你必须尽快转向 Helm v3
  3. Groovy与Java的不同点
  4. VTK:规则多边形源用法实战
  5. php 正则匹配反向引用,php正则表达式子模式的反向引用学习笔记
  6. Pixhawk代码分析-姿态解算篇B
  7. Transact-SQL命令语法-数据表
  8. 计算机视觉方面的数据集收藏(CV Datasets on the web)
  9. 六款优秀的 Linux 基准测试工具
  10. No package ‘libmarco-private‘ found
  11. java 容器(联系数据结构)
  12. 网络工程师试题(二)2020-12-8
  13. VirtualLab专题实验教程-4.基于超表面的闪耀光栅
  14. C函数的参数中有取地址符
  15. cpp设计并实现大整数
  16. App数据分析到底要分析什么
  17. 喵星史话(一)——猫的起源
  18. java 浏览器测试,【Java资源大全】Selenium:基于浏览器的测试套件
  19. 高薪就业面试题系列 人事篇三
  20. 中国首台千万亿次超级计算机,中国首台千万亿次超级计算机完成安装

热门文章

  1. 【错误记录】Groovy工程中的文件查找策略 ( main 函数中需要使用 src/main/groovy/Script.groovy | Groovy 脚本直接使用代码相对路径 )
  2. 【Android 逆向】代码调试器开发 ( ptrace 函数 | 读寄存器 | 写寄存器 )
  3. 【Android 逆向】Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
  4. 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行 ( 定义连接点注解 | 定义 Aspect 切面 | 定义切入点 | 逐个处理切入点的各个连接点 )
  5. 【AOP 面向切面编程】AOP 简介 ( AspectJ 简介 | AspectJ 下载 )
  6. 【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )
  7. 【集合论】有序对 ( 有序对 | 有序三元组 | 有序 n 元祖 )
  8. 【Android 应用开发】Canvas 绘制文字 ( 文字尺寸测量 | 基线绘制 )
  9. go语言中将函数作为变量传递
  10. HDU3496-Watch The Movie