CSS3中的弹性框布局Flexbox可以实现的效果有哪些?

html-css08

CSS3中的弹性框布局Flexbox可以实现的效果有哪些?,第1张

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>

既然楼主说是弹性盒,那就用弹性盒的相关术语来进行分析。

首先分析图片,一个大容器中包含三个项目,你会发现单纯的给容器加一个display:flex的声明是不可以的,因为这个声明默认容器内的项目在一行显示,并且不会溢出。

那么我们就需要一个声明让项目遇到容器边界时自动换行,就是flex-wrap: wrap这个声明。

换行之后你会发现项目与容器的边界是挨在一起的,从图中明显可以看出项目div1在主轴上是居中显示的,三个项目在交叉轴上又是居中,那么

justify-content: space-around表示 自动分配距离,每个项目两侧的间隔相等。

align-items: center表示交叉轴居中。

参考代码如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title></title>

<style type="text/css">

html,body{margin:0padding:0}

.box{width:500pxheight:500pxborder:1px solid #faamargin:50px auto

display:flex

flex-wrap: wrap

justify-content: space-around

align-items: center

}

.box div:nth-child(1){width:450pxheight:200pxborder:1px solid #faa}

.box div:nth-child(2){width:200pxheight: 150pxborder:1px solid #faa}

.box div:nth-child(3){width: 150pxheight:100pxborder:1px solid #faa}

</style>

</head>

<body>

<div class="box">

<div>1</div>

<div>2</div>

<div>3</div>

</div>

</body>

</html>

或者第二个参考代码如下

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title></title>

<style type="text/css">

html,body{margin:0padding:0}

.box{width:600pxheight:500pxborder:1px solid #faamargin:50px auto

padding:10px

display:flex

flex-wrap: wrap

justify-content: space-between

align-items: center

}

.box div:nth-child(1){width:600pxheight:200pxborder:1px solid #faa}

.box div:nth-child(2){width:260pxheight: 150pxborder:1px solid #faa}

.box div:nth-child(3){width: 200pxheight:100pxborder:1px solid #faa}

</style>

</head>

<body>

<div class="box">

<div>1</div>

<div>2</div>

<div>3</div>

</div>

</body>

</html>

flex 大致分为两类属性:容器属性和项目属性(容器内部项目的属性)。flex 属性( flex:1 )如就给容器内部项目设置的属性。

这里的 wrap 指容器,item 我们称作项目。我们还需要知道 flex 属性是 flex-grow , flex-shrink 和 flex-basis 的简写,默认值为 0 1 auto 。后两个属性可选。接下来我们逐一介绍这三个属性:

flex grow 属性设置 flex 容器中的 ** 可用空间 ** 应分配给该项的大小。如果所有同级项目都具有相同的值,则所有项目将获得相同的可用空间份额,否则将根据定义的不同比率进行分配。

从左到右三个红色方块的宽度依次为 48.5 + 97 + 48.5 = 194,加上 6 个边框刚好 200。三个 item 按照 1:2:1 的比例占满了容器。上面我们并没有给 item 添加宽度,如果我们给它们加上 width 会怎么计算呢?

我们通过控制台查看三个 item 的宽度从左到右依次是 61 + 72 + 61 = 194,加上 6 个边框刚好 200。但是三个元素并不是按照 1:2:1 的比例分配的。这是为什么呢?仔细看定义后知道,我们给 wrap 设置了 width 为 200px,三个 item 设置了 50px,所以剩余的是 50px。剩余的 50px 按照 1:2:1 的比例又分别分配给了三个 width 为 50px 的 item。 注意这个比例是剩余空间分配的分配比例,而不是分配后元素自身的比例。

设置项目的收缩比例,如果空间不足,该项目将缩小。

默认值为 1。

设置或检索弹性盒伸缩基准值。如果所有子元素的基准值之和大于剩余空间,则会根据每项设置的基准值,按比率伸缩剩余空间。

flex 属性是 flex-grow, flex-shrink 和 flex-basis 的简写。