Flex 布局
参考资料:
https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox
https://www.bilibili.com/video/BV14J4114768?p=419
一、概述
Flexible Box 模型,通常被称为 flexbox,是一种一维的布局模型。它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力。
我们说 flexbox 是一种一维的布局,是因为一个 flexbox 一次只能处理一个维度上的元素布局,一行或者一列。
作为对比的是另外一个二维布局 CSS Grid Layout,可以同时处理行和列上的布局。
当使用 flex 布局时,首先想到的是两根轴线 — 主轴和交叉轴。主轴由 flex-direction
定义,另一根轴垂直于它。
Flex布局在移动端支持好,PC端支持不好。
二、Flex 容器
我们把一个容器的 display
属性值改为 flex
或者 inline-flex
。 完成这一步之后,容器中的直系子元素就会变为 flex 元素。所有CSS属性都会有一个初始值,所以 flex 容器中的所有 flex 元素都会有下列行为:
- 元素排列为一行 (
flex-direction
属性的初始值是row
)。 - 元素从主轴的起始线开始。
- 元素不会在主维度方向拉伸,但是可以缩小。
- 元素被拉伸来填充交叉轴大小。
flex-basis
属性为auto
。flex-wrap
属性为nowrap
。
这会让你的元素呈线形排列,并且把自己的大小作为主轴上的大小。如果有太多元素超出容器,它们会溢出而不会换行。如果一些元素比其他元素高,那么元素会沿交叉轴被拉伸来填满它的大小。
<head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div { margin: auto; width: 80%; height: 600px; background-color: aqua; display: flex; } span{ background-color: burlywood; height: 50px; margin: 20px; width: 100px; line-height: 50px; text-align: center; } </style> </head> <body> <div> <span>你好</span> <span>你好</span> <span>你好</span> </div> </body>
三、justify-content
justify-content
属性用来使元素在主轴方向上对齐,主轴方向是通过 flex-direction
设置的方向。初始值是flex-start
,元素从容器的起始线排列。但是你也可以把值设置为flex-end
,从终止线开始排列,或者center
,在中间排列.
你也可以把值设置为space-between
,把元素排列好之后的剩余空间拿出来,平均分配到元素之间,所以元素之间间隔相等。或者使用space-around
,使每个元素的左右空间相等。
在实例中尝试下列justify-content
属性的值:
stretch
flex-start
flex-end
center
space-around
space-between
四、align-items
align-items
属性可以使元素在交叉轴方向对齐。
这个属性的初始值为stretch
,这就是为什么flex元素会默认被拉伸到最高元素的高度。实际上,它们被拉伸来填满flex容器 —— 最高的元素定义了容器的高度。
你也可以设置align-items
的值为flex-start
,使flex元素按flex容器的顶部对齐, flex-end
使它们按flex容器的下部对齐, 或者center
使它们居中对齐. 在实例中尝试——我给出了flex容器的高度,以便你可以看到元素在容器中移动。看看如果更改 align-items的值为下列值会发生什么:
stretch
flex-start
flex-end
center
align-items:flex-end;
五、用flex-wrap实现多行Flex容器
六、align-content
七、简写属性 flex-flow
八、 flex 元素上的属性
<head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> /* .box { display: flex; align-content: center; width: 30%; height: 600px; flex-wrap: wrap; background-color: aqua; flex-flow: column nowrap; } .box > div { background-color: burlywood; margin: 20px; } */ .box{ width: 60%; display: flex; background-color: coral; } .box >div{ margin: 10px; } .box div:nth-child(1){ width: 50px; height: 50px; background-color: cornflowerblue; } .box div:nth-child(2){ flex:1; background-color:yellow; } .box div:nth-child(3){ flex:2; background-color:yellow; } .box div:nth-child(4){ width: 50px; height: 50px; background-color: cornflowerblue; } </style> </head> <body> <div class="box"> <div>1</div> <div>2</div> <div>3</div> <div>4</div> </div> </body>