【问题标题】:prevent grid from overflowing inside flexbox防止网格在 flexbox 内溢出
【发布时间】:2018-04-25 01:38:28
【问题描述】:

我不确定为什么图片会占用这么多空间并导致溢出。如果将 imgs 替换为文本,它看起来很好。

for (let i = 0; i < 15; i++)
{
  $("#grid").append(`
    <div class="item">
      <img src="http://via.placeholder.com/150x350" />
    </div>
  `);  
}
.flex {
  border: 1px solid black;
  display: flex;
  flex-direction: column;
  height: 100vh;
}
.footer {
  height: 20%;
}
.upper {
  flex: 1;
  overflow: auto;
}

#grid {
  border: 1px solid black;
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr;
  height: 100%;
  position: relative;
  max-width: 100%;

}

.item {
  display: inline-block;
  text-align: center;
}

img {
  max-height: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
<div class="flex">
  <div class='upper'>
    <div id="grid">
    </div>  
  </div>
  <div class="footer">
    footer
  </div>
</div>

【问题讨论】:

    标签: html css flexbox css-grid


    【解决方案1】:

    这里的问题是:

    • #grid 上的height: 100%border: 1px 结合使用,但不使用box-sizing: border-box

    • itemimage 上的经典内联空白

    修复:

    • #grid 上添加box-sizing: border-box(或使用计算,height: calc(100% - 2px)

    • item 上删除inline-block 并在img 上添加display: block

    为了图像的居中,作为一个块,我还添加了margin: 0 auto并删除了text-align: center,因为它已经没有效果了。

    堆栈sn-p

    for (let i = 0; i < 15; i++)
    {
      $("#grid").append(`
        <div class="item">
          <img src="http://via.placeholder.com/150x350" />
        </div>
      `);  
    }
    .flex {
      border: 1px solid black;
      display: flex;
      flex-direction: column;
      height: 100vh;
    }
    .footer {
      height: 20%;
    }
    .upper {
      flex: 1;
      overflow: auto;
    }
    
    #grid {
      border: 1px solid black;
      display: grid;
      grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
      grid-template-rows: 1fr 1fr 1fr;
      height: 100%;
      position: relative;
      max-width: 100%;
      box-sizing: border-box;                  /*  added  */
    }
    
    .item {
      /*display: inline-block;                     removed  */
      /*text-align: center;                        removed  */
    
      min-height: 0;                           /*  Firefox fix  */
    }
    
    img {
      display: block;                          /*  added  */
      margin: 0 auto;                          /*  added  */
      max-height: 100%;
      max-width: 100%;           /*  might want this too  */
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
    </script>
    <div class="flex">
      <div class='upper'>
        <div id="grid">
        </div>  
      </div>
      <div class="footer">
        footer
      </div>
    </div>

    【讨论】:

    • 我正在使用 Vue,但我不确定为什么它完全忽略了我设置的 max-height。我将不得不继续涉足它。
    • @A.Lau 如果您跟进 Vue 使用/设置的样式,您可能会发现它,不过,我给出的答案显示了滚动出现的原因。如果你有一个使用 Vue 的工作示例的链接,我会看看。
    • 我会尝试对出现这个奇怪问题的部分进行公开回购
    • 问题是,我正在尝试制作纸牌游戏,所以我希望网格将它们均匀地隔开,同时将另一个 div 放入其中,使其与图像一样大,而顶部有一些文字(使用position: absolute
    • 我决定提出一个新问题,因为这个问题有点模棱两可,并且已经有了答案。 stackoverflow.com/questions/47255747/…
    【解决方案2】:

    这是缩小包含具有固有尺寸(例如图像)元素的网格项目的一种方法 - 同时保持纵横比

    img { object-fit: contain; }
    

    for (let i = 0; i < 15; i++)
    {
      $("#grid").append(`
        <div class="item">
          <img src="http://via.placeholder.com/150x350" />
        </div>
      `);  
    }
    .flex {
      border: 1px solid black;
      display: flex;
      flex-direction: column;
    }
    .footer {
      height: 20%;
    }
    .upper {
      flex: 1;
      overflow: auto;
    }
    
    #grid {
      border: 1px solid black;
      display: grid;
      grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
      grid-template-rows: 1fr 1fr 1fr;
      height: 100%;
      position: relative;
      max-width: 100%;
    }
    
    .item {
      display: inline-block;
      text-align: center;
    }
    
    img {
      max-height: 100%;
      max-width: 100%;
      object-fit: contain;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
    </script>
    <div class="flex">
      <div class='upper'>
        <div id="grid">
        </div>  
      </div>
      <div class="footer">
        footer
      </div>
    </div>

    【讨论】:

    【解决方案3】:

    您可以使用图片作为背景,这样更容易控制和避免溢出。另外不要忘记高度计算中的边框,因此您可以添加box-sizing:border-box

    for (let i = 0; i < 15; i++) {
      $("#grid").append(`
        <div class="item" style="background-image:url(http://via.placeholder.com/150x350)">
         
        </div>
      `);
    }
    .flex {
      border: 1px solid black;
      display: flex;
      flex-direction: column;
      height: 100vh;
    }
    
    .footer {
      height: 20%;
    }
    
    .upper {
      flex: 1;
      overflow: auto;
    }
    
    #grid {
      border: 1px solid black;
      display: grid;
      grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
      grid-template-rows: 1fr 1fr 1fr;
      height: 100%;
      position: relative;
      max-width: 100%;
      box-sizing:border-box;
    }
    
    .item {
      display: inline-block;
      text-align: center;
      background-size: auto 100%;
      background-position:center;
      background-repeat:no-repeat;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
    </script>
    <div class="flex">
      <div class='upper'>
        <div id="grid">
        </div>
      </div>
      <div class="footer">
        footer
      </div>
    </div>

    【讨论】:

    • 我一般不希望溢出,这就是为什么我希望 img 的高度基于网格。
    • 啊对了,用img做背景,怎么会忘记,我去试一试。
    猜你喜欢
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多