美文网首页js css html
【转载】flex:1不等分的问题

【转载】flex:1不等分的问题

作者: 优秀的收藏转载分享 | 来源:发表于2022-08-08 15:26 被阅读0次

原文: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>

但是上述代码实现的效果:


image.png

都是flex:1,为啥第一个item会更宽一些呢?看起来就是那个padding导致的效果。可是按照我们平时的使用来看,flex:1应该均等分配空间才对。难道是因为box-sizing的原因,那么就给item加上box-sizing:border-box:


image.png
可以看到,高度上确实起作用了,但是宽度上似乎并没有起到作用。第一个的宽度上还是被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其实是这三个属性的简写,具体的网上到处都有。这里按下不表。


image.png

这里分析下,为啥子元素不设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不等分的问题

    原文:flex:1不等分的问题[https://blog.csdn.net/weixin_42349568/art...

  • flex布局

    1.flex-grow属性 如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一...

  • Expanded与FractionallySizedBox的选择

    Expanded:等分组件 flex来设置比例,父组件必须是Flex,Row,ColumnFractionally...

  • 移动端/问题

    均等分問題 核心原因: 分辨率不同,安卓手机底部普遍含有虚拟导航栏解决办法: 外框flex布局,flex:1可以自...

  • electron一些小坑

    1.flex布局问题在浏览器中使用flex:1实现自适应布局没有问题,但在electron中设置flex:1的子元...

  • 记flex布局坑(包括IE11中)

    IE11中 flex:1不生效 ie11中的flex-grow默认0,也就是flex:1 = flex:1 1 0...

  • React Native 开发中遇到的问题记录

    1.ScrollView的高度问题,在使用ScrollView时,一般不直接设置高度,而是设置{flex: 1},...

  • 2019年9月前端面试汇总

    1. flex实现骰子5点布局(答案不唯一) 简单的思路:1.flex布局横向排列,flex-flow:wrap ...

  • Flex 布局 对齐 等分 均分 详解

    寻根溯源话布局 一切都始于这样一个问题:怎样通过 CSS 简单而优雅的实现水平、垂直同时居中。记得刚开始学习 CS...

  • Flex布局

    转载自 阮一峰Flex 布局教程:语法篇Flex 布局教程:实例篇

网友评论

    本文标题:【转载】flex:1不等分的问题

    本文链接:https://www.haomeiwen.com/subject/nlvwwrtx.html