特定の質問への回答
あなたのコードは、コンテナ内のすべての列をチェックしていました。あなたがする必要があるのは次のとおりです。
- 各コンテナをループ
- そのコンテナ内の各列の高さを取得します
- 最も高いものを見つける
- 次の列に進む前に、そのコンテナー内のすべての列にその高さを適用します。
注: 問題の 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
し、それぞれload
について-1
、そのカウントからゼロになるまで、イコライザーを起動することです。
ここでの注意点はload
、画像がキャッシュにある場合、すべてのブラウザーで起動しない可能性があることです。google/github を見回すと、そこにソリューション スクリプトがあるはずです。これを書いている時点で、Alexander Dickson の waitForImages を見つけました(未テスト、これは推奨ではありません)。
- もう 1 つの信頼性の高いソリューションは、
window.load
イベントです。これは通常、常に機能するはずです。ただし、ドキュメントを確認すると、すべての外部リソースが読み込まれた後にこのイベントが発生することがわかります。これは、画像が読み込まれているが、ダウンロードを待っている JavaScript がある場合、それが完了するまで起動しないことを意味します。
外部データの大部分を非同期でロードし、負荷を最小限に抑え、圧縮し、分散することに長けている場合、おそらくこの方法で問題が発生することはありませんが、CDN が突然遅くなると (常に発生します)、問題が発生する可能性があります。
どちらの場合も、ばかげたアプローチを取り、フォールバック タイマーを適用することができます。イベントが発生しない場合、または何かが制御不能な場合に備えて、設定した数秒後にイコライズ スクリプトを自動的に実行します。絶対確実というわけではありませんが、実際には、タイマーを正しく調整すれば、このフォールバックで訪問者の 99% を満足させることができます。
数年後、これはまだ賛成票を集めています。最近ではフレックスボックスが広くサポートされているため、JSを使用している特定の理由がない限り、これには単なるCSSを検討することをお勧めします
.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>