css - 如何收缩包装CSS网格?

标签 css css-grid

假设以下网格布局:

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/

相关文章:

css - 为什么我的重复函数在 css 的网格属性中不起作用?

css - 在 CSS 网格中有行号 2 而没有行号 1 是否有效?

html - 对齐不同 block CSS 子 block 的高度(flex/grid)

javascript - 缩小 JS 和 CSS 有什么风险吗?

css - 如何在工具栏按钮为 "on"时更改背景,如重做/撤消(tinymce)

html - 如果选中复选框,则突出显示复选框之前的标签

html - 使用 html5 和/或 CSS3 动画文本移动

html - CSS 网格 : different alignment for every second row

使用一个滚动条的 CSS 固定列表标题

CSS3 - 移动网站和媒体查询