【问题标题】:Preserving aspect ratio in a CSS grid在 CSS 网格中保留纵横比
【发布时间】:2017-05-04 15:15:32
【问题描述】:

我正在尝试实现包含 3x4 元素的响应式网格。我还为每个单元格使用位图图像,所以我想保留每个单元格的纵横比。我现在遇到的问题是我的 CSS 并不能阻止它溢出视口的垂直大小。在水平轴上缩放时效果很好。

按预期工作:

没有按预期工作(创建滚动条):

CodePen 链接:http://codepen.io/ekulabuhov/pen/JEyxby?editors=1100

.container{
  height:100vm; width:100vm; /* IE9 fallback */
  width: 100vmin; height: 100vmin;
  position: absolute;
  top:0;bottom:0;
  left:0;right:0;
  margin: auto;
}

.gametile {
  background: url('http://adrianpayne.me/game/assets/images/grass.png') no-repeat; 
  background-size: cover;

  /* 33.3vmin; */
  width: calc(100vmin/3);
  float:left;
  height: calc(100vmin/3*(91/70));
  margin-top: -16vmin;
}


/*** FOR THE DEMO **/
body,html {margin:0;background:#123752;color:#fff;}
a{color:#ccc;}
<div class="container">
  <div class="gametile"></div>
  <div class="gametile"></div>
  <div class="gametile"></div>
  
  <div class="gametile"></div>
  <div class="gametile"></div>
  <div class="gametile"></div>
  
  <div class="gametile"></div>
  <div class="gametile"></div>
  <div class="gametile"></div>

  <div class="gametile"></div>
  <div class="gametile"></div>
  <div class="gametile"></div>
</div>

【问题讨论】:

    标签: html css grid-layout aspect-ratio


    【解决方案1】:

    .container{
      height:100vm; width:100vm; /* IE9 fallback */
      width: calc(((100vmin - 16vmin) / 4 + 16vmin) * (70 / 91) * 3);
      height: 100vmin;
      position: absolute;
      top:0;bottom:0;
      left:0;right:0;
      margin: auto;
    }
    
    .gametile {
      background: url('http://adrianpayne.me/game/assets/images/grass.png') no-repeat; 
      background-size: cover;
    
      /* 33.3vmin; */
      width: calc(100% / 3);
      float:left;
      height: calc((100% - 16%) / 4 + 16%);
      margin-bottom: -16vmin;
    }
    
    
    /*** FOR THE DEMO **/
    body,html {margin:0;background:#123752;color:#fff;}
    a{color:#ccc;}
    <div class="container">
      <div class="gametile"></div>
      <div class="gametile"></div>
      <div class="gametile"></div>
      
      <div class="gametile"></div>
      <div class="gametile"></div>
      <div class="gametile"></div>
      
      <div class="gametile"></div>
      <div class="gametile"></div>
      <div class="gametile"></div>
    
      <div class="gametile"></div>
      <div class="gametile"></div>
      <div class="gametile"></div>
    </div>

    不知道它是否适用于 IE9,但我已为您修复了它。它可能在 IE 中不起作用。如果您放弃旧版浏览器,也可以尝试display: grid

    【讨论】:

    • 谢谢!我已经用一些 hacky JS 解决了这个问题。但是您的解决方案似乎也很有效。
    【解决方案2】:

    我玩弄了这些值,并设法将其置于屏幕中心而不会超出范围。

    .container{
      height:60vm; width:100vm; /* IE9 fallback */
      width: 100vmin; height: 60vmin;
      position: absolute;
      top:0;bottom:0;
      left:0;right:0;
      margin: auto;
    
    
    }
    
    .gametile {
      background: url('http://adrianpayne.me/game/assets/images/grass.png') no-repeat; 
      background-size: cover;
    
      /* 33.3vmin; */
      width: calc(80vmin/3);
      float:left;
      height: calc(80vmin/3*(91/70));
      margin-top: -16vmin;
    }
    

    【讨论】:

    • 谢谢大卫!感谢你的帮助!但似乎您的答案是通过将宽度限制为calc(80vmin/3) 来创建左右边距。我想避免这种情况。
    猜你喜欢
    • 2014-06-17
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2017-11-11
    • 2021-10-16
    相关资源
    最近更新 更多