我需要将多个带有图片和标题的项目排列在网格的一行中,如下所示:
我创建了一个网格并通过基线对齐元素。当 Chrome 中一切正常时,Safari 和 Firefox 中就会出现错误:
通过尝试 CSS,我发现了 Safari 的一个 hack:
在 Safari 中不起作用:
align-items: baseline;
gap: 24px;
grid-template-columns: repeat(4, 1fr);
在 Safari 中正常工作:
align-items: baseline;
gap: 24px;
grid-template-columns: repeat(4, calc((100% - 24px - 24px - 24px) / 4));
我找不到在 Firefox 中按预期工作的解决方案。
我发现:
aspect-ratio
或 padding-top
的块替换图片,则不会改变任何内容。100%
,它在 Firefox 中不起作用,但看起来有所不同:
这是沙箱和代码:
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.grid {
width: 500px;
gap: 24px;
display: grid;
grid-template-columns: repeat(4, calc((100% - 72px) / 4));
align-items: baseline;
}
.image-like {
background: green;
}
img {
display: block;
width: 100%;
}
.grid + h2 + .grid .image-like {
background: orange;
}
</style>
</head>
<body>
<h2>Grid with divs and the hardcoded height (correct)</h2>
<div class="grid">
<div class="item">
<div>
<div>
<div class="image-like" style="height: 130px;"></div>
</div>
title
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="height: 110px;"></div>
</div>
longer title to fix two lines
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="height: 140px;"></div>
</div>
short title
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="height: 90px;"></div>
</div>
longer title to fit multiple lines. Like 3 or smth
</div>
</div>
</div>
<h2>Grid with divs and aspect ratio (incorrect in Firefox and Safari)</h2>
<div class="grid">
<div class="item">
<div>
<div>
<div class="image-like" style="aspect-ratio: 0.7;"></div>
</div>
title
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="aspect-ratio: 0.6;"></div>
</div>
longer title to fix two lines
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="aspect-ratio: 0.5;"></div>
</div>
short title
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="aspect-ratio: 0.9;"></div>
</div>
longer title to fit multiple lines. Like 3 or smth
</div>
</div>
</div>
<h2>Grid with images (incorrect in Firefox and Safari)</h2>
<div class="grid">
<div class="item">
<div>
<div>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Dahl%2C_Michael_-_Queen_Anne_-_NPG_6187.jpg/150px-Dahl%2C_Michael_-_Queen_Anne_-_NPG_6187.jpg" />
</div>
title
</div>
</div>
<div class="item">
<div>
<div>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/King_George_I_by_Sir_Godfrey_Kneller%2C_Bt_%283%29.jpg/150px-King_George_I_by_Sir_Godfrey_Kneller%2C_Bt_%283%29.jpg" />
</div>
longer title to fix two lines
</div>
</div>
<div class="item">
<div>
<div>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/George_II_by_Thomas_Hudson.jpg/300px-George_II_by_Thomas_Hudson.jpg" />
</div>
short title
</div>
</div>
<div class="item">
<div>
<div>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Allan_Ramsay_-_King_George_III_in_coronation_robes_-_Google_Art_Project.jpg/150px-Allan_Ramsay_-_King_George_III_in_coronation_robes_-_Google_Art_Project.jpg"/>
</div>
longer title to fit multiple lines. Like 3 or smth
</div>
</div>
</div>
</body>
</html>
您可以使用
display:subgrid
来实现此目的,并为要共享的子网格定义 2 行(1 行用于图片,1 行用于标题。)
由于您在
.item
下有一个额外的 div 包装器,因此您需要将其制作为 display:content
或作为 subgrid
的附加层。
.grid{
grid-template-rows: auto auto;
}
.item{
display: grid;
grid-template-columns: subgrid;
}
.item > div{
display: grid;
grid-template-columns: subgrid;
}
.item > div{
display: grid;
grid-template-columns: subgrid;
}
如下图:
.grid {
width: 500px;
gap: 24px;
display: grid;
grid-template-columns: repeat(4, 1fr);
align-items: baseline;
grid-template-rows: auto auto;
}
.image-like {
background: green;
}
img {
display: block;
width: 100%;
}
.grid+h2+.grid .image-like {
background: orange;
}
.item {
display: grid;
grid-template-columns: subgrid;
}
.item>div {
display: grid;
grid-template-columns: subgrid;
}
<h2>Grid with divs and the hardcoded height (correct)</h2>
<div class="grid">
<div class="item">
<div>
<div>
<div class="image-like" style="height: 130px;"></div>
</div>
title
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="height: 110px;"></div>
</div>
longer title to fix two lines
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="height: 140px;"></div>
</div>
short title
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="height: 90px;"></div>
</div>
longer title to fit multiple lines. Like 3 or smth
</div>
</div>
</div>
<h2>Grid with divs and aspect ratio (incorrect in Firefox and Safari)</h2>
<div class="grid">
<div class="item">
<div>
<div>
<div class="image-like" style="aspect-ratio: 0.7;"></div>
</div>
title
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="aspect-ratio: 0.6;"></div>
</div>
longer title to fix two lines
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="aspect-ratio: 0.5;"></div>
</div>
short title
</div>
</div>
<div class="item">
<div>
<div>
<div class="image-like" style="aspect-ratio: 0.9;"></div>
</div>
longer title to fit multiple lines. Like 3 or smth
</div>
</div>
</div>
<h2>Grid with images (incorrect in Firefox and Safari)</h2>
<div class="grid">
<div class="item">
<div>
<div>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Dahl%2C_Michael_-_Queen_Anne_-_NPG_6187.jpg/150px-Dahl%2C_Michael_-_Queen_Anne_-_NPG_6187.jpg" />
</div>
title
</div>
</div>
<div class="item">
<div>
<div>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/King_George_I_by_Sir_Godfrey_Kneller%2C_Bt_%283%29.jpg/150px-King_George_I_by_Sir_Godfrey_Kneller%2C_Bt_%283%29.jpg" />
</div>
longer title to fix two lines
</div>
</div>
<div class="item">
<div>
<div>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/George_II_by_Thomas_Hudson.jpg/300px-George_II_by_Thomas_Hudson.jpg" />
</div>
short title
</div>
</div>
<div class="item">
<div>
<div>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Allan_Ramsay_-_King_George_III_in_coronation_robes_-_Google_Art_Project.jpg/150px-Allan_Ramsay_-_King_George_III_in_coronation_robes_-_Google_Art_Project.jpg"/>
</div>
longer title to fit multiple lines. Like 3 or smth
</div>
</div>
</div>