css3的弹性框模型是什么意思?

html-css016

css3的弹性框模型是什么意思?,第1张

弹性盒模型决定一个盒子在其他盒子中的分布方式以及如何处理可用的空间。这与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)。

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

具体的大小声明(width、height、min-width、min-height、max-width、max-height);

父盒子的大小和所有余下的可利用的内部空间

如果盒子没有任何大小声明,那么其大小将完全取决于父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。

start 所有盒子在父盒子的左侧,余下的空间在右侧;

end所有盒子在父盒子的右侧,余下的空间在左侧;

justify 余下的空间在盒子间平均分配;

center 可利用的空间在父盒子的两侧平均分配。

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

start 每个盒子沿父盒子的上边缘排列,余下的空间位于底部;

end 每个盒子沿父盒子的下边缘排列,余下的空间位于顶部;

center 可用空间平均分配,上面一半,下面一半;

baseline 所有盒子沿着它们的基线排列,余下的空间可前可后;

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。

CSS3 弹性框(Flexible Box或Flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当排布行为的布局方式。对很多应用程序来说,由于不使用浮动,且弹性容器的外边距也不会与其内容的外边距合并,弹性框模型比起方框模型要好一些。许多设计师会发现弹性框模型易于使用。弹性框中的子元素可以在各个方向上进行布局,并且能以弹性尺寸来适应显示空间。由于元素的显示顺序与它们在源代码中的顺序无关,定位子元素变得更容易,并且能够用更简单清晰的代码来完成复杂的布局。这种无关性是特意限制于视觉呈现上的,语音顺序以及基于源代码顺序的导航均不受影响。

注意:虽然CSS 弹性框布局规范还处于最终征求意见稿 (Last Call Working Draft)阶段(参见最新编辑草案),并非所有浏览器都实现了弹性框的所有功能。但,这么说吧,现在全线产品对弹性框都有良好支持。最新的兼容性状况可以查看每个具体属性的兼容性表格获取。弹性框概念弹性布局在定义方面是指调整其内项目宽高从而在任何显示设备上实现对可用显示空间最佳填充的能力。弹性容器扩展其内项目来填充可用空间,或将其收缩来避免溢出。弹性框布局算法是方向无关的,与此相对的,块级布局侧重于垂直方向、行内布局侧重于水平方向。虽然块级布局用于页面行之有效,但其仍缺乏足够的定义来支持那些必须随用户代理(user agent)不同或设备方向从水平转为垂直等各种变化而变换方向、调整大小、拉伸、收缩的应用程序组件。 弹性框布局主要适用于应用程序的组件及小规模的布局,而(新兴的)网格布局则针对大规模的布局。这二者都是 CSS 工作组为在不同用户代理、不同书写模式和其他灵活性要求下的网页应用程序有更好的互操作性而做出的更广泛的努力的一部分。弹性框相关词汇表关于弹性框的讨论已经从诸如水平/行内轴和垂直/块级轴这些术语中解放出来,与此同时,需要有一套新的术语来正确描述此模型。在学习下面的词汇项目时请对照下图。图中是一个flex-direction属性为row的弹性容器,意味着其内的弹性项目将根据既定书写模式沿主轴水平排列,其方向为元素的文本流方向,在这个例子里,为从左到右。弹性容器(Flex container)包含着弹性项目的父元素。通过设置display属性的值为flex或inline-flex来定义弹性容器。弹性项目(Flex item)弹性容器的每个子元素都成为弹性项目。弹性容器直接包含的文本将包覆成匿名弹性项目。轴(Axis)每个弹性框布局包含两个轴。弹性项目沿其依次排列的那根轴称为主轴(main axis)。垂直于主轴的那根轴称为侧轴(cross axis)。

flex-direction属性确立主轴。

justify-content属性定义了在当前行上弹性项目沿主轴如何排布。

align-items属性定义了在当前行上弹性项目沿侧轴默认如何排布。

align-self属性定义了单个弹性项目在侧轴上应当如何对齐,这个定义覆盖由align-items所确立的默认值。

方位(Direction)弹性容器的各个边(主轴起点(main start)/主轴终点(main end)和侧轴起点(cross start)/侧轴终点(cross end))描述了弹性条目流的起点与终点。它们具体取决于弹性容器的主轴与侧轴以及由writing-mode确立的方向(从左到右、从右到左,等等)。

order属性将元素与序号组关联起来,并决定哪些元素先出现。

flex-flow属性是flex-direction和flex-wrap属性的简写,决定弹性项目如何排布。

行(Line)根据flex-wrap属性,弹性项目可以排布在单个行或者多个行中。此属性控制侧轴的方向和新行排列的方向。尺寸(Dimension)根据弹性容器的主轴与侧轴,弹性项目的宽和高相应称为主轴尺寸(main size)与侧轴尺寸(cross size)。

min-height与min-width属性初始值为 0。

flex属性是flex-grow、flex-shrink和flex-basis属性的简写,确立弹性项目的伸缩性。

指派弹性框为要使用此样式的元素指派 CSS,需按以下方式设置display属性:

display:flex或者

display:inline-flex这样做将元素定义为弹性容器,其子元素则成为弹性项目。值flex使弹性容器成为块级元素。值inline-flex使弹性容器成为单个不可分的行内级元素。

注意:厂商前缀标记应当附加给 display 属性值,而不是加给 display 属性本身。例如:display : -webkit-flex。弹性项目须知弹性容器直接包含的文本将自动包覆成匿名弹性项目。不过,只包含空白的弹性项目不会被渲染,就如同对其指派display: none。对于弹性容器的绝对定位子元素来说,其静态位置参照弹性容器的内容框的主起始角确定,而后依此完成此元素的定位。相邻的弹性元素其外边距不会互相合并。使用auto外边距可以吸收掉水平或垂直方向上的额外空间,这可以用于对齐或分隔相邻的弹性项目。更多细节请参考 W3C 弹性框布局模型规范中的Aligning with 'auto' margins。为了确保弹性项目有合理的默认最小尺寸,使用min-width:auto与min-height:auto。对于弹性项目,属性值auto使项目的最小宽/高在计算中不会小于其内容的实际宽/高,这样可以保证项目渲染得足够大以容纳其内容。更多细节请参考min-width与min-height。不像 CSS 中的其他对齐方法,弹性框的对齐属性将进行“真正的”居中对齐。这意味着即使弹性条目溢出了弹性容器,它依然保持居中。不过这在某些时候可能会有问题。如果溢出超过了页面的上边缘或左边缘(在从左到右的语言中,比如英语;在诸如阿拉伯语这样从右到左的语言中这个问题出现在右边缘),则虽然那些地方确实有内容,却无法滚动到那些位置。在未来的发布版本里,对齐属性将会有所扩展,使其包含有“安全”选项。目前,如果操心这点,可以改用外边距来达成居中效果,因为外边距会用比较“安全”的方式来响应变化,出现溢出时将停止居中。对需要居中的弹性项目应用自动外边距来替代align-属性的使用。对弹性容器中第一个和最后一个弹性项目的外侧边缘应用自动外边距来替代justify-属性。自动外边距会自动伸缩来占满剩余空间,当有剩余空间存在时弹性项目将会居中,如果没有则切换至常规对齐方式。不过,如果尝试在多行的弹性框中用基于外边距的居中方法来替代justify-content,很不幸,必须对每一行的第一个和最后一个弹性项目应用外边距。除非能够事先预测每一行都结束于哪个元素,否则无法放心地在主轴方向上用基于外边距的居中方法来替代justify-content属性。重新提一下,元素的显示顺序与它们在源代码中的顺序无关,这种无关性只影响视觉呈现,语音顺序以及基于源代码顺序的导航均不受影响。order属性并不影响语音和导航的次序。因此开发者们必须小心,合理地安排元素在源代码中的顺序,以免破坏文档的可访问性。弹性框相关属性不影响弹性框的属性由于弹性框使用了不同的布局算法,某些属性用在弹性容器上没有意义:

多栏布局模块的column-*属性对弹性项目无效。

float与clear对弹性项目无效。使用float将使元素的display属性计为block。

vertical-align对弹性项目的对齐无效。

示例基本的弹性布局示例这个基本的示例展示了如何对元素应用弹性布局,以及在弹性布局状态下相邻元素的行为方式。

htmllang='en'>head>style>.flex{/* 基本样式 */width:350pxheight:200pxborder:1px solid#555font:14px Arial/* 建立弹性框 */display:-webkit-flex-webkit-flex-direction:rowdisplay:flexflex-direction:row}.flex>div{-webkit-flex:11autoflex:11autowidth:30px/* 让过渡表现良好。(从/到'width:auto'的过渡 至少在 Gecko 和 Webkit 上是有 bug 的。 更多信息参见 http://bugzil.la/731886 ) */-webkit-transition:width0.7s ease-outtransition:width0.7s ease-out}/* colors */.flex>div:nth-child(1){background:#009246}.flex>div:nth-child(2){background:#F1F2F1}.flex>div:nth-child(3){background:#CE2B37}.flex>div:hover{width:200px}style>head>body>p>Flexbox nuovop>divclass='flex'>div>unodiv>div>duediv>div>trediv>div>body>html>

flex-box 弹性布局可以实现的效果:自适应布局,效果图如下:

代码如下:

<!DOCTYPE HTML>

<html>

<head>

 <meta charset="utf-8">

 <title>flex box 弹性布局 </title>

 <meta name="Keywords" content="">

 <meta name="Description" content="">

 <style type="text/css">

html,body{height:100%margin:0}/*需要添加高度控制,否则无法撑满整个屏幕*/

body{

display:-webkit-box

-webkit-box-orient:vertical/*按照垂直方向上进行自适应处理*/

}

.content{-webkit-box-flex:1/*分配剩余的所有空间*/} .header{height:50pxmin-width:500px}/*顶部模块高度定死*/

.logo{width:100pxheight:50pxbackground:#99f}/*为区分模块,设置了背景色 logo部分固定宽高*/

.nav{height:50pxbackground:#ccc}/*nav模块不固定宽度*/

.content{min-height:100px}/*为防止之后的调整窗口大小是出现影响视觉效果的问题,特设置最小高度*/

.content,.header{display:-webkit-box/*为content,header部分也添加box的展示模式*/}

.nav{-webkit-box-flex:1}

.con2{-webkit-box-flex:1}

.con1{width:200pxbackground:#f99}/*固定宽度,高度不定*/

.con2{min-width:200pxbackground:#999}/*同上的min-height*/

.con3{width:100pxbackground:#9f9}/*固定宽度,高度不定*/

.footer{height:50pxmin-width:500pxbackground:#ccc}/*固定高度*/

 </style>

 <link href="" style="text/css" rel="stylesheet"/>

</head>

<body>

 <div class="header">

<div class="logo">logo部分,宽高固定</div>

<div class="nav">nav部分,高度固定,宽度自适应</div>

 </div>

 <div class="content">

<div class="con1">内容初始化第1模块</div>

<div class="con2">内容初始化第2模块</div>

<div class="con3">内容初始化第3模块</div>

 </div>

 <div class="footer">底部,宽度不定,高度固定</div>

</body>

</html>