はじめに
こんにちは、北陸のwebコーダーdaimaです。
記事一覧など
複数のボックスが横並びになった
レイアウトを組む時に困るのが、
文字数などの違いによって
ボックス内の各要素の高さが
ずれてしまうことです。

↑同じレイアウトでも、中身の文字数が違うと高さがずれてしまう…
この問題の解決法としては
jquery.matchHeight.jsなどの
jQueryプラグインを使う手もありますが
保守性を考慮すれば、この程度の処理は
できる限り自力で解決してしまいたいものですよね。
そこで本日はプラグインなしで
簡単に複数要素の高さ揃えができる
便利なjQueryコードをご紹介したいと思います。
コード
動作確認用デモページ
上記のデモページを開いて
ウィンドウを少しづつ縮めてみてください。
同じ行のボックス内の
タイトルやテキストのボックスの高さが
常に揃っていることが確認できるはずです。
HTMLコード
<div class="wrapper"> <div class="wrapper_wrapper js_syncTarget" data-group_amount="3"> <div class="box"> <a href="" class="box_link"></a> <div class="box_image box_image__1"> </div> <div class="box_ttl js_syncTarget_c g1"> レジデンス北村 204号室 </div> <div class="box_text js_syncTarget_c g2"> 南向きの日当たりの良いお部屋となっています。 </div> <div class="box_cat js_syncTarget_c g3"> <div class="box_cat_item">1人暮らし向き</div> <div class="box_cat_item">ペット可</div> <div class="box_cat_item">インターフォンあり</div> </div> </div> <div class="box"> <a href="" class="box_link"></a> <div class="box_image box_image__2"> </div> <div class="box_ttl js_syncTarget_c g1"> コンフォート4 105号室 </div> <div class="box_text js_syncTarget_c g2"> バリアフリーを意識したご高齢の方も暮らしやすいお部屋です。徒歩五分以内の位置にスーパーもあります。 </div> <div class="box_cat js_syncTarget_c g3"> <div class="box_cat_item">1~2人暮らし向き</div> <div class="box_cat_item">バリアフリー設計</div> </div> </div> <div class="box"> <a href="" class="box_link"></a> <div class="box_image box_image__3"> </div> <div class="box_ttl js_syncTarget_c g1"> ヴィラ東山 502号室 </div> <div class="box_text js_syncTarget_c g2"> 開放的なお部屋が特徴的な自由度の高いお部屋です。 </div> <div class="box_cat js_syncTarget_c g3"> <div class="box_cat_item">ファミリー向き</div> <div class="box_cat_item">キッチン</div> <div class="box_cat_item">バルコニー</div> <div class="box_cat_item">エアコン付き</div> <div class="box_cat_item">家具付き</div> <div class="box_cat_item">インターフォンあり</div> </div> </div> </div> <div class="wrapper_wrapper js_syncTarget" data-group_amount="3"> <div class="box"> <a href="" class="box_link"></a> <div class="box_image box_image__4"> </div> <div class="box_ttl js_syncTarget_c g1"> レジデンス北村 204号室 </div> <div class="box_text js_syncTarget_c g2"> 南向きの日当たりの良いお部屋となっています。 </div> <div class="box_cat js_syncTarget_c g3"> <div class="box_cat_item">1人暮らし向き</div> <div class="box_cat_item">ペット可</div> <div class="box_cat_item">インターフォンあり</div> </div> </div> <div class="box"> <a href="" class="box_link"></a> <div class="box_image box_image__5"> </div> <div class="box_ttl js_syncTarget_c g1"> コンフォート4 105号室 </div> <div class="box_text js_syncTarget_c g2"> バリアフリーを意識したご高齢の方も暮らしやすいお部屋です。徒歩五分以内の位置にスーパーもあります。 </div> <div class="box_cat js_syncTarget_c g3"> <div class="box_cat_item">1~2人暮らし向き</div> <div class="box_cat_item">バリアフリー設計</div> </div> </div> <div class="box"> <a href="" class="box_link"></a> <div class="box_image box_image__6"> </div> <div class="box_ttl js_syncTarget_c g1"> ヴィラ東山 502号室 </div> <div class="box_text js_syncTarget_c g2"> 開放的なお部屋が特徴的な自由度の高いお部屋です。 </div> <div class="box_cat js_syncTarget_c g3"> <div class="box_cat_item">ファミリー向き</div> <div class="box_cat_item">キッチン</div> <div class="box_cat_item">バルコニー</div> <div class="box_cat_item">エアコン付き</div> <div class="box_cat_item">家具付き</div> <div class="box_cat_item">インターフォンあり</div> </div> </div> </div> </div>
HTMLに必要な準備は次の3つ。
1つ目は高さを調整したい要素の親要素に
『js_syncTarget』クラスを持たせること。
サンプルでは行をそれぞれ囲む
『wrapper_wrapper』クラスに
これを持たせてあります。
2つ目は同じく高さを調整したい
要素の親にデータ属性『group_amount』を持たせ、
その値に高さを調整したい要素の合計数を指定すること。
(今回の例だと「タイトル」「テキスト」「カテゴリ」の
三か所をそれぞれ調整しているので
data-group_amountの数値は”3″になっています。)
最後に3つ目は高さを調整したい要素それぞれに
『js_syncTarget_c』クラスと
『g{高さを揃えたい要素の集まりを表す連番の数字}(例g1,g2,g3…)』クラスを持たせることです。
この辺、言葉で伝えると
少しややこしく感じられますが
サンプルコードと交互に見ていただければ
わりと簡単に理解できるかと思います。
javascriptコード
if($('.js_syncTarget').length){
var myBreakPoint = 840;//ブレイクポイント
var target = $('.js_syncTarget');//高さをそろえたい要素の親要素
var target_c;//高さをそろえる要素
var group_amount;//高さを揃えたいグループの総数
var maxHeight = 0;//グループ内で最も高い要素を記憶する
function heightSync(target){
target.each(function(){
group_amount = $(this).data('group_amount');
for (var i = 0; i < group_amount; i++) {
maxHeight = 0;
console.log(i);
target_c = $(this).find('.js_syncTarget_c.g' + (i + 1));
target_c.height('auto');
target_c.each(function(){
if($(this).height() > maxHeight) {
maxHeight = $(this).height();
}
});
target_c.height(maxHeight);
}
});
}
heightSync(target);
$(window).resize(function(){
var w = $(window).width();
if(w > myBreakPoint) {
heightSync(target);
} else {
$('.js_syncTarget_c').height('auto');
}
});
}
javascriptの記述です。
HTMLで指定したグループごとに
それぞれの要素の高さをすべて取得して
その中で最も高さの高い要素に
全ての要素が揃うように処理しています。
また、横並びの要素は
スマホレイアウトの場合
一列になるケースがほとんどのため
今回のコードでも変数myBreakPointに
指定したウィンドウサイズを下回った場合に
自動で高さ調整が解除されるようにしてあります。
ですのでmyBreakPointの数値は
ご自身のサイトのブレイクポイントの数字に
書き換えてご使用ください。
CSSコード
.wrapper{
width: 90%;
padding-top: 20px;
margin-top: 60px;
padding-bottom: 120px;
max-width: 1040px;
margin-left: auto;
margin-right: auto;
border-top: 10px solid #89b8ac;
}
.wrapper_wrapper{
display: -webkit-box;
display: -ms-flexbox;
display: flex;
margin-bottom: 20px;
}
@media screen and (max-width: 840px){
.wrapper_wrapper{
display: block;
margin-bottom: 40px;
}
}
.box_image{
background-size:cover;
background-position:center;
margin-bottom: 25px;
}
.box_image.box_image__1,.box_image.box_image__4{
background-image:url(https://spreadsheep.net/wp-content/uploads/2019/02/room1-min.jpg);
}
.box_image.box_image__2,.box_image.box_image__5{
background-image:url(https://spreadsheep.net/wp-content/uploads/2019/02/room2-min.jpg);
}
.box_image.box_image__3,.box_image.box_image__6{
background-image:url(https://spreadsheep.net/wp-content/uploads/2019/02/room3-min.jpg);
}
.box_image:before{
content: "";
padding-top: 67.7%;
display: block;
}
.box_ttl{
font-size: 22px;
letter-spacing: 0.1em;
margin-bottom: 20px;
line-height: 1.4;
padding: 0 20px;
box-sizing: border-box;
}
.box_text{
letter-spacing: 0.1em;
line-height: 1.9;
margin-bottom: 40px;
padding: 0 20px;
box-sizing: border-box;
}
.box{
position: relative;
width: calc((100% - 40px) / 3);
margin-right: 20px;
border-bottom: 10px solid #89b8ac;
padding-bottom: 40px;
border: 1px solid #89b8ac;
box-sizing: border-box;
}
@media screen and (max-width: 840px){
.box{
width: 100%;
margin-right: 0px;
margin-bottom: 40px;
}
}
.box:last-child{
margin-right: 0;
}
.box_cat{
padding: 0 15px;
box-sizing: border-box;
display: flex;
flex-wrap: wrap;
align-items:flex-start;
align-content: baseline;
}
.box_cat_item{
font-size: 13px;
margin-bottom: 10px;
border: 1px solid #ccc;
padding: 5px 10px;
margin: 0 5px 10px;
}
.box_link{
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
念のため、
サンプルページのCSSも記載しておきます。
おわりに
要素の高さ揃え処理の
コードと解説は以上になります。
要素の高さを揃えたいけれど
できる限りプラグインには頼りたくないという方は
ぜひ今回のコードを試してみてください。
それでは!



コメント