【问题标题】:Text is resizing flexbox children instead of wrapping (with flex-grow) [duplicate]文本正在调整 flexbox 子项的大小而不是换行(使用 flex-grow)[重复]
【发布时间】: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;
  }
}

【问题讨论】:

    标签: html css flexbox


    【解决方案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 很重要
    猜你喜欢
    • 1970-01-01
    • 2015-11-26
    • 2022-01-17
    • 2016-04-11
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多