【问题标题】:Dealing with flexbox and container shrinking to the width of contents处理 flexbox 和容器缩小到内容的宽度
【发布时间】:2018-01-27 04:57:01
【问题描述】:

如何将容器保持在我指定的宽度,使其不会缩小到其弹性项目的宽度?

我注意到去掉“flex-center”类可以有效地保持容器的宽度,但元素没有居中

——我设法通过删除“flex-center”、将“.subscribe”的显示更改为阻止并使用自动边距将其居中来解决问题,但是有没有办法可以将所有这些元素保留在弯曲?

示例: https://jsfiddle.net/krv9z0co/6/

.flex-center {
  display: flex;
  justify-content: center;
}

.container {
  max-width: 600px;
  padding-left: 20px;
  padding-right: 20px;
}

.subscribe {
  display: flex;
  flex-direction: column;
}

.s__text {
  text-align: center;
}

.subscribe__input,
.subscribe__button {
  width: 200px
}
<section class="flex-center">
  <div class="subscribe container">
    <div class="sub__head">
      <h3 class="s__text">Subscribe</h3>
      <p class="s__text">Be the first to know about the new templates.</p>
    </div>
    <div class="sub__move">
      <input type="text" class="subscribe__input sub__block" placeholder="Your Email">
      <input type="submit" value="SUBSCRIBE" class="subscribe__button">
    </div>
  </div>
</section>

【问题讨论】:

    标签: html css flexbox


    【解决方案1】:

    弹性项目的默认flex-shrink 值为1。这意味着它被设置为收缩以适应它的父级。

    如果您将flex-shrink: 0; 添加到container,它将保持其宽度。

    Updated fiddle

    堆栈sn-p

    .flex-center {
      display: flex;
      justify-content: center;
    }
    
    .container {
      max-width: 600px;
      padding-left: 20px;
      padding-right: 20px;
      flex-shrink: 0;                  /*  added  */
    }
    
    .subscribe {
      display: flex;
      flex-direction: column;
    }
    
    .s__text {
      text-align: center;
    }
    
    .subscribe__input,
    .subscribe__button {
      width: 200px
    }
    <section class="flex-center">
      <div class="subscribe container">
        <div class="sub__head">
          <h3 class="s__text">Subscribe</h3>
          <p class="s__text">Be the first to know about the new templates.</p>
        </div>
        <div class="sub__move">
          <input type="text" class="subscribe__input sub__block" placeholder="Your Email">
          <input type="submit" value="SUBSCRIBE" class="subscribe__button">
        </div>
      </div>
    </section>

    根据评论更新。

    在填充其父级宽度时,弹性行项目与普通的 div 不同,后者的行为更像 inline-block 并根据其内容进行调整。

    因此,如果您希望container 更像block 元素(尝试填充其父元素的宽度),请同时添加flex-grow: 1

    Updated fiddle 2

    堆栈 sn-p 2

    .flex-center {
      display: flex;
      justify-content: center;
    }
    
    .container {
      max-width: 600px;
      padding-left: 20px;
      padding-right: 20px;
      flex-shrink: 0;                  /*  added  */
      flex-grow: 1;                    /*  added  */
    }
    
    .subscribe {
      display: flex;
      flex-direction: column;
    }
    
    .s__text {
      text-align: center;
    }
    
    .sub__move {                       /*  keep this if to center input/button  */
       text-align: center;
    }
    
    .subscribe__input,
    .subscribe__button {
      width: 200px
    }
    <section class="flex-center">
      <div class="subscribe container">
        <div class="sub__head">
          <h3 class="s__text">Subscribe</h3>
          <p class="s__text">Be the first to know about the new templates.</p>
        </div>
        <div class="sub__move">
          <input type="text" class="subscribe__input sub__block" placeholder="Your Email">
          <input type="submit" value="SUBSCRIBE" class="subscribe__button">
        </div>
      </div>
    </section>

    根据评论更新 2。

    如果您还希望内容开始换行,就像使用 display: block 时所做的那样,您需要让弹性项目再次收缩,然后简单地删除 flex-shrink: 0

    Updated fiddle 3

    堆栈 sn-p 3

    .flex-center {
      display: flex;
      justify-content: center;
    }
    
    .container {
      max-width: 600px;
      padding-left: 20px;
      padding-right: 20px;
      flex-grow: 1;                    /*  added  */
    }
    
    .subscribe {
      display: flex;
      flex-direction: column;
    }
    
    .s__text {
      text-align: center;
    }
    
    .sub__move {                       /*  keep this if to center input/button  */
       text-align: center;
    }
    
    .subscribe__input,
    .subscribe__button {
      width: 200px
    }
    <section class="flex-center">
      <div class="subscribe container">
        <div class="sub__head">
          <h3 class="s__text">Subscribe</h3>
          <p class="s__text">Be the first to know about the new templates.</p>
        </div>
        <div class="sub__move">
          <input type="text" class="subscribe__input sub__block" placeholder="Your Email">
          <input type="submit" value="SUBSCRIBE" class="subscribe__button">
        </div>
      </div>
    </section>

    【讨论】:

    • 不幸的是,容器似乎仍然保持内容的宽度。我希望容器保持 600px 宽度。我已经看到 flex-shrink 在类似情况下提到了很多。我可能会忽略它。谢谢!
    • @tkss 稍微更新了我的答案,以更好地解释 Flexbox 的工作原理。
    • 哇,我真的很感激!这对我帮助很大,谢谢!!
    【解决方案2】:

    Flexbox 总是将其布局应用于直接子级。从 .flex-container 中移除 display flex。并在 .container 类中添加 margin: auto 和 text-align: center 。希望它能解决问题。

    .flx-center {
        
        
    }
    
    .container{
        max-width: 600px;
        padding-left: 20px;
        padding-right: 20px;
        margin: auto; 
        text-align: center;
    }
    
    .subscribe{
      display: flex;
       flex-direction: column;
    }
    
    .s__text{
      text-align: center;
    }
    
    .subscribe__input,
    .subscribe__button{
      width: 200px
    }
    <section class="flx-center">
            <div class="subscribe container">
                <div class="sub__head">
                    <h3 class="s__text">Subscribe</h3>
                    <p class="s__text">Be the first to know about the new templates.</p>
                </div>
                <div class="sub__move">
                    <input type="text" class="subscribe__input sub__block" placeholder="Your Email">
                    <input type="submit" value="SUBSCRIBE" class="subscribe__button">
                </div>
            </div>
        </section>

    【讨论】:

    • 谢谢,我最终得出了类似的结论,但感觉很奇怪,因为使用 flex-center 保持相同的结构,然后用容器包装它,对于我的其余代码来说效果很好。至少它可以工作!
    猜你喜欢
    • 2017-12-16
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2022-11-03
    • 2016-06-10
    相关资源
    最近更新 更多