具有子项的等高列的响应式跨浏览器解决方案

Responsive cross browser solution for equal height columns with children

开门见山。

我需要一个响应式两列组件布局的解决方案,如下图所示。

.left / .right 列的宽度比例应始终为 .parent 的 75 / 25%,并且它们的高度应始终保持同步。

.left 列应包含一张图像,该图像的宽度和高度会随着视口的每次变化而缩放,.right 列应包含三个子元素 (.cta),它们恰好为 1 /3 每个 .parent 高度。

可接受的解决方案的标准是:

我最接近满意的解决方案是使用 display: table-cell; 来确保 .left.right 高度始终同步。不幸的是,此解决方案在 IE 中不起作用,因为 CSS 规范明确指出,如果父容器和子容器都使用百分比来定义它们的维度,并且它们依赖于彼此的流来计算这些维度,则结果是未定义的.这会影响 .right 容器高度,它会在除 IE 之外的所有浏览器中扩展到全高。

Codepen example

HTML

<div class="parent">
  <div class="left">
    <div class="image-container"><img class="image" src="http://placehold.it/1300x780" alt="" /></div>
  </div>
  <div class="right">
    <div class="cta">
      <a>LINK #1</a>
    </div>
    <div class="cta">
      <a>LINK #2</a>
    </div>
    <div class="cta">
      <a>LINK #3</a>
    </div>
  </div>
</div>

CSS

.parent {
  display: table;
  width: 90%;
  height: 100%;
  margin: 0 auto;
}

.parent > div {
  display: table-cell;
  height: 100%;
  vertical-align: top;
  text-align: center;
}

.left {
  width: 75%;
}

.image {
  display: block;
  width: 100%;
  height: auto;
}

.right {
  width: 25%;
  background: #bbb;
}

.cta {
  display: table;
  width: 100%;
  height: 33.33%;
  font-family: Helvetica, Arial, sans-serif;  
  overflow: hidden;
  background: #bbb;
  color: #fff;
  text-transform: uppercase;
  text-align: center;
}

.cta a {
  display: table-cell;
  vertical-align: middle;
  height: 100%;
  cursor: pointer;
}

如果一切都失败了,总有 JavaScript 作为备用解决方案。但让我感到困惑的是,在 2016 年。我们仍然被诅咒处理黑客来实现像我需要的这样简单的解决方案。

如果跨浏览器但不适合恐龙,那么 inline-block 和一小撮 calc() 可能会有所帮助:

* {
  box-sizing: border-box;
  margin:0;
}
.parent div div a,
.parent div  div {
  border: solid 1px;
}
.parent div.left {
  padding: 1em;
  border: solid 1px;
}
.parent div {
  display: inline-block;
  vertical-align: top;
  width: 100%;
}
.parent {
  width: 70%;/* demo purpose, do run it in full page too */
  margin: auto;
  background:yellow;
}
img {
  width: 100%;
  display: block;
}
.parent .left {
  width: 75%;
}
.parent .right {
  width: 25%;
}
.parent div div a {
  margin: 0.88em;
  display: block;
  text-align: center;
  /* if floatting pseudo do
  overflow:hidden;*/
}
.parent div div a:before {
  content: '';
  padding-top: calc(60% - 0.5em);/* is calc() allowed ?  if not keep 60% and remove margin:1em from links */
  /* float:left; or with vertical-align */
  display: inline-block;
  vertical-align: middle;
}
<div class="parent">
  <div class="left">
    <div class="image-container">
      <img class="image" src="http://placehold.it/1300x780" alt="" />
    </div>
  </div><!-- cure white-space disturbance
  --><div class="right">
    <div class="cta">
      <a>LINK #1</a>
    </div>
    <div class="cta">
      <a>LINK #2</a>
    </div>
    <div class="cta">
      <a>LINK #3</a>
    </div>
  </div>
</div>

http://codepen.io/anon/pen/VjpdZE

IE11 明白了: