【发布时间】:2018-02-28 10:03:17
【问题描述】:
下面的代码显示了当我调整窗口大小时的预期行为 Chrome 60 和 Firefox 55(但不是在 iOS Safari 10.3 中;这很可能是另一个问题,为什么它在 Safari 中行为不端)。
html, body {
width: 100%;
height: 100%;
padding: 0;
margin: 0;
border: 0;
background-color: lightgrey;
}
.container {
box-sizing: border-box;
width: 100%;
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: repeat(3, calc((60vh - 12px)/3));
/*grid-template-rows: 1fr 1fr 1fr;*/
/*grid-template-rows: auto auto auto;*/
height: 60vh;
border: 3px solid yellow;
padding: 3px;
/*grid-gap: 20px;*/ /* <-- would also mess things up */
}
.tile {
}
img {
box-sizing: border-box;
display: block;
object-fit: contain;
width: 100%;
height: 100%;
margin: 0;
border: 0;
padding: 3px;
}
<!-- The image is 200 x 100 px: a green and a blue square next to each other. -->
<div class="container">
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
<div class="tile">
<img src="https://i.stack.imgur.com/qbpIG.png" alt="." />
</div>
</div>
图像的纵横比 (2:1) 很重要
被保留。我本来希望:
grid-template-rows: 1fr 1fr 1fr;
或:
grid-template-rows: auto auto auto;
使图像适合网格的行,但它们都不适合。 与:
grid-template-rows: repeat(3, calc((60vh - 12px)/3));
我得到了想要的行为。 我怎样才能避免自己计算数学?换句话说,我应该怎么做才能让grid-template-rows: 1fr 1fr 1fr;(或类似的东西)起作用?
在真实页面上用 CSS 计算容器元素的高度已经很困难了。目标是用 CSS 网格布局解决它;没有 JavaScript,也没有背景图片黑客。
更新:我最初排除背景图像黑客有两个原因。
我认为(由于一些误解)背景图像 url 必须在 CSS 文件中,但情况并非如此:我可以使用 内联样式并将其包含在 HTML 中。
感觉很老套。在看到它变得多么复杂和混乱之后 将嵌套的 flex 容器嵌套在网格容器中只是为了让它在 Safari 上运行,我只是使用了背景图像 hack,因为它明显更干净并且适用于所有经过测试的浏览器(Chrome、Firefox、Safari) .
最后,帮助解决我的问题的不是公认的答案。
【问题讨论】:
-
CSS Grid Row Height Safari Bug 的答案似乎表明了为什么它在 Safari 中的行为不同:“问题是 Safari 无法识别
img元素上的height: 100%。”我> -
您希望这些行的高度是多少,您希望网格如何知道它?您只将网格容器设置为高度
60vh,但您还没有为网格行设置高度。 -
@TylerH 好问题。我希望网格延伸到页面底部(填写页面上的空白区域),尽管我不知道该怎么做。 :-(目前我从
100vh中减去页眉和页脚的高度,使用calc(),并将其设置为容器的高度。对不起,我是这方面的绝对初学者。至于你的其他问题: 行的高度应该相等。 -
啊,所以你有一个页眉和页脚,加起来是
40vh + 12px,或多或少? -
@TylerH 不幸的是,公式比这更复杂。 :-( 如果我可以将页眉和页脚都放在网格容器中,然后将网格的高度设置为
100vh,这将使我的生活更加轻松。或者有没有办法让div容器伸展到页面底部(或直到页脚)?看起来我必须告诉某个元素的高度...