在前面的教程中,我们已经详细介绍了传统的布局方法包括浮动布局和position定位布局。然而传统的布局解决方案,是基于盒子模型,缺少灵活性,特别是当涉及到屏幕尺寸的变化时,标签的位置并不总是容易控制。于是,在2009年,W3C(万维网联盟)提出了一种新型的布局模式——Flex弹性布局。
1、Flex弹性布局
Flex弹性布局,英文全称为“Flexible Box Layout”,是一种当页面需要适应不同的屏幕大小以及设备时,确保标签拥有恰当的布局外观。相比于传统的布局方式,Flex布局更加灵活,易于调整,也更加适应不同的设备和屏幕尺寸。Flex布局通过使用CSS的“display:flex”或“display:inline-flex”属性来声明。这里需要注意的是,设为Flex弹性布局以后,容器内子标签的float、clear和vertical-align属性将失效。
(1)Flex弹性布局的基本概念
容器与项目:采用Flex弹性布局的标签,称为Flex容器,简称“容器”。它的所有子标签将自动成为容器成员,称为Flex项目,简称“项目”。
主轴与交叉轴:Flex容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴开始的位置称为主轴起始点,结束位置称为主轴结束点;交叉轴开始的位置称为交叉轴起始点,结束位置称为交叉轴结束点。
Flex容器的示意图如下:
(2)Flex弹性布局的主要属性
容器属性:
display:flex:将一个标签指定为Flex弹性容器。
flex-direction:定义主轴的方向(即项目的排列方向),flex-direction属性包括4个值:
-
row(默认值):主轴为水平方向,起点在左端。
-
row-reverse:主轴为水平方向,起点在右端。
-
column:主轴为垂直方向,起点在上沿。
-
column-reverse:主轴为垂直方向,起点在下沿。
flex-direction属性效果如下图所示:
flex-wrap:定义是否换行。flex-wrap属性包括3个值:
-
nowrap(默认):不换行。
-
wrap:换行,第一行在上方。
-
wrap-reverse:换行,第一行在下方。
flex-wrap属性效果如下图所示:
flex-flow:是flex-direction和flex-wrap的简写。写法如:flex-flow:row wrap。
justify-content:定义项目在主轴上的对齐方式,justify-content属性包括6个值:
-
flex-start(默认值):左对齐
-
flex-end:右对齐
-
center: 居中
-
space-between:两端对齐,项目之间的间隔都相等。
-
space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
-
space-evenly:项目与项目之间,项目与边框之间的间隔都相等。
justify-content属性效果如下图所示:
align-items:定义项目在交叉轴上的对齐方式,align-items属性包括5个值:
-
flex-start:交叉轴的起点对齐。
-
flex-end:交叉轴的终点对齐。
-
center:交叉轴的中点对齐。
-
baseline:项目的第一行文字的基线对齐。
-
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
align-items属性效果如下图所示:
align-content:定义多行项目在交叉轴上的对齐方式(类似align-items,但适用于多行情况。如果项目只有一行,该属性不起作用),align-content属性包括6个值:
-
flex-start:与交叉轴的起点对齐。
-
flex-end:与交叉轴的终点对齐。
-
center:与交叉轴的中点对齐。
-
space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
-
space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
-
stretch(默认值):轴线占满整个交叉轴。
align-content属性效果如下图所示:
项目属性:
order:定义项目的排列顺序。通过设置order属性值,改变子项目的排列顺序,可以是负值,且数值越小,排列越靠前,默认为0。比如order: -1比order: 1靠前排列。
flex-grow:定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有剩余空的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则flex-grow属性为2占据的剩余空间将比其他项目多一倍。
flex-shrink:定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,flex-shrink属性为0的项目不缩小。
flex-basis:定义了在分配多余空间之前,项目占据的主轴空间。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
flex:flex-grow 、 flex-shrink和flex-basis的简写,默认值为“flex: 0 1 auto”,后两个属性可选。
align-self:允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父标签的align-items属性,如果没有父标签,则等同于stretch。
下面是一个简单的Flex布局的示例:
动手练一练:
<!DOCTYPE html>
<html>
<!--head头部.用来完成一个网页的相关设置-->
<head>
<!--汉字编码-->
<meta charset="UTF-8">
<!--网页标题-->
<title>Flex弹性布局</title>
<style>
.flex-container1 {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
align-items: center;
}
.flex-container2 {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-end;
align-items: center;
}
.flex-container3 {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-items: center;
}
.flex-container4 {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
}
.flex-container5 {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-around;
align-items: center;
}
.flex-container6 {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-evenly;
align-items: center;
}
.flex-item {
width: 60px;
height: 60px;
margin: 10px;
}
</style>
</head>
<body>
<div class="flex-container1">
<div class="flex-item" style="background-color: cyan;">1</div>
<div class="flex-item" style="background-color: pink;">2</div>
<div class="flex-item" style="background-color: yellow;">3</div>
<div class="flex-item" style="background-color: green;">4</div>
</div>
<div class="flex-container2">
<div class="flex-item" style="background-color: cyan;">5</div>
<div class="flex-item" style="background-color: pink;">6</div>
<div class="flex-item" style="background-color: yellow;">7</div>
<div class="flex-item" style="background-color: green;">8</div>
</div>
<div class="flex-container3">
<div class="flex-item" style="background-color: cyan;">9</div>
<div class="flex-item" style="background-color: pink;">10</div>
<div class="flex-item" style="background-color: yellow;">11</div>
<div class="flex-item" style="background-color: green;">12</div>
</div>
<div class="flex-container4">
<div class="flex-item" style="background-color: cyan;">13</div>
<div class="flex-item" style="background-color: pink;">14</div>
<div class="flex-item" style="background-color: yellow;">15</div>
<div class="flex-item" style="background-color: green;">16</div>
</div>
<div class="flex-container5">
<div class="flex-item" style="background-color: cyan;">17</div>
<div class="flex-item" style="background-color: pink;">18</div>
<div class="flex-item" style="background-color: yellow;">19</div>
<div class="flex-item" style="background-color: green;">20</div>
</div>
<div class="flex-container6">
<div class="flex-item" style="background-color: cyan;">21</div>
<div class="flex-item" style="background-color: pink;">22</div>
<div class="flex-item" style="background-color: yellow;">23</div>
<div class="flex-item" style="background-color: green;">24</div>
</div>
</body>
</html>
上面的例子中,最外层共有6个Flex弹性容器,每个Flex弹性容器内层均有4个“.flex-item”子容器就是Flex项目。6个Flex弹性容器内的项目在主轴上的对齐方式均不相同,排列的效果也都不相同,在交叉轴方向上的对齐均采用了“居中”(align-items: center)。每个项目被设置为60像素的宽和高,并通过“margin:10px”设置10像素的外边距。从浏览器运行效果可以看出,当浏览器大小变化时,Flex弹性布局可以使容器内的项目自动调整其尺寸和对齐方式。
上述效果如下图所示:
2、Flex弹性布局的优点
简单易懂:与传统的布局方式相比,Flex弹性布局的语法和理解起来更加简单,容易上手。
弹性和自适应:Flex弹性布局能够自动适应不同尺寸的屏幕,让页面更具有弹性。
等高布局:Flex弹性布局可以方便地实现多列等高布局。
对齐和排序:Flex弹性布局支持各种对齐方式,包括水平和垂直对齐,并且可以通过设置order属性对子标签进行排序。
可以与传统布局结合使用:Flex弹性布局并不是完全取代传统的布局方式,它可以与传统布局方式结合使用,实现更灵活的布局效果。
总之,Flex弹性布局作为一种新的布局方式,相比于传统布局方式具有简洁、响应式、灵活的特点,逐渐受到了前端开发者的青睐。