假设以下网格布局:
div {
display: grid;
grid-template-columns: auto auto;
grid-row-gap: 1em;
border: 5px solid green;
margin: 50px;
}
h3 {
grid-column: 1 / -1;
margin: 0;
}
span {
background-color: pink;
}
h3, span {
padding: 0.5em;
}
span + span {
background-color: salmon;
}
<div>
<h3>1. A heading here</h3>
<span>some text here</span>
<span>some more text here as well thanks</span>
</div>
我想“收缩包装”网格项,这样
1) 网格的最大宽度只会和内容一样宽,但是
2) 如果没有足够的空间容纳内容 - 元素将相应地换行。
在上面的演示中,first 约束失败 - 网格列拉伸(stretch)以适应它们各自的内容,并且所有额外视口(viewport)宽度在列。
Codepen demo -(调整大小以查看我在说什么)
我已经尝试了几种方法来解决这个问题,但它们都将网格元素“收缩包装”为与实际网格本身相对应的:
1) 将max-content
设置为轨道长度而不是auto
grid-template-columns: max-content max-content;
div {
display: grid;
grid-template-columns: max-content max-content;
grid-row-gap: 1em;
border: 5px solid green;
margin: 50px;
}
h3 {
grid-column: 1 / -1;
margin: 0;
}
span {
background-color: pink;
}
h3, span {
padding: 0.5em;
}
span + span {
background-color: salmon;
}
<div>
<h3>1. A heading here</h3>
<span>some text here</span>
<span>some text here</span>
</div>
2) 在网格容器上设置justify-content: flex-start;
div {
display: grid;
grid-template-columns: auto auto;
grid-row-gap: 1em;
border: 5px solid green;
margin: 50px;
justify-content: flex-start;
}
h3 {
grid-column: 1 / -1;
margin: 0;
}
span {
background-color: pink;
}
h3, span {
padding: 0.5em;
}
span + span {
background-color: salmon;
}
<div>
<h3>1. A heading here</h3>
<span>some text here</span>
<span>some text here</span>
</div>
3) 添加一个伪造的第三列,用空的第三列填充剩余的视口(viewport)宽度:
grid-template-columns: auto auto 1fr;
div {
display: grid;
grid-template-columns: auto auto 1fr;
grid-row-gap: 1em;
border: 5px solid green;
margin: 50px;
}
h3 {
grid-column: 1 / -1;
margin: 0;
}
span {
background-color: pink;
}
h3, span {
padding: 0.5em;
}
span + span {
background-color: salmon;
}
<div>
<h3>1. A heading here</h3>
<span>some text here</span>
<span>some text here</span>
</div>
那么我将如何“收缩包裹”网格?
最佳答案
在元素上设置 display: grid
会导致它生成一个 block 级网格容器框。
这就是导致网格填充视口(viewport)宽度并相应地拉伸(stretch)元素的原因。
既然如此,我们可以通过在网格容器上设置以下之一来阻止网格拉伸(stretch):
1) 显示:内联网格
;
div {
display: inline-grid; /* <-- modified */
grid-template-columns: auto auto;
grid-row-gap: 1em;
border: 5px solid green;
margin: 50px;
}
h3 {
grid-column: 1 / -1;
margin: 0;
}
span {
background-color: pink;
}
h3, span {
padding: 0.5em;
}
span + span {
background-color: salmon;
}
<div>
<h3>1. A heading here</h3>
<span>some text here</span>
<span>some text here</span>
</div>
2) float :左;/* 或右 */
div {
display: grid;
float: left; /* <-- added */
grid-template-columns: auto auto;
grid-row-gap: 1em;
border: 5px solid green;
margin: 50px;
}
h3 {
grid-column: 1 / -1;
margin: 0;
}
span {
background-color: pink;
}
h3, span {
padding: 0.5em;
}
span + span {
background-color: salmon;
}
<div>
<h3>1. A heading here</h3>
<span>some text here</span>
<span>some text here</span>
</div>
3) position:absolute;
div {
display: grid;
position: absolute; /* <--- added */
grid-template-columns: auto auto;
grid-row-gap: 1em;
border: 5px solid green;
margin: 50px;
}
h3 {
grid-column: 1 / -1;
margin: 0;
}
span {
background-color: pink;
}
h3, span {
padding: 0.5em;
}
span + span {
background-color: salmon;
}
<div>
<h3>1. A heading here</h3>
<span>some text here</span>
<span>some text here</span>
</div>
或者,我们可以在网格容器上设置width: fit-content
。
div {
display: grid;
grid-template-columns: auto auto;
grid-row-gap: 1em;
border: 5px solid green;
margin: 50px;
width: fit-content; /* <-- added */
}
h3 {
grid-column: 1 / -1;
margin: 0;
}
span {
background-color: pink;
}
h3, span {
padding: 0.5em;
}
span + span {
background-color: salmon;
}
<div>
<h3>1. A heading here</h3>
<span>some text here</span>
<span>some text here</span>
</div>
关于css - 如何收缩包装CSS网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47268393/