CSS网格布局中列的反向顺序

Rob*_*Rob 16 html css css3 css-grid

我希望使用CSS Grid来反转两个并排div的明显顺序,其中一个div任意增长(我不想使用浮点数).

我在这里创建了一个plunkr:http://plnkr.co/edit/6WZBnHbwhD7Sjx2ovCO7?p = preview

#container {
  grid-template-columns: 240px 1fr;
  display: grid;
}

.a {
  background: yellow;
}

.b {
  background: blue;
  color: white;
}

#container>.a {
  grid-column: 1;
}

#container>.b {
  grid-column: 2;
}

#container.reverse>.a {
  grid-column: 2;
}

#container.reverse>.b {
  grid-column: 1;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container" class="reverse" style="width: 800px;">
  <div class="a">A</div>
  <div class="b">B</div>
</div>
Run Code Online (Sandbox Code Playgroud)

它的关键在于,当我.reverse应用了类(因此你应该看到B | A)时,B它会偏移到一个新行,所以它看起来更像:

          | A
B
Run Code Online (Sandbox Code Playgroud)

如果我颠倒的文件排序.a.b,这又回到了正常(当然,如果我把.reverse班,我得到了同样的问题).

为什么会这样,我该如何解决?

Chr*_*ink 94

最简单的方法是添加order: 1到元素 B 或order: -1元素 A.reverse

这也是正确的 CSS 而不是 hack-y

  • 这个应该更高。这是一个简单的修复 (7认同)
  • 不仅是一个简单的修复,而且是一个正确的修复。这应该是公认的答案。 (2认同)

Mic*_*l_B 18

由于网格自动放置算法在容器中布置项目,因此它使用下一个可用的空单元格().

在源代码中,A元素位于B元素之前:

<div id="container" class="reverse" style="width: 800px;">
   <div class="a">A</div>
   <div class="b">B</div>
</div>
Run Code Online (Sandbox Code Playgroud)

因此,网格容器首先放置A,然后使用下一个可用空间放置B.

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

http://www.w3.org/TR/css3-grid-layout/#common-uses-auto-placement


grid-auto-flow: dense

一个解决这个问题(如你已经注意到)是覆盖默认grid-auto-flow: rowgrid-auto-flow: dense.

使用grid-auto-flow: dense,网格自动放置算法将使用适合的项目回填未占用的单元格.

#container {
  display: grid;
  grid-template-columns: 240px 1fr;
  grid-auto-flow: dense; /* NEW */
}
Run Code Online (Sandbox Code Playgroud)

7.7.自动放置:grid-auto-flow 属性

未明确放置的网格项通过自动放置算法自动放入网格容器中的未占用空间.

grid-auto-flow 控制自动放置算法的工作方式,准确指定自动放置的项目如何流入网格.

dense

如果指定,自动放置算法使用"密集"打包算法,如果较小的项目稍后出现,则尝试在网格中较早填充空洞.这可能会导致项目无序显示,这样做会填充较大项目留下的漏洞.

#container {
  display: grid;
  grid-template-columns: 240px 1fr;
  grid-auto-flow: dense; /* NEW */
}

.a {
  background: yellow;
}

.b {
  background: blue;
  color: white;
}

#container>.a {
  grid-column: 1;
}

#container>.b {
  grid-column: 2;
}

#container.reverse>.a {
  grid-column: 2;
}

#container.reverse>.b {
  grid-row: 1;
  grid-column: 1;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container" class="reverse" style="width: 800px;">
  <div class="a">A</div>
  <div class="b">B</div>
</div>
Run Code Online (Sandbox Code Playgroud)


grid-row: 1

另一种解决方案是简单地为第二项定义行.

#container>.b {
  grid-column: 2;
  grid-row: 1; /* NEW */
}
Run Code Online (Sandbox Code Playgroud)

#container {
  display: grid;
  grid-template-columns: 240px 1fr;
}

.a {
  background: yellow;
}

.b {
  background: blue;
  color: white;
}

#container>.a {
  grid-column: 1;
}

#container>.b {
  grid-column: 2;
  grid-row: 1; /* NEW */
}

#container.reverse>.a {
  grid-column: 2;
}

#container.reverse>.b {
  grid-row: 1;
  grid-column: 1;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container" class="reverse" style="width: 800px;">
  <div class="a">A</div>
  <div class="b">B</div>
</div>
Run Code Online (Sandbox Code Playgroud)


小智 15

我不确定如何反转更多的网格项目。但是,如果您的网格中有 2 个网格项,则可以使用以下代码简单地定位第二个网格项。

#container > .b {
    grid-column-start: 1;
    grid-row-start: 1;
}
Run Code Online (Sandbox Code Playgroud)


小智 12

我刚才也遇到了同样的问题。我尝试了auto-row-dense,然后将容器父级的方向设置为rtl。有效。

正是这个,在 plunker 链接上,似乎就成功了。

.reverse{
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-auto-flow: dense;
  direction: rtl;
}
Run Code Online (Sandbox Code Playgroud)

  • rtl 还会翻转文本和文本对齐,因此这对于内容来说并不是一个很好的解决方案。 (5认同)
  • 不幸的是,使用“direction”会产生意想不到的副作用,并且对于任何使用“rtl”语言查看页面的用户来说很可能会中断 (3认同)

Jas*_*ham 9

虽然上述解决方案适用于此特定示例,但这不是解决您的问题的正确方法。Grid Layout遵循的CSS属性称为directiondirection: rtl将给您问题的要求。所有支持Grid Layout的浏览器都支持它。

#container {
  grid-template-columns: 240px 1fr;
  display: grid;
}

#container.reverse {
  direction: rtl;
}

.a {
  background: yellow;
}

.b {
  background: blue;
  color: white;
}
Run Code Online (Sandbox Code Playgroud)
<h3>direction: unset</h3>
<div id="container">
  <div class="a">A</div>
  <div class="b">B</div>
</div>

<h3>direction: rtl</h3>
<div id="container" class="reverse">
  <div class="a">A</div>
  <div class="b">B</div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 但是,这也会改变这些容器内其他组件的任何文本的自然流动方向。我只想更改容器的外观顺序,而不是更改文本方向。(`direction: rtl` 支持从右到左的语言)。 (6认同)
  • ** [CSS方向是国际化功能,不用于其他目的](https://developer.mozilla.org/zh-CN/docs/Web/CSS/direction)。**尽管此功能有效,但并非预期的目的“方向”的目的,需要额外的步骤来修复文本(如上述注释所指出的),目前尚不清楚您在做什么。 (5认同)
  • 这是一个公平的观点。你不能简单地为孩子们添加 `&gt; * { direction: ltr}` 吗? (4认同)