flex 子元素超出父元素

400 阅读1分钟

1、问题描述

在flex布局中,如果设置子元素的flex:1;内容不自动折行或者不允许换行,如果内容过宽,此时子元素会超出父元素,具体效果如下:

image.png html

<div class="container">
    <div class="left">
        保哥学前端
    </div>
    <div class="right">
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    </div>
 </div>

css

.container {
    background-color: red;
    width: 300px;
    display: flex;
    align-items: flex-start;
    min-height: 200px;
}
.left {
    background-color: rosybrown;
    flex-shrink: 0;
}
.right {
    background-color: aqua;
    flex: 1;
}

2、问题分析

flex:1 含义解释,flex-grow:1;flex-shink:1;flex-basic: auto; mdn定义

image.png

左侧元素样式flex-shrink: 0;所以宽度为实际的宽度。 右侧元素样式设置为flex:1;期望撑满剩余的元素,但是实际情况并不是这样,这是什么原因呢,经排查是因为子元素min-size-auto引起的,w3c定义:

image.png

  1. 如果允许内容滚动为0
  2. 如果内容不允许滚动内容为content-based mininum size

content-based mininum size定义如下: image.png content-based mininum size是specified size suggestion,transferred size suggestion , content size suggestion 3个size其中之一,因未设置宽度信息,所为content size suggestion,根据定义为min-content size,所以右侧元素的实际宽度为内容的实际宽度

3、解决办法

依据content-based mininum size定义设置width,min-width即可

4、总结

flex为我们提供灵活的布局方式,但是最终都会转换为width,height等基础布局信息,因width,min-width的优先级导致上述问题的发生。

5、参考文档

  1. www.w3.org/TR/css-flex…