
给设置了display:flex的子组件设置了flex:1;就能让他填满整个容器,如果有多个就平均
flex:1;是另外三个样式属性的简写,等同
- flex-grow: 0;
- flex-shrink: 1;
- flex-basis: auto;
我们就针对上面3个属性结合代码来进行讲解
- .flex{
- display: flex;
- width: 300px;
- height: 300px;
- border:1px solid red
-
- }
- .flex-item{
- border:1px solid blue;
- /**
- 我们后面的css代码都放在这里
- **/
- }
- <body>
- <div class="flex">
- <div class="flex-item"></div>
- </div>
- </body>

为什么flex-item没有设置高度,但是他就等同容器交叉轴方向的高度呢
这是因为,display:flex;的容器默认设置了 align-items:stretch;设置了所有一级子元素在交叉轴方向的高度,如果给容器设置成align-items: flex-start;,就能看到没设置高度的子元素成了一个点,效果如下

因为子原始默认flex-grow为0,也就是即使有足够的空间,也不自动填充
- .flex-item{
- border:1px solid blue;
- flex-grow: 1;/*新增*/
- }

- .item2{
- background-color: pink;
- }
- <!DOCTYPE html>
- <html lang="en">
- <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>
- .flex{
- display: flex;
- width: 300px;
- height: 300px;
- border:1px solid red
-
- }
- .flex-item{
- border:1px solid blue;
- flex-grow: 1;
- }
- .item2{
- background-color: pink;
- }
- </style>
- </head>
- <body>
- <div class="flex">
- <div class="flex-item">1</div>
- <div class="flex-item item2" >2</div>
- </div>
- </body>
- </html>

答案
因为子元素设置了flex-grow:1;会根据子元素flex-grow的值来平均分配宽度,如果第二个设置了flex-grow:2;那第二个子元素,会占据1/3的宽度
- <!DOCTYPE html>
- <html lang="en">
- <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>
- .flex{
- display: flex;
- width: 300px;
- height: 300px;
- border:1px solid red
-
- }
- .flex-item{
- border:1px solid blue;
- width:120px;
- }
- .item2{
- background-color: pink;
- width:200px;
- }
- </style>
- </head>
- <body>
- <div class="flex">
- <div class="flex-item">1</div>
- <div class="flex-item item2" >2</div>
- </div>
- </body>
- </html>

因为flex容器的一级子元素默认允许缩放,也就是flex-shrink:1;我们把css代码样式改为
- .flex-item{
- border:1px solid blue;
- width:120px;
- flex-shrink: 0;/*新增*/
- }
这时候,那容器就超出父元素了
- .flex-item{
- border:1px solid blue;
- box-sizing: border-box;
- }
- .item2{
- background-color: pink;
- flex-basis:200px; /*新增代码*/
- width:100px;/*新增代码*/
- }

如果设置了width就读取width,否则子元素等于子元素自身的高度
其次子元素的宽度还会收到flex-grow和flex-shrink的影响
子元素嵌套display:flex的子元素容器,子元素容器背它的子元素撑大,导致文本超出无法显示省略号
代码
- <!DOCTYPE html>
- <html lang="en">
-
- <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>
- .flex {
- display: flex;
- width: 300px;
- height: 300px;
- border: 1px solid red
- }
-
- .flex-item {
- border: 1px solid blue;
- box-sizing: border-box;
- width: 100px;
-
- }
-
- .item2 {
- background-color: pink;
- flex-grow: 1;
- display: flex;
- }
-
- .innerbox {
- display: flex;
- flex: 1;
- outline: 2px solid brown;
- /* width: 100%; */
- }
-
- .innerbox .inner-item {
- /* width: 300px; */
- background-color: green;
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- -o-text-overflow: ellipsis;
-
- }
- </style>
- </head>
-
- <body>
- <div class="flex">
- <div class="flex-item">1</div>
- <div class="flex-item item2">
- <div class="innerbox">
- <div class="inner-item">
- 12121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212
- </div>
- </div>
- </div>
- </div>
- </body>
-
- </html>

给子元素容器添加width:100%或者overflew:hidden;
