当前位置:网站首页 > 后端开发 > 正文

flex:1不等分的问题

一,现象

我们常常使用flex布局,来实现等分。

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <style type="text/css"> .box{ 
    width: 100vw; height: 100vh; background: green; display: flex; flex-direction: row; justify-content: space-between; align-items: center; } .item{ 
    flex: 1; background: yellow; height: 200px; border: 2px solid #000000; } .test{ 
    padding: 40px; background-color: red; } </style> <body> <div class="box"> <span class="item test"></span> <span class="item"></span> <span class="item"></span> <span class="item"></span> </div> </body> <script type="text/javascript"> </script> </html> 

但是上述代码实现的效果:
在这里插入图片描述
都是flex:1,为啥第一个item会更宽一些呢?看起来就是那个padding导致的效果。可是按照我们平时的使用来看,flex:1应该均等分配空间才对。难道是因为box-sizing的原因,那么就给item加上box-sizing:border-box:
在这里插入图片描述
可以看到,高度上确实起作用了,但是宽度上似乎并没有起到作用。第一个的宽度上还是被padding撑开了。

二,原因分析

1,父容器flex布局,子元素不处理

先来看看基本的,没有flex等属性的时候,子元素默认的属性值是:

flex-grow: 0;//0的意思就是子元素不放大,这个属性规定了 flex-grow 项在 flex 容器中主轴方向上分配剩余空间的相对比例。 flex-shrink: 1;//flex 元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值。0时不缩小,值越大越缩小。 flex-basis: auto;//指定了 flex 元素在主轴方向上的初始大小。如果不使用 box-sizing 改变盒模型的话,那么这个属性就决定了 flex 元素的内容盒(content-box)的尺寸。并且当一个元素同时被设置了 flex-basis (除值为 auto 外) 和 width (或者在 flex-direction: column 情况下设置了height) , flex-basis 具有更高的优先级. 

注:因为flex:1其实是这三个属性的简写,具体的网上到处都有。这里按下不表。
在这里插入图片描述
这里分析下,为啥子元素不设flex的时候会是这个样子。

1,四个子元素的内容都为空,且conten-box并没有设置宽度值,所以内容盒子conten-box的宽度是0.flex-basis: auto;就基于这个内容设置了四个子元素宽度为0,因为它的优先级高于width。 2,这时候四个子元素默认宽度之和小于容器宽度,flex-shrink: 1;没有生效。 3,又因为flex-grow: 0;不进行放大处理。所以宽度就是0

三,实际原因

因为 依照 flex 的自动调整计算规范是不包含 padding 的。w3 规范这里的部分提到 flexItem 的可用空间要减去 margin、border、padding。所以想要均分的话,需要套个margin、border、padding一样的div。

到此这篇flex:1不等分的问题的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 封装组件系列-(一)-插槽及动态组件2024-11-30 12:54:07
  • base64和blob对图片的压缩2024-11-30 12:54:07
  • 控制文本保留几行,末尾省略2024-11-30 12:54:07
  • 浏览器打印2024-11-30 12:54:07
  • 封装组件系列-(二)-父子组件传值2024-11-30 12:54:07
  • nginx个人常用2024-11-30 12:54:07
  • vant组件二次封装-下拉刷新列表组件2024-11-30 12:54:07
  • uniapp某个页面高度占满写法2024-11-30 12:54:07
  • uniapp实现点击回到顶部2024-11-30 12:54:07
  • 实现滑动到中间变大的效果2024-11-30 12:54:07
  • 全屏图片