【问题标题】:Ordering flex items订购弹性物品
【发布时间】:2019-04-10 14:09:58
【问题描述】:

假设我有这个:

.flex-container {
  display: flex;
  flex-wrap: wrap;
  flex-direction: row;
}

.flex-container > div {
  background-color: DodgerBlue;
  color: white;
  width: 100px;
  margin: 10px;
  text-align: center;
  line-height: 75px;
  font-size: 30px;
}
<div class="flex-container">
  <div><a href="#">1</a></div>
  <div><a href="#">2</a></div>
  <div><a href="#">3</a></div>
</div>

如何使用 flexbox 对项目进行排序,所以布局会是这样的?

我无法更改 HTML 中 div 的顺序,因为它会危及不同视图的布局。

【问题讨论】:

标签: html css flexbox


【解决方案1】:

如果你能切换到CSS Grid layout就很容易了:

  • flex-cotainer元素上创建一个网格容器

  • 将第二个元素放在第一列(使用grid-column: 1跨越 2 行(使用grid-row: 1 / 3)。

请看下面的演示:

.flex-container {
  display: inline-grid;
  grid-template-columns: auto auto;
}

.flex-container div:nth-child(2) {
  grid-column: 1;
  grid-row: 1 / 3;
}

.flex-container > div {
  background-color: DodgerBlue;
  color: white;
  width: 100px;
  margin: 10px;
  text-align: center;
  line-height: 75px;
  font-size: 30px;
}
<div class="flex-container">
  <div><a href="#">1</a></div>
  <div><a href="#">2</a></div>
  <div><a href="#">3</a></div>
</div>

flexbox 解决方案是 hacky 充其量使用 负边距已知 高度 - 见下文:

.flex-container {
  display: flex;
  flex-wrap: wrap;
  width: 200px;
}

.flex-container div:nth-child(1) {
  align-self: flex-start;
}

.flex-container div:nth-child(2) {
  order: -1;
  line-height: 170px;
}

.flex-container div:nth-child(3) {
  margin-left: auto;
  margin-top: -85px;
}

.flex-container > div {
  background-color: DodgerBlue;
  color: white;
  width: calc(100px - 20px);
  margin: 10px;
  text-align: center;
  line-height: 75px;
  font-size: 30px;
}
<div class="flex-container">
  <div><a href="#">1</a></div>
  <div><a href="#">2</a></div>
  <div><a href="#">3</a></div>
</div>

【讨论】:

  • 使用网格是个好主意,但它不能回答问题。使用 Flexbox 可以非常轻松地完成。
  • 我不同意你的观点。但问题是你能改变弹性项目的顺序吗?你可以。您应该指出这是可能的并说明如何。然后用网格展示更好的解决方案。
【解决方案2】:

您不应该为此使用 Flexbox,因为它不是为此而设计的。考虑改用 CSS Grid。使用grid-template-areas,将孩子分配到我们希望他们在布局中的位置成为一项微不足道的任务。网格子级的DOM 顺序变得无关紧要。

.grid-container {
  display: inline-grid;
  grid-template-areas: "two one"
                       "two three";
}

.grid-container > div {
  background-color: DodgerBlue;
  color: white;
  width: 100px;
  margin: 10px;
  text-align: center;
  line-height: 75px;
  font-size: 30px;
}

.one {
  grid-area: one;
}

.two {
  grid-area: two;
}

.three {
  grid-area: three;
}
<div class="grid-container">
  <div class="one"><a href="#">1</a></div>
  <div class="two"><a href="#">2</a></div>
  <div class="three"><a href="#">3</a></div>
</div>

【讨论】:

  • Flexbox 可以很好地解决这个问题。这不是一个公平的说法。
  • @kukkuz 很确定是 Nilpo,他的回答实际上值得反对。我会赞成你的回答。
【解决方案3】:

通过使用 row-reverse 而不是 row 作为 flex-direction 来反转行顺序。

flex-direction: row-reverse;

您还可以手动对子项进行排序,方法是为每个子项指定一个采用整数的 order 属性。

.flex-container :nth-child(1) { order: 3; }
.flex-container :nth-child(2) { order: 2; }
.flex-container :nth-child(3) { order: 1; }

【讨论】:

  • 这如何回答这个问题?此外,您的CSS 甚至无效。即使是这样,它也不会正确回答这个问题。第二个孩子应该跨越两行。
  • 此解决方案将 div 作为 3 行在 flex 容器中相互平行。我需要将(1)和(1)堆叠在(3)上。有没有办法用 flexbox 做到这一点?
  • @AndyHoffman 这个问题没有足够的标记来使用 Flexbox。为了这个问题,它显然被剥离了。它不要求一个可行的解决方案,它只询问如何更改元素的顺序。
  • @Nilpo 很确定是安迪·霍夫曼,他的回答实际上值得反对。我会赞成你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2011-08-03
  • 2016-08-02
  • 2020-09-11
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多