【发布时间】: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 之外的所有浏览器中扩展至全高。
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 的目的。