用CSS同等分配高度

时间:2013-03-01 18:20:45

标签: html css grid

我有一个非常棘手的HTML问题,我不确定是否有基于CSS的解决方案。基本上我有一个三列网格。第一列和第三列可以包含可变数量的行。第二列总是只有一行。每行都有一个最小高度。

因此,行数最多的列将包含高度设置为最小高度的所有行。其他列中的行应在高度上均匀扩展以占用剩余空间。

假设第一列有三行,每行高50px。第二列必须有一行150px高。如果第三列有2行,则每行必须高75px。下面是一些图片,以进一步说明我的目标。

这对CSS来说是否可能?

enter image description here

3 个答案:

答案 0 :(得分:2)

如果你不介意只在少数几个浏览器中工作,那么你绝对可以用纯CSS做到这一点。继续,添加和删除任意数量的孙子div:

http://codepen.io/cimmanon/pen/ldmtJ

/* line 5, ../sass/test.scss */
.wrapper {
  display: -webkit-flexbox;
  display: -ms-flexbox;
  display: -webkit-flex;
}
@supports (display: flex) and (flex-wrap: wrap) {
  /* line 5, ../sass/test.scss */
  .wrapper {
    display: flex;
  }
}

/* line 9, ../sass/test.scss */
.a, .b, .c {
  display: -webkit-flexbox;
  display: -ms-flexbox;
  display: -webkit-flex;
  -webkit-flex-flow: row wrap;
  -ms-flex-flow: row wrap;
  flex-flow: row wrap;
}
@supports (display: flex) and (flex-wrap: wrap) {
  /* line 9, ../sass/test.scss */
  .a, .b, .c {
    display: flex;
  }
}
/* line 13, ../sass/test.scss */
.a div, .b div, .c div {
  border: 1px solid;
  -webkit-flex: 1 0 100%;
  -ms-flex: 1 0 100%;
  flex: 1 0 100%;
}

/* Fancy it up! */
/* line 21, ../sass/test.scss */
.a {
  background: #ff9999;
  -webkit-flex: 1 1 10em;
  -ms-flex: 1 1 10em;
  flex: 1 1 10em;
}

/* line 26, ../sass/test.scss */
.b {
  background: #00e600;
  -webkit-flex: 1 1 10em;
  -ms-flex: 1 1 10em;
  flex: 1 1 10em;
}

/* line 31, ../sass/test.scss */
.c {
  background: #9999ff;
  -webkit-flex: 1 1 40%;
  -ms-flex: 1 1 40%;
  flex: 1 1 40%;
}

<div class="wrapper">
  <div class="a">
    <div>a</div>
    <div>a</div>
    <div>a</div>
    <div>a</div>
    <div>a</div>
  </div>

  <div class="b">
    <div>b</div>
  </div>

  <div class="c">
    <div>c</div>
    <div>c</div>
  </div>
</div>

浏览器支持:Opera,Chrome,IE10。当Firefox最终完成支持当前的Flexbox草案包括 flex-wrap时,它也将在那里工作。

答案 1 :(得分:0)

你基本上必须假装它。你需要确保三列有包装 - 并且整个事物周围有一个包装器。然后,您可以执行CSS Faux columns之类的操作,使第二列看起来与其他两列一样高。

答案 2 :(得分:0)

根据一些人的推荐,我最终使用了一些简单的javascript来完成这项工作:

$(document).ready(function() {
   var c1Rows = $(".col1 .row").length;
   var c3Rows = $(".col3 .row").length;

   var minHeight = 50;
   var max = Math.max(c1Rows, c3Rows);
   var totalHeight = max * minHeight;

   $(".col1 .row").css("height", totalHeight / c1Rows);
   $(".col2 .row").css("height", totalHeight);
   $(".col3 .row").css("height", totalHeight / c3Rows);
});