元素的顺序是否在CSS网格中定义它们的位置?

WoJ*_*WoJ 3 html css css-grid

以下代码按预期工作:单元格在定义的行之间填充颜色

#grid {
  display: grid;
  height: 100px;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 100px;
}

#item1 {
  background-color: lime;
}

#item2 {
  background-color: yellow;
  grid-column: 2/4;
}

#item3 {
  background-color: blue;
  grid-column: 4/7;
}
Run Code Online (Sandbox Code Playgroud)
<div id="grid">
  <div id="item1"></div>
  <div id="item2"></div>
  <div id="item3"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

然后,我通过交换grid-column条目尝试交换最后两个元素(黄色和蓝色):

#grid {
  display: grid;
  height: 100px;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 100px;
}

#item1 {
  background-color: lime;
}

#item2 {
  background-color: yellow;
  grid-column: 4/7;
}

#item3 {
  background-color: blue;
  grid-column: 2/4;
}
Run Code Online (Sandbox Code Playgroud)
<div id="grid">
  <div id="item1"></div>
  <div id="item2"></div>
  <div id="item3"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

item3未正确显示.我想这是因为item2已经在网格中进一步渲染,并且不能再渲染早期元素(疯狂猜测).

我很遗憾HTML中元素的顺序如何受到CSS中元素放置的影响,如文档中所述?HTML中的顺序不应该是微不足道的吗?

Mar*_*vin 5

这些项目按照html中的外观顺序并根据其指定的位置逐个插入到网格中.放置算法不会尝试填充任何先前的间隙.

注意:默认情况下,自动放置算法在网格中呈线性状态,无需回溯; 如果必须跳过一些空格来放置一个较大的项目,它将不会返回填充这些空格.要更改此行为,请在grid-auto-flow中指定密集关键字.

一个项目放在第二行

#grid {
  display: grid;
  height: 300px;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 100px;
}

#item1 {
  background-color: lime;
}

#item2 {
  background-color: yellow;
  grid-column: 4/7;
}

#item3 {
  background-color: blue;
  grid-column: 2/4;
}

#item4 {
  background-color: grey;
  grid-column: 5/6;
}

#item5 {
  background-color: orange;
  grid-column: 1/7;
}
Run Code Online (Sandbox Code Playgroud)
<div id="grid">
  <div id="item1"></div>
  <div id="item2"></div>
  <div id="item3"></div>
  <div id="item4"></div>
  <div id="item5"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您可以使用该grid-auto-flow属性并dense按照文档的建议将其设置为:

#grid {
  display: grid;
  height: 100px;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 100px;
  grid-auto-flow: dense;
}

#item1 {
  background-color: lime;
}

#item2 {
  background-color: yellow;
  grid-column: 4/7;
}

#item3 {
  background-color: blue;
  grid-column: 2/4;
}
Run Code Online (Sandbox Code Playgroud)
<div id="grid">
  <div id="item1"></div>
  <div id="item2"></div>
  <div id="item3"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

或者您可以利用该order财产来获得希望的结果:

#grid {
  display: grid;
  height: 100px;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 100px;
}

#item1 {
  background-color: lime;
}

#item2 {
  background-color: yellow;
  grid-column: 4/7;
  order: 3;
}

#item3 {
  background-color: blue;
  grid-column: 2/4;
  order: 2;
}
Run Code Online (Sandbox Code Playgroud)
<div id="grid">
  <div id="item1"></div>
  <div id="item2"></div>
  <div id="item3"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

或者,如GCyrillus建议的那样,使用grid-row属性强制将第三个项目放在第一行中:

#grid {
  display: grid;
  height: 100px;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 100px;
}

#item1 {
  background-color: lime;
}

#item2 {
  background-color: yellow;
  grid-column: 4/7;
}

#item3 {
  background-color: blue;
  grid-column: 2/4;
  grid-row: 1;
}
Run Code Online (Sandbox Code Playgroud)
<div id="grid">
  <div id="item1"></div>
  <div id="item2"></div>
  <div id="item3"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的详细解答.帮助我理解的关键是没有回填(除非使用'密集'),因此网格试图填充下一个可用位置(按列),这意味着它在第二行完成 - 这我没有显示. (2认同)