文本正在调整 flexbox 子项的大小而不是换行(使用 flex-grow)[重复]

Posted

技术标签:

【中文标题】文本正在调整 flexbox 子项的大小而不是换行(使用 flex-grow)[重复]【英文标题】:Text is resizing flexbox children instead of wrapping (with flex-grow) [duplicate] 【发布时间】:2019-07-01 22:32:12 【问题描述】:

我正在使用 flex-grow 和媒体查询来尝试创建一个简单且响应迅速的网站。但是,文本似乎不是换行,而是调整其所在的包含 div 的大小并抵消其他所有内容。有谁知道为什么会这样?

我认为这种行为与我使用 flex-grow 的事实有关。我尝试过设置最小/最大宽度,还尝试了各种不同的自动换行属性,但都没有运气。

这是我的代码:

jsFiddle

<div id="container">
  <div id="title">
    <h1>Title</h1>
  </div>
  <div class="work" id="motion">
    <h2>Sub</h2>
  </div>
  <div class="work" id="print">
    <h2>Sub</h2>
  </div>
  <div class="work" id="interaction">
    <h2>Sub</h2>
  </div>
</div>
* 
  margin: 0;
  padding: 0;


html,
body 
  height: 100%;
  width: 100%;


h1,
h2,
h3,
h4,
h5,
h6,
p 
  font-family: sans-serif;
  font-weight: normal;
  max-width: 100%;


#container h1,
h2 
  padding: 1rem;


#container 
  height: 100%;
  display: flex;
  flex-direction: row;


#title 
  background-color: red;
  flex-grow: 2;
  margin: 1em;
  min-height: 15em;


.work 
  margin: 1em;
  flex-grow: 1;
  background-color: gray;
  min-width: 4em;


#motion,
#print,
#title 
  margin-right: 0;
  margin-bottom: 1em;


#interaction 

@media only screen and (max-width: 1020px) 
  body 
    background-color: blue;
  
  #container 
    flex-direction: column;
    flex-wrap: wrap;
    height: 100%;
  
  #motion,
  #print 
    margin-right: 1em;
    margin-bottom: 0;
  
  .work 
    min-height: 10em;
  
  #title 
    height: 100%;
  


@media only screen and (max-width: 600px) 
  body 
    background-color: yellow;
  
  #motion,
  #print,
  #title 
    margin-right: 1em;
    margin-bottom: 0;
  
  #container 
    flex-wrap: nowrap;
  

【问题讨论】:

【参考方案1】:

您的 flexbox 子级没有设置任何宽度,因此当您拥有更多文本内容时,这些 div 会增长。

jsFiddle

您可以添加如下内容:

    #container > div 
      width: calc(25% - 2em); /* Minus 2 em for the 1em margin on left and right */
    

@media only screen and (max-width: 1020px) 
     #container>div 
        width: calc(33% - 2em);
      


@media only screen and (max-width: 600px) 
     #container>div 
        width: calc(100% - 2em);
      

* 
  margin: 0;
  padding: 0;


html,
body 
  height: 100%;
  width: 100%;


h1,
h2,
h3,
h4,
h5,
h6,
p 
  font-family: sans-serif;
  font-weight: normal;
  max-width: 100%;


#container h1,
h2 
  padding: 1rem;


#container 
  height: 100%;
  display: flex;
  flex-direction: row;


#container>div 
  width: calc(25% - 2em);


#title 
  background-color: red;
  flex-grow: 2;
  margin: 1em;
  min-height: 15em;


.work 
  margin: 1em;
  flex-grow: 1;
  background-color: gray;
  min-width: 4em;


#motion,
#print,
#title 
  margin-right: 0;
  margin-bottom: 1em;


#interaction 

@media only screen and (max-width: 1020px) 
  body 
    background-color: blue;
  
  #container 
    flex-direction: column;
    flex-wrap: wrap;
    height: 100%;
  
  #container>div 
    width: calc(33% - 2em);
  
  #motion,
  #print 
    margin-right: 1em;
    margin-bottom: 0;
  
  .work 
    min-height: 10em;
  
  #title 
    height: 100%;
  


@media only screen and (max-width: 600px) 
  body 
    background-color: yellow;
  
  #motion,
  #print,
  #title 
    margin-right: 1em;
    margin-bottom: 0;
  
  #container 
    flex-wrap: nowrap;
  
  #container>div 
    width: calc(100% - 2em);
  
<div id="container">
  <div id="title">
    <h1>Title</h1>
  </div>
  <div class="work" id="motion">
    <h2>Sub Sub Sub Sub Sub Sub Sub Sub Sub Sub </h2>
  </div>
  <div class="work" id="print">
    <h2>Sub</h2>
  </div>
  <div class="work" id="interaction">
    <h2>Sub</h2>
  </div>
</div>

【讨论】:

当然,我犯了明显的错误。这如何与 flex-grow 一起使用?我还能用它把整个身体分成几部分吗? flex-grow 将指示在孩子之间分配多少 剩余 空间。 fromthis guide on flexbox"如果所有项目的 flex-grow 设置为 1,则容器中的剩余空间将平均分配给所有子项。如果其中一个子项的值为 2,则剩余空间将占用空间是其他空间的两倍(或者它会尝试,至少)。”。在您的情况下,您不应该有任何剩余空间,因为我们已经为您的 flex 子项设置了一个基于百分比的宽度,该百分比将等于 100%。 太棒了,谢谢 - 澄清一下:我应该完全删除 flex-grow 并将每个子 div 设置为 % 以便它们等于 100% 吗?另外,如何在我设置的 %s 中设置每个因素的边距?只要我使用calc() 包含它们就可以了吗? 边距不应计入百分比宽度。如果您在元素上设置了 box-sizing: border-box; (通常是 CSS 框架和重置样式表的一部分),则填充将。如果您不喜欢使用 calc 函数并且希望使用像 width: 25%; 这样的大小,您可以这样做 - 只需添加一个内部 div 包装器并将其填充设置为 flex 子级的边距,然后删除边距从孩子们那里。我将用一个例子来更新我的答案。此时您可以移除 flex grow。当您没有设置明确的宽度并且您的内容不是 100% 时,flex-grow 很重要

以上是关于文本正在调整 flexbox 子项的大小而不是换行(使用 flex-grow)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何为flexbox,row,no-wrap添加换行符?

flexbox 是不是可以通过文本换行捕捉到网格?

如何让 Flex 文本控件自动换行

当文本太多时,flexbox布局中的子项扩展到父项外部

连续两个项目没有调整大小 - flexbox [重复]

iPhone - 根据文本调整表格视图的大小