【问题标题】:Maintain aspect ratio of elements within a fluid CSS grid layout在流畅的 CSS 网格布局中保持元素的纵横比
【发布时间】:2018-03-23 17:55:17
【问题描述】:

我有一个 4 列 CSS 网格布局中的 div 元素列表。 div 元素设置为 100% 宽度,顶部填充为 100% 以保持 1:1 的纵横比。这是一种常见的技术,可以在这里看到:https://stackoverflow.com/a/6615994/7949834

这适用于 Firefox,但不适用于 Chrome。在 Chrome 中,元素不占用网格容器内的任何空间。这是什么原因?

ul {
  border: 2px solid red;
  display: grid;
  grid-gap: 5%;
  grid-template-columns: auto auto auto auto;
  list-style-type: none;
}

div {
  background-color: green;
  padding-top: 100%;
  width: 100%;
}
<ul>
  <li>
    <div></div>
  </li>
  <li>
    <div></div>
  </li>
  <li>
    <div></div>
  </li>
  <li>
    <div></div>
  </li>
  <li>
    <div></div>
  </li>
  <li>
    <div></div>
  </li>
  <li>
    <div></div>
  </li>
  <li>
    <div></div>
  </li>
</ul>

https://jsfiddle.net/ab0asum3/

【问题讨论】:

    标签: html css fluid-layout css-grid


    【解决方案1】:

    似乎有两个问题:

    • auto 不是 grid-template-columns 的有效值 - 使用类似 1fr 的值
    • 当没有为lidiv 定义明确的高度时,使用grid-gap 的百分比值

    您需要为行间距使用像素值。

    ul {
      border: 2px solid red;
      display: grid;
      grid-gap: 10px 5%;
      grid-template-columns: repeat(4, 1fr);
      list-style-type: none;
      padding: 0;
      margin: 0;
    }
    
    div {
      background-color: green;
      padding-top: 100%;
      width: 100%;
    }
    <ul>
      <li>
        <div></div>
      </li>
      <li>
        <div></div>
      </li>
      <li>
        <div></div>
      </li>
      <li>
        <div></div>
      </li>
      <li>
        <div></div>
      </li>
      <li>
        <div></div>
      </li>
      <li>
        <div></div>
      </li>
      <li>
        <div></div>
      </li>
    </ul>

    【讨论】:

    • 我想你搞定了。谢谢。
    • 我自己还在学习 CSS Grid,所以我可能错了。在没有明确定义高度的其他元素上使用百分比 vakues 通常是有问题的。它似乎解决了这里的问题。
    【解决方案2】:

    /* change --grid-aspect-ratio to your aspect ratio*/
    :root {
      --grid-aspect-ratio: 16/9;
    }
    
    /* Consider using div element for grid */
    ul {
      border: 2px solid red;
      display: grid;
      grid-gap: 10px;
      grid-template-columns: 1fr 1fr 1fr 1fr;
      list-style-type: none;
    }
    /* Consider using div element for grid-cell */
    li {
      /* set relative position */
      position: relative;
      background-color: lime;
    }
    
    li:before {
      content: "";
      display: inline-block;
      padding-bottom: calc( 100% / (var(--grid-aspect-ratio)));
    }
    /* wrap your content in <div class="grid-cell-inner"> */
    .grid-cell-inner {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
    }
    <ul>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
    </ul>
      

    网格最好使用 div 元素。 请注意,您必须为网格单元格内容使用一些内部元素并将其位置设置为绝对以保持相同的纵横比。 不要使用 % 表示网格间隙,如果它是相对于视口的,您可以使用 vw/vh 单位。

    【讨论】:

      【解决方案3】:

      您应该使用1fr 而不是auto 来调整列的大小:

      ul {
        border: 2px solid red;
        display: grid;
        grid-gap: 5%;
        grid-template-columns: 1fr 1fr 1fr 1fr;
        list-style-type: none;
      }
      
      li:nth-child(4n)~li {
        /* eventually for the gap missing in chrome */
        margin-top: 5%
      }
      
      div {
        background-color: green;
        padding-top: 100%;
        width: 100%;
      }
      <ul>
        <li>
          <div></div>
        </li>
        <li>
          <div></div>
        </li>
        <li>
          <div></div>
        </li>
        <li>
          <div></div>
        </li>
        <li>
          <div></div>
        </li>
        <li>
          <div></div>
        </li>
        <li>
          <div></div>
        </li>
        <li>
          <div></div>
        </li>
      </ul>

      注意:对于方形技术,与 flex 不同,它可以由 grid child 制成,它可以让您用内容填充 div 并将其居中,例如 https://jsfiddle.net/ab0asum3/4/

      【讨论】:

        【解决方案4】:

        如果您打开 Chome DevTools 并检查 divs,您会看到浏览器将它们的高度计算为 0px。 我不能确切地说出您是哪个怪癖或哪个标准在这里打破,但如果嵌套的 divs 没有高度,它们不会向其父级 lis 传递任何内容,并且您将不会显示任何内容。

        原因是 Chrome 计算嵌套的div 高度为零,这反过来意味着父级li 将具有零高度强>。这就是你的原因。

        【讨论】:

        • Firefox 和 Chrome 都计算高度为零的嵌套 div。但是有效高度也应该是填充的结果,Firefox 会考虑,Chrome 不会。我不确定这里的哪个实现是正确的。感谢您的评论,我不确定您为什么被否决。
        • 这是一个奇怪的边缘案例,也许路过的downvote只是不熟悉它。你可能想去挖掘 FF 和 Chrome 的渲染规则,看看为什么它们在填充/零高度矛盾上有所不同。
        猜你喜欢
        • 2022-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-28
        • 2020-04-04
        • 2014-07-15
        • 2019-05-30
        相关资源
        最近更新 更多