【问题标题】:How can I order CSS columns horizontally instead of vertically for auto height elements?如何为自动高度元素水平排列 CSS 列而不是垂直排列?
【发布时间】:2022-04-25 23:00:00
【问题描述】:

我的每一列都有不同的高度。如何使用 CSS 将列排序为水平而不是垂直?同样在每个项目悬停时,高度会增加一点,而不会与下面的项目重叠。

.parent{
    /*display: flex;
    flex-flow: column wrap;
    height:600px; */

    column-count: 3;
    column-gap: 20px;
    -moz-column-count: 3;
    -moz-column-gap: 20px;
    -webkit-column-count: 3;
    -webkit-column-gap: 20px;
}
.child{
    background-color:#eee;
    margin-bottom:2px;
}
.child:hover{
    min-height:300px;
}
<div class="parent">
    <div class="child" style="height:100px">1</div>
    <div class="child" style="height:120px">2</div>
    <div class="child"  style="height:200px">3</div>
    <div class="child"  style="height:100px">4</div>
    <div class="child"  style="height:50px">5</div>
    <div class="child"  style="height:100px">6</div>
    <div class="child"  style="height:100px">7</div>
    <div class="child"  style="height:100px">8</div>
    <div class="child"  style="height:100px">9</div>
</div>

当前订单是

147
258
369

但我需要

123
456
789

【问题讨论】:

  • 无论可用水平空间如何,总是有 3 列吗?
  • 3 列始终存在,但高度不同,它应该像砖石布局一样工作

标签: html css flexbox css-multicolumn-layout


【解决方案1】:

一种可能性是使用弹性列,并根据它们的位置模3对项目进行排序。此外,插入伪元素以强制换行

.parent {
  display: flex;
  flex-flow: column;
  flex-wrap: wrap;
  height: 500px;
  width: 300px;
}

.child {
  margin: 5px;
  width: 100px;
  background-color: lightgreen;
  transition: padding 1s;
}

.child:hover {
   padding: 30px 0px;
}

.child:nth-child(3n + 1) {
  order: 1;
}

.child:nth-child(3n + 2) {
  order: 10;
}

.child:nth-child(3n) {
  order: 20;
}

.parent:before,
.parent:after {
  content: "";
  width: 0px;
  height: 999px;
}

.parent:before {
  order: 5;
}

.parent:after {
  order: 15;
}
<div class="parent">
  <div class="child" style="height:100px">1</div>
  <div class="child" style="height:120px">2</div>
  <div class="child" style="height:200px">3</div>
  <div class="child" style="height:100px">4</div>
  <div class="child" style="height:50px">5</div>
  <div class="child" style="height:100px">6</div>
  <div class="child" style="height:100px">7</div>
  <div class="child" style="height:100px">8</div>
  <div class="child" style="height:100px">9</div>
</div>

【讨论】:

  • 在这种情况下你需要定义一个固定的高度吧?
  • @IvanS95 是的,我认为它不能在固定高度下工作。但它几乎可以是任何值,您只需将伪高度设置为更高的值
  • @vals,感谢您的回答。没有父母身高可以吗?我的内容也是动态添加的,因此无法添加固定高度。 CSS3 列属性不需要父高度。我只在水平顺序上面临问题。 flex 在我的情况下不起作用。我也尝试过 flex 和 grid。
  • 据我所知,仅使用没有固定高度的 CSS 无法解决您的请求。为此,您需要使用 javascript。一种解决方法可能是设置一个高度 = 视口的容器,然后设置一个高度非常高的嵌套容器。 (例如 10000 像素)。
【解决方案2】:

请检查此链接,如果它有效,请告诉我。

https://jsfiddle.net/sreenath124/cp2vj9sh/

html

<div class="parent">
    <div class="child">1</div>
    <div class="child">2</div>
    <div class="child">3</div>
    <div class="child">4</div>
    <div class="child">5</div>
    <div class="child">6</div>
</div>

css

.parent {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, 200px);
  grid-auto-rows: 1fr;
}

.child {
  border: 1px solid;
  padding: 10px;
  transition: all 0.5s ease;
}
.child:hover {
  transform: scale(1.1);
}

如果您正在寻找类似的东西,请查看此链接。 https://codepen.io/andybarefoot/pen/QMeZda

https://medium.com/@andybarefoot/a-masonry-style-layout-using-css-grid-8c663d355ebb

【讨论】:

  • 感谢您的回答。我检查了这个,但在这里我无法添加悬停效果。当我悬停一个项目时,项目高度应该增加。此外,其他元素应根据该项目的悬停高度进行调整。只有高度。规模在我的情况下不起作用。
【解决方案3】:

如果您以不同的方式构建 HTML,这很容易:

.parent {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}
.child {
  /* Just to demonstrate */
  background-color: powderblue;
  margin: 1px;
}
.child:hover {
  min-height: 40px;
}
<div class="parent">
  <div class="column">
    <div class="child" style="height: 25px">1</div>
    <div class="child" style="height: 30px">4</div>
    <div class="child" style="height: 40px">7</div>
  </div>
  <div class="column">
    <div class="child" style="height: 30px">2</div>
    <div class="child" style="height: 20px">5</div>
    <div class="child" style="height: 30px">8</div>
  </div>
  <div class="column">
    <div class="child" style="height: 30px">3</div>
    <div class="child" style="height: 30px">6</div>
    <div class="child" style="height: 30px">9</div>
  </div>
</div>

【讨论】:

  • 感谢@pete 的回答。但是这里的间隙在 1 和 4、2 和 5 等之间是可见的。它应该像砖石布局一样工作。我也试过网格
  • 编辑了我的答案,结果与您所追求的相似吗?不过,我认为它确实需要将&lt;div&gt;s 结构化为上述列。
  • 这是一个不错的解决方案,但在我的情况下,我无法更改结构,因为它会影响我的响应能力。在移动版本中,它将变为单列,因此顺序将再次更改。调整浏览器大小后顺序也会改变
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多