回答您的具体问题
您的代码正在检查任何容器中的所有列,您需要做的是:
- 循环遍历每个容器
- 获取该容器内每一列的高度
- 找到最高的
- 在移动到下一列之前,将该高度应用于该容器中的每一列。
注意:尝试提供您的问题的示例 jsfiddle,它使我们能够更轻松地帮助您并理解问题,您可以立即看到有效的解决方案,并鼓励更快的响应。
快速(粗略)示例
$(document).ready(function(){
// Select and loop the container element of the elements you want to equalise
$('.container').each(function(){
// Cache the highest
var highestBox = 0;
// Select and loop the elements you want to equalise
$('.column', this).each(function(){
// If this box is higher than the cached highest then store it
if($(this).height() > highestBox) {
highestBox = $(this).height();
}
});
// Set the height of all those children to whichever was highest
$('.column',this).height(highestBox);
});
});
.container { border 1px solid red; }
.column { border: 1px solid blue; float:left; width: 30%; text-align:center; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="container">
<div class="column">This is<br />the highest<br />column</div>
<div class="column">One line</div>
<div class="column">Two<br />lines</div>
</div>
<div class="container">
<div class="column">One line</div>
<div class="column">Two<br>lines</div>
<div class="column">One line</div>
</div>
图书馆!
这是我发现的一个库,如果你想要一些更聪明的均衡控制,它看起来很有希望
http://brm.io/jquery-match-height-demo/
解决@Mem 的问题
问题:$(document).ready()
如果您有需要加载的图像又会修改容器的高度,是否会起作用?
图像加载后均衡高度
如果您正在加载图像,您会发现此解决方案并不总是有效。这是因为document.ready
在尽可能早的时间被触发,这意味着它不会等待外部资源(例如图像)被加载。
当您的图像最终加载时,它们可能会在均衡脚本运行后扭曲其容器的高度,导致它看起来也不太工作。
用图像解决均衡高度
- 绑定到图像加载事件
这是最好的解决方案(在撰写本文时),涉及绑定到img.load
事件。您所要做的就是计算有多少 img $('img').length
,然后为每个img 计数load
,-1
从该计数直到您达到零,然后触发均衡器。
load
如果图像在缓存中,此处的警告可能不会在所有浏览器中触发。看看google/github,应该有一个解决方案脚本在那里。在撰写本文时,我发现了来自 Alexander Dickson 的 waitForImages(未经测试,这不是背书)。
- 另一个更可靠的解决方案是
window.load
事件。这通常应该始终有效。但是,如果您查看文档,您会注意到在加载所有外部资源后会触发此事件。这意味着如果您的图像已加载但有一些 javascript 等待下载,则在完成之前不会触发。
如果您异步加载大部分外部组件并且巧妙地最小化、压缩和分散负载,您可能不会对这种方法有任何问题,但是突然变慢的 CDN(一直发生)可能会导致问题。
在这两种情况下,您都可以采取愚蠢的方法并应用回退计时器。让均衡脚本在设定的几秒钟后自动运行,以防事件未触发或速度慢到您无法控制的情况。这不是万无一失的,但实际上,如果您正确调整计时器,您将通过此回退满足 99% 的访问者。
多年后,这仍然得到了支持,如今,随着 flexbox 的广泛支持,您可能只想为此考虑纯 CSS,除非您使用 JS 有特定原因
.container {
display: flex;
border: 2px dashed red;
margin: 10px 0;
}
.container > .column {
padding: 10px;
}
.container.fill-width {
justify-content: stretch;
}
.container.fill-width>.column {
flex-grow: 1
}
.container>.column:nth-child(1) {
background: yellow;
}
.container>.column:nth-child(2) {
background: blue;
}
.container>.column:nth-child(3) {
background: green;
}
<div class="container">
<div class="column">Some<br>text</div>
<div class="column">Some<br>more<br>text<br>here</div>
<div class="column">One line</div>
</div>
<div class="container">
<div class="column">Some<br>more<br>even<br>longer<br>text<br>here</div>
<div class="column">Some<br>text</div>
<div class="column">One line</div>
</div>
<div class="container fill-width">
<div class="column">Some<br>more<br>text<br>here</div>
<div class="column">Some<br>text</div>
<div class="column">One line</div>
</div>