gpt4 book ai didi

html - flex 盒布局 : shrink and grow at the same time

转载 作者:行者123 更新时间:2023-11-28 05:16:32 24 4
gpt4 key购买 nike

我正在努力使用 flexbox 制作一个简单的布局。

布局:两个 div。

  1. 宽度小于 300 像素 - 它们应该堆叠在一起并占据所有可用空间。
  2. 宽度超过 300 像素 - 它们应该各占宽度的 50%。
  3. 如果一个 div 不包含任何内容 - 它不应该占据任何空间(基本上它应该被隐藏)并且剩余的 div 应该占据所有可用空间。

我在下面尝试过这种安排但失败了。在这个例子中,第二个 block 是错误的,那么每个 block 应该占据“一行”的 50%。我尝试了一些其他变体 - 似乎都不起作用。

.container {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-around;
}

.div1, .div2 {
flex-grow: 1;
flex-shrink: 1;
flex-basis: 50%;
}

.div1 {
background-color: red;
}

.div2 {
background-color: green;
}
<div class="container" style="width: 250px;">
<div class='div1'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>

<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>

<hr/>
<div class="container" style="width: 1000px;">
<div class='div1'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>

<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>

<hr/>
<div class="container" style="width: 1000px;">
<div class='div1'>
</div>

<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>

最佳答案

this answer 中提供了解决此问题的好方法通过@LGSon。

正如答案所指出的,关键是给每个元素 flex-grow: 1

这就是它起作用的原因:

这些是问题的要求:

  1. 两个 flex 元素
  2. 在小屏幕上,它们应该堆叠成一列
  3. 在大屏幕上,他们应该以 50/50 的比例排成一排
  4. 如果一个元素没有内容,它不应该占用空间,另一个应该占用所有空间

flex :1 1 50%

这是问题中的尝试解决方案:

.div1, .div2 {
flex-grow: 1;
flex-shrink: 1;
flex-basis: 50%;
}

此代码无法运行,因为它不满足要求 #4。 Flex 元素将平均共享可用空间 (flex-grow: 1),after 它们各自的大小为 50% 宽度(flex -基础:50%)。

由于当两个元素为 50/50 时没有剩余可用空间,flex-grow 无效,元素将始终为 50/50,无论内容如何。

注意 flex-basis 属性是 per spec guidelines ,在 flex-growflex-shrink 分配任何可用空间之前首先呈现。

.container {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-around;
}

.div1,
.div2 {
flex-grow: 1;
flex-shrink: 1;
flex-basis: 50%;
}

.div1 {
background-color: red;
}

.div2 {
background-color: green;
}
<div class="container" style="width: 250px;">
<div class='div1'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>
<hr/>
<div class="container" style="width: 1000px;">
<div class='div1'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>
<hr/>
<div class="container" style="width: 1000px;">
<div class='div1'>
</div>
<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>


flex: 1

使用 flex: 1 也不起作用。这相当于:

  • flex 增长:1
  • flex-shrink: 1
  • flex 基础:0

因为 flex 元素的初始大小为 flex-basis: 0,所以所有容器空间均等分配。同样,这违反了要求 #4,因为无论内容如何,​​这两项都是 50/50。

.container {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-around;
}

.div1,
.div2 {
flex: 1;
}

.div1 {
background-color: red;
}

.div2 {
background-color: green;
}
<div class="container" style="width: 250px;">
<div class='div1'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>
<hr/>
<div class="container" style="width: 1000px;">
<div class='div1'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>
<hr/>
<div class="container" style="width: 1000px;">
<div class='div1'>
</div>
<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>


flex :自动

这是唯一有效的解决方案。它分解为:

  • flex 增长:1
  • flex-shrink: 1
  • flex 基础:自动

这基本上是说:

  • 每个 flex 元素的初始大小是内容的大小。
  • 一旦确定了尺寸,flex-grow 就可以进入图片以分配剩余空间。

由于没有内容的元素的初始大小为零,这允许第二个元素占据行中的所有空间。

我引用的答案使用 flex-grow: 1 而不是 flex: auto。这具有相同的效果,因为 flex-shrink: 1flex-basis: auto 是默认值。

.container {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-around;
}

.div1,
.div2 {
flex: auto;
}

.div1 {
background-color: red;
}

.div2 {
background-color: green;
}
<div class="container" style="width: 250px;">
<div class='div1'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>
<hr/>
<div class="container" style="width: 1000px;">
<div class='div1'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>
<hr/>
<div class="container" style="width: 1000px;">
<div class='div1'>
</div>
<div class='div2'>
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
</div>
</div>


更多信息

关于html - flex 盒布局 : shrink and grow at the same time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44860211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com