html - 具有持久纵横比的响应式 CSS 网格

标签 html css sass responsive-design css-grid

我的目标是创建一个具有未知数量元素的响应式网格,并使它们的宽高比保持在 16:9。 现在它看起来像这样:

.grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, 160px);
    grid-template-rows: 1fr;
    grid-gap: 20px;
 }
.item {
    height: 90px;
    background: grey;
}
<div class="grid">
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
</div>

问题是,元素不会随着屏幕尺寸缩放,导致在正确的位置出现边距。但是,当使用例如 grid-template-columns: repeat(auto-fit, minmax(160p, 1fr)) 并删除 height: 90px;< 使网格适应屏幕尺寸时,宽高比不保持不变。

也许没有 css grid 有更好的解决方案? (也许使用 javascript)

最佳答案

您可以利用百分比填充基于宽度这一事实。

This CSS-tricks article很好地解释了这个想法:

...if you had an element that is 500px wide, and padding-top of 100%, the padding-top would be 500px.

Isn't that a perfect square, 500px × 500px? Yes, it is! An aspect ratio!

If we force the height of the element to zero (height: 0;) and don't have any borders. Then padding will be the only part of the box model affecting the height, and we'll have our square.

Now imagine instead of 100% top padding, we used 56.25%. That happens to be a perfect 16:9 ratio! (9 / 16 = 0.5625).

所以为了让列保持纵横比:

  1. 按照您的建议设置列宽:

    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr))
    
  2. 向元素添加伪元素以保持 16:9 的纵横比:

    .item:before {
      content: "";
      display: block;
      height: 0;
      width: 0;
      padding-bottom: calc(9/16 * 100%);
    }
    

.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  grid-template-rows: 1fr;
  grid-gap: 20px;
}
.item {
  background: grey;
  display: flex;
  justify-content: center;
}
.item:before {
  content: "";
  display: block;
  height: 0;
  width: 0;
  padding-bottom: calc(9/16 * 100%);
}
<div class="grid">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

Codepen Demo (调整大小看效果)

关于html - 具有持久纵横比的响应式 CSS 网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51577807/

相关文章:

html - 将 CSS 宽度分配给位置 :fixed element

html - 2 个 div 50% 内联 block 彼此不相邻

jquery - 视频背景横幅(不是整页)

css - Sass 混合问题中的每个循环行为

sass - 将媒体查询从 LESS 转换为 SCSS

html - TypeScript:类型系统的问题

javascript - jQuery设置属性值问题

javascript - 如何在 CSS 或 Javascript 中制作曲线形状

html - 菜单里一个:active how can I make it working properly?

css - 自添加媒体查询以来,Gulp SASS 任务不再是 'Watches'