flex布局,子元素宽度超出父元素问题及解决方案

785 阅读2分钟

一:问题背景

工作中需要写一个文章列表,左侧固定放一个宽高固定的图片,右侧显示文章的基本信息(标题,简介,具体信息等。这里不做过多的描述),简介的内容,超出部分显示省略号(···),使用flex布局实现,会出现如下问题。

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>flex布局问题</title>
</head>
<body>
    <div class="content">
        <div class="box-left"></div>
        <div class="box-right">
            <div>title</div>
            <div class="des">内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多内容超级多</div>
            <div class="info">info</div>
        </div>
    </div>
</body>
<style>
    .content{
        display: flex;
        flex-direction: row;
        justify-items: start;
        width: 1000px;
        height: 100px;
        padding: 10px;
        background: #f7f7f7;
    }
    .box-left{
        width: 130px;
        height: 100px;
        background: red;
        flex: none;
    }
    .box-right{
        flex: 1;
        padding: 10px;
        /* width: 0px; */
    }
    .des{
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
    }
</style>
</html>

二:解决方案

给子元素设置width:0;就可以达到效果。

 .box-right{
        flex: 1;
        padding: 10px;
        width: 0px;
    }

三:问题原因&原理

要理解出现这个现象的原因,就需要理解flex布局中flex:1的意义。

flex是flex-grow,flex-shrink和flex-basis这三个属性的结合。

flex-grow 属性定义了项目的放大比例,默认为0,即如果存在剩余空间,也不放大。 控制了弹性盒子中各个项目在剩余空间分配上的比例。

flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。

flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。默认值为 auto。

flex:1 是flex属性的简写形式,完整的写法是:flex-grow:1;flex-shrink:1,flex-basis:0%;

而出现这种情况的原因是,当子元素的内容是自动宽度时,flex-basis 会默认为 auto,这意味着子元素会尽可能地撑开以容纳其内容。我们可以使用 min-width: 0;或者width:0 来解决。这样就将 flex-basis 设置为0,子元素在分配剩余空间之前不占据任何空间。所以即使子元素的内容很多,也会被限制在父元素的范围内,而不会再溢出。