【问题标题】:How can I reorder a grid of columns?如何重新排列列网格?
【发布时间】:2017-12-19 19:32:44
【问题描述】:

我有一个两列布局,里面有几个项目:

.grid {
  column-count: 2;
}

.grid-item {
  break-inside: avoid;
  height: 50px;
  margin-bottom: 10px;
  background-color: green;
  text-align: center;
  line-height: 50px;
  color: white;
}
<div class="grid">
  <div class="grid-item">1</div>
  <div class="grid-item">2</div>
  <div class="grid-item">3</div>
  <div class="grid-item">4</div>
  <div class="grid-item">5</div>
</div>

https://codepen.io/Deka87/pen/RgdLeZ

现在我需要能够重新排序仅使用 CSS 的列中的那些项目(因此它们在不同的屏幕分辨率上的顺序不同),所以我想我可以这样做:

.grid {
  display: flex;
  flex-direction: column;
  column-count: 2;
}
.grid-item:nth-child(1) {
  order: 5;
}

显然,这不起作用并破坏了 2 列布局。以前有人试过解决这个问题吗?有没有机会让这个工作?

PS:同一行上的项目不应该具有相同的高度(在这种情况下我可以使用简单的浮动)。很抱歉一开始没有说明。

【问题讨论】:

  • 你能在容器上设置一个高度吗?商品数量是固定的吗?
  • @Michael_B,是的,项目的数量是固定的,但是它们的高度不是(以及容器的高度)。
  • 最终结果应该是什么样子?订单应该是什么样的?
  • 我认为您不会找到将它们结合起来的方法...您是否愿意接受其他方法?你的 HTML 结构固定了吗?
  • @ovokuro,我愿意接受任何解决方案。但是 HTML 标记是固定的。谢谢!

标签: css flexbox css-grid css-multicolumn-layout


【解决方案1】:

如果容器没有固定的高度,一列弹性项目将不知道在哪里换行。没有什么可以导致中断,因此项目将继续扩展单列。

另外,column-countdisplay: flex 代表两种不同的 CSS 技术。 column-count 不是 flex 容器中的有效属性。

CSS 网格布局可能对你有用:

重新调整屏幕宽度以触发媒体查询

revised codepen

.grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: repeat(3, auto);
  grid-auto-rows: 50px;
  grid-auto-flow: column;
  grid-gap: 10px;
}

.grid-item {
  background-color: green;
  text-align: center;
  line-height: 50px;
  color: white;
}

@media ( max-width: 500px) {
  .grid-item:nth-child(2) {
    order: 1;
    background-color: orange;
  }
}
<div class="grid">
  <div class="grid-item">1</div>
  <div class="grid-item">2</div>
  <div class="grid-item">3</div>
  <div class="grid-item">4</div>
  <div class="grid-item">5</div>
</div>

【讨论】:

  • 谢谢,但是同一行中的项目将具有相同的高度,对吧?
  • 在我的例子中,是的。但是网格项目可以独立调整大小。在这里查看我的答案:Create a Masonry grid with flexbox (or other CSS)
  • 您的解决方案解释得很好。谢谢!但是,似乎如果我有项目内容高度动态(例如它们是文本块),它将无法按预期工作。
  • 发布一个带有完整示例的代码笔,我会检查一下。
  • 所以基本上你是对的,我试图重新发明砖石布局。这是一个完整的示例:codepen.io/Deka87/pen/WOmdQw?editors=1100。提前致谢!
【解决方案2】:

我倾向于为此使用 flexbox

.grid {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: flex-start;
}
.grid-item {
  box-sizing: border-box;
  width: calc( 50% - 5px );
  min-height: 50px;
  margin-bottom: 10px;
  background-color: green;
  text-align: center;
  line-height: 50px;
  color: white;
}

.grid-item:nth-child(1) {
  order: 5;
}
<div class="grid">
  <div class="grid-item">1</div>
  <div class="grid-item">2</div>
  <div class="grid-item">3</div>
  <div class="grid-item">4</div>
  <div class="grid-item">5</div>
</div>  

flex 语法得到广泛支持且超级灵活。

【讨论】:

  • 这种方法的问题是同一行中的项目将具有相同的高度。
  • 如果您使用align-items,则不会。因为这里的默认值是stretch。但您也可以将其设置为 center 或像我一样设置为 flex-start
  • 目前我不确定您是否正确。无论align-items 的值如何,同一行上的项目都将占据相同的高度。
  • 对不起,我误解了你的意思。你是对的。这确实是个问题。
  • 除非你有两个相邻的 flexbox 列,当然,它们在智能手机上被包裹在它们的父级中......
猜你喜欢
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2023-03-29
  • 2020-02-28
相关资源
最近更新 更多