使网格容器填充列不是行

Gle*_*rce 34 html css css3 flexbox css-grid

我希望我的网格像这样垂直填充:

1 4 7 
2 5 8
3 6 9
... arbitrary number of additional rows.
Run Code Online (Sandbox Code Playgroud)

相反,它会像这样水平填充:

1 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)

我想指定网格中的列数,而不是行数.

这就是我的div使用内联CSS样式的样子:

<div style="display:grid; grid-template-columns:1fr 1fr 1fr;">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
</div>
Run Code Online (Sandbox Code Playgroud)

重要的是我的网格宽3列,但我希望项目按列填充,而不是按行填充.CSS Grid中有可能吗?我已经阅读了这篇https://css-tricks.com/snippets/css/complete-guide-grid/,但没有看到有关订单的任何信息.

CSS Flexbox有flex-direction没有像CSS Grid那样的属性?

Mic*_*l_B 24

对于根据需要创建新列的垂直流动网格,并且未定义行,请考虑使用CSS多列布局(示例).CSS网格布局(至少当前实现 - 级别1)无法执行此任务.这是问题所在:

在CSS网格布局中,grid-auto-flowgrid-template-rows/ grid-template-columns属性之间存在反比关系.

更具体地说,使用grid-auto-flow: row(默认设置)并grid-template-columns定义两者,网格项在水平方向上很好地流动,根据需要自动创建新行.这个概念在问题的代码中说明.

#container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-auto-flow: row;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
</div>
Run Code Online (Sandbox Code Playgroud)

但是,通过切换到grid-template-rows,网格项目堆叠在一列中.

#container {
  display: grid;
  grid-template-rows: 1fr 1fr 1fr;
  grid-auto-flow: row;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
</div>
Run Code Online (Sandbox Code Playgroud)

没有使用grid-auto-flow: row和自动创建列grid-template-rows.grid-template-columns必须定义(因此,与之相反grid-auto-flow).

#container {
  display: grid;
  grid-template-rows: 1fr 1fr 1fr;
  grid-template-columns: 1fr 1fr 1fr;
  grid-auto-flow: row;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
</div>
Run Code Online (Sandbox Code Playgroud)

在相反的情况下,同样的行为也是如此.

使用grid-auto-flow: columngrid-template-rows定义的网格项在垂直方向上流动很好,根据需要自动创建新列.

#container {
  display: grid;
  grid-template-rows: 1fr 1fr 1fr;
  grid-auto-flow: column;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
</div>
Run Code Online (Sandbox Code Playgroud)

但是,通过切换到grid-template-columns,网格项堆叠在一行中.(这是大多数人提出的问题,包括在这个问题中.)

#container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-auto-flow: column;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
</div>
Run Code Online (Sandbox Code Playgroud)

没有自动创建行.这需要grid-template-rows定义.(这是最常提供的解决方案,但它通常被拒绝,因为布局具有可变数量的行.)

#container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr;
  grid-auto-flow: column;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
</div>
Run Code Online (Sandbox Code Playgroud)

因此,考虑如上所述的多列布局解决方案.

规格参考:7.7.自动放置:grid-auto-flow属性


LGS*_*Son 12

另一个选择是删除CSS Grid并使用CSS Columns,它完全符合您的要求,并且还有更好的浏览器支持.

.csscolumn {
  -webkit-column-count: 3;  /* Chrome, Safari, Opera */
  -moz-column-count: 3;     /* Firefox */
  column-count: 3;
}

/* styling for this demo */
.csscolumn {
  width: 50%;
}
.csscolumn + .csscolumn {
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid;
}
Run Code Online (Sandbox Code Playgroud)
<div class="csscolumn">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
</div>

<div class="csscolumn">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
</div>

<div class="csscolumn">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
  <div>10</div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 是的,CSS 列似乎最适合纯文本内容而不是块,因为不稳定的包装行为可能会无意中将块分开,并且跨浏览器的处理方式有所不同。 (3认同)
  • 这个答案让我现在真的很高兴 (3认同)
  • 需要注意的是:最新版本的 Chrome (50+) 和 Firefox (52+) 已经取消了与列相关的属性前缀 (https://developer.mozilla.org/en-US/docs/Web/CSS/column-计数#Browser_compatibility) (2认同)
  • 绝对正确.... 大多数时候,问题不应该是我如何强制这个工具按照我想要的方式运行,而是我是否选择了正确的工具。 (2认同)
  • @vals,同意,除非当然,对于子元素接受网格/弹性属性同样重要. (2认同)

小智 7

我见过的最简单的方法如下:

.grid {
	display: grid;
	grid-auto-flow: column;
	grid-gap: 1px;
	grid-template-columns: repeat(3, 1fr); 
	grid-template-rows: repeat(5, auto);    
}
Run Code Online (Sandbox Code Playgroud)
<div class="grid">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
<div>10</div>
<div>11</div>
<div>12</div>
<div>13</div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 是的,很简单,但是如果您需要可变的行数(具体取决于传入数据的长度),则不起作用 (5认同)
  • ^ 如果你计算 JS 中的行数并除以列数,然后四舍五入到整数并在 JS 文件中分配 CSS 声明(我最终做了什么)------------ ---------- 谢谢您的大力帮助! (2认同)

val*_*als 5

您可以根据项目数量使用特定样式来获得某种方式的结果,而不仅仅是将其作为技术解决方案,而不是作为实际解决方案

让我们看看它是如何工作的:

.item:first-child:nth-last-child(n+4):nth-last-child(-n + 6) ~ .item:nth-child(n+3)
Run Code Online (Sandbox Code Playgroud)

第一个选择器

.item:first-child:nth-last-child(n+4):nth-last-child(-n + 6)
Run Code Online (Sandbox Code Playgroud)

是活跃的,因为我们的列表包含4到6个元素。在这种情况下,某些项目将同时处于第一个条件和第二个条件。

在这种情况下,我们希望2项位于第一列。定位剩余的项目(从第三个开始)

~ .item:nth-child(n+3)
Run Code Online (Sandbox Code Playgroud)

并将它们放在第二列。现在适用于第5条及以后的类似规则

~ .item:nth-child(n+5)
Run Code Online (Sandbox Code Playgroud)

将其他项目放在第三栏中。这两个规则具有相同的优先级,并且都针对最后两个项目,因此按此顺序出现至关重要。

我们需要重复类似的规则,直到可以出现的最大物品数量(可能是预处理器的工作)

.item:first-child:nth-last-child(n+4):nth-last-child(-n + 6) ~ .item:nth-child(n+3)
Run Code Online (Sandbox Code Playgroud)
.item:first-child:nth-last-child(n+4):nth-last-child(-n + 6)
Run Code Online (Sandbox Code Playgroud)
~ .item:nth-child(n+3)
Run Code Online (Sandbox Code Playgroud)