【问题标题】:Responsive cross browser solution for equal height columns with children具有子项的等高列的响应式跨浏览器解决方案
【发布时间】:2016-06-29 07:49:17
【问题描述】:

直截了当。

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

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

.left 列应包含一个图像,该图像会随着每个视口的变化而在宽度和高度上进行缩放,.right 列应包含三个子元素 (.cta),每个子元素恰好占 .parent 高度的 1/3 .

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

  • 支持尽可能多的设备和浏览器(IE9+ 很好)
  • 支持 HTC 等品牌喜欢使用的供应商特定浏览器等。
  • flexbox 不是一个选项
  • 虽然使用 JavaScript 为 .left.right 设置显式高度很简单,但我想提出一个非 JS 解决方案

我最接近令人满意的解决方案是使用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 年。我们仍然被诅咒处理黑客来实现像我需要的那样简单的解决方案。

【问题讨论】:

  • 为什么 flexbox 不是一个选项?您抱怨没有简单的解决方案,但您只是排除了最简单的解决方案。
  • @MitchelJager 因为仍然使用现有 Android 浏览器的设备(至少不以标准方式)不支持 flexbox,尤其是整个 HTC 设备系列,它在 IE 中存在错误且不可预测.因此,在这种情况下,它不是一个选项。
  • 我是 flexbox 的粉丝,但你说得对。
  • 反驳您的观点,在移动设备上,您通常将所有内容放在一个列中,从而无需使用 flexbox。尽管我确实认为平板电脑不一定如此。您也可以简单地使用 polyfill,
  • @MitchelJager 在移动设备上具有多列块网格类型的布局并不少见,其中 flexbox 不仅用于管理水平空间,还用于管理垂直空间(等高等)。必须处理不同的满足不同设备需求的代码首先违背了 flexbox 的目的。

标签: css height


【解决方案1】:

如果跨浏览器但不适合恐龙,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 得到它:

【讨论】:

  • 不幸的是,这个解决方案遇到了同样的问题——.right 容器的高度在任何 IE 中都不会扩展到.parent 容器的高度。
  • @holodoc 你在运行什么样的IE?因为,除了 calc() 之外,他们中的大多数人都理解 % 和 inline-block 中的垂直填充(IE6 可能已经出局),但其余的,你让我感到惊讶 :) 我将带有边框和背景的 sn-p 更新为parent .parent,还链接了一个codepen
  • 我已经在几台运行 IE9、IE10 和 IE11 的本地机器上运行了代码,然后在几台 browserstack.com 机器上进行了同样的尝试。所有人都得出了否定的结果。但是,您发布的代码笔很奇怪。我将不得不仔细查看代码。我不会将您的帖子标记为答案,只是看看是否有其他人可能会做出贡献。除此之外,非常感谢您的意见。
  • @holodoc 奇怪,我很好奇,你自己的测试是否在线,我想看看我的 IE11 行为,并希望看看它在哪里或为什么会中断:)
  • 我真的很喜欢这个解决方案背后的想法,但是我决定在这里使用 JavaScript 有一个简单的原因 - 浏览器舍入百分比数学的方式不一致,这通常会导致 .right 之间存在 1-2px 的差异和.left 高度。如果由于背景而没有要求使布局像素完美,我会使用这种方法,甚至不加考虑。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2011-03-05
  • 1970-01-01
  • 2016-03-31
  • 2014-05-03
  • 2019-09-03
  • 2011-07-13
相关资源
最近更新 更多