flex为1的父元素被子元素挤出屏幕怎么办?

简介: 【8月更文挑战第24天】flex为1的父元素被子元素挤出屏幕怎么办?

需求与问题描述

需求简介

在前端开发中,我们经常会遇到这样的布局:在一个容器中,排布有两个元素,A元素宽度固定,B元素宽度自适应,如下图:
image.png
我们的CSS也能随手捏来

<div class="card-content-wrap">
    <div class="left">左边元素固定宽度308px------------------</div>
    <div class="right">
        右边元素flex:1
    </div>
</div>

<style lang="less" scoped>
.card-content-wrap {
   
   
    width: 1000px;
    border: 1px solid blue;
    display: flex;
    justify-content: space-between;
    .left {
   
   
        width: 308px;
        margin-right: 16px;
    }
    .right {
   
   
        flex: 1;
    }
}
</style>

上述代码中,我们使用flex: 1的属性让右边的元素占满了剩余空间

问题描述

在一些普通场景中,上述用法是完全没有问题的,但是,当这个自适应元素(父元素)内部有子元素且子元素宽度大于父元素时,问题就出现了。
子元素较宽,导致左侧固定元素被挤压:
image.png

<div class="card-content-wrap">
    <div class="left">左边元素固定宽度308px------------------</div>
    <div class="right">
        右边元素flex:1
      <div style="width: 920px; border: 1px #ff2d2d solid">
      子元素较大,导致左侧固定元素被挤压
      </div>
    </div>
</div>

子元素非常宽,导致左侧元素被挤压,右侧元素超出安全区域:
image.png

<div class="card-content-wrap">
    <div class="left">左边元素固定宽度308px------------------</div>
    <div class="right">
        右边元素flex:1
      <div style="width: 1220px; border: 1px #ff2d2d solid">
      子元素宽度过大,导致父元素被挤出屏幕
      </div>
    </div>
</div>

显然,上述的样式问题和我们期望的行为不一致,那么我们该如何优雅的解决这个问题呢?

解决方案

我们先说解决方案,在具体分析原因

使用overflow: hidden

给flex: 1的父元素设置overflow: hidden可以解决上述问题。但是如果需要父元素出现滚动条的情况,这种方式显然不合适。

<style lang="less" scoped>
.card-content-wrap {
   
   
    width: 1000px;
    border: 1px solid blue;
    display: flex;
    justify-content: space-between;
    .left {
   
   
        width: 308px;
        margin-right: 16px;
    }
    .right {
   
   
        flex: 1;
        overflow: hidden;
    }
}
</style>

image.png

使用width:0

这是最佳的解决方案。

<div class="card-content-wrap">
<style lang="less" scoped>
.card-content-wrap {
   
   
    width: 1000px;
    border: 1px solid blue;
    display: flex;
    justify-content: space-between;
    .left {
   
   
        width: 308px;
        margin-right: 16px;
    }
    .right {
   
   
        flex: 1;
        width: 0;
    }
}
</style>

image.png
且这种方式可以完美解决父元素需要出现滚动条的情况。

.right {
   
   
    flex: 1;
    width: 0;
    overflow: auto;
}

image.png

使用min-width:0

min-width:0的效果和width:0效果完全一致。

.right {
   
   
    flex: 1;
    min-width: 0;
    overflow: auto;
}

image.png

竖直方向的布局如何解决

对于竖直方向其实也存在相同的问题
image.png
解决方案其实和水平方向完全一致
设置overflow: hidden

.bottom{
   
   
  flex: 1;
  overflow: hidden;
}

或者设置height: 0

.bottom{
   
   
  flex: 1;
  height: 0;
}

或者设置min-height: 0

.bottom{
   
   
  flex: 1;
  min-height: 0;
}

问题原因

flex: 1 是 CSS 中用于弹性布局(Flexbox)的一个简写属性,它综合了 flex-grow、flex-shrink 和 flex-basis 三个属性的值。flex: 1 通常用于在容器内分配多余空间或者收缩元素以适应容器大小。

  • flex-grow:这个属性定义了元素的放大比例,即当容器有多余空间时,元素应该占据多少空间。默认值是 0,意味着元素不会放大来占据多余的空间。如果设置为 1 或更大的值,元素会尝试占用更多的空间,并且如果有多个元素都设置了 flex-grow,它们会根据各自的值按比例分配多余的空间。
  • flex-shrink:这个属性定义了元素的缩小比例,即当容器空间不足时,元素应该缩小多少。默认值是 1,意味着元素在必要时会缩小。如果设置为 0,元素将不会缩小,即使容器的空间不足。
  • flex-basis:这个属性定义了元素在分配多余空间之前的默认大小。它可以是像素值(例如 20px),也可以是百分比值,或者是 auto(默认值)。

当使用 flex: 1 时,你实际上是在设置:

  • flex-grow: 1:元素会尝试占据多余的空间。
  • flex-shrink: 1:元素在必要时会缩小。
  • flex-basis: 0%:元素的默认大小是 0,这意味着它会完全依赖 flex-grow 来分配空间。

基于上述基础知识,简单来说问题的原因就在于flex属性只是对父元素的多余空间按什么比例去分配,并不是按我们的理解意思为固定分配的方式,不会对子元素原本实际内容宽度进行处理!

浏览器默认为flex容器的子元素设置了 “min-width: auto;min-height: auto”,这意味着子元素的最小宽度和高度不能小于其内容的宽度和高度。

我们设置为min-width: 0,覆盖掉了其默认行为,即使其内容为空或者宽度很小,也可以使得flex子元素在flex容器中正确地布局。

相关文章
【奇技淫巧】实现flex布局中,单独某个元素挪到右侧、底部,与其他元素排列不同,就像是个另类。(主要是用到margin-left和align-self)
【奇技淫巧】实现flex布局中,单独某个元素挪到右侧、底部,与其他元素排列不同,就像是个另类。(主要是用到margin-left和align-self)
|
10月前
|
前端开发 算法 Java
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
294 1
|
10月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
Flex 布局 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 一、Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
568 0
CSS3 flex 布局在 wrap 换行模式下,让中间指定元素换行
CSS3 flex 布局在 wrap 换行模式下,让中间指定元素换行
1812 0
|
容器
在 Flex 布局中,如何设置元素在侧轴上的初始对齐方式?
【10月更文挑战第22天】同时,还可以进一步探索其他 Flex 布局相关的属性和技巧,以更好地掌握 Flex 布局的强大功能,创造出更具创意和适应性的页面布局。
527 2
|
前端开发
css flex布局两个元素水平居中垂直居中
css flex布局两个元素水平居中垂直居中
505 1
CSS3 【display: flex;】与【align-self: 可覆盖父元素设置的algin-items;】的使用
CSS3 【display: flex;】与【align-self: 可覆盖父元素设置的algin-items;】的使用
279 0
试试用flex处理直线和其他元素居中
试试用flex处理直线和其他元素居中
216 0
CSS3 【display: flex;】与【align-self: 可覆盖父元素设置algin-items;】的使用
CSS3 【display: flex;】与【align-self: 可覆盖父元素设置algin-items;】的使用
217 0
flex布局之容器元素属性
flex布局之容器元素属性