スライダーで各スライドのコンテンツ量が異なる場合、高さがバラバラになって見た目が乱れます。この記事ではjQueryで高さを動的に揃える方法・matchHeight・slickのadaptiveHeight・CSSのみの解決方法まで解説します。
この記事でわかること
- jQueryで全スライドの最大高さを取得して揃える
- jquery.matchHeight.jsを使った高さ揃え
- slick.jsのadaptiveHeightオプション
- CSSのflexboxで高さを揃える(jQuery不要)
- 画像読み込み後の高さ再計算
実装方法の比較
| 方法 | 特徴 | 推奨場面 |
|---|---|---|
| jQuery自作 | 依存ゼロ・軽量 | シンプルな構成 |
| matchHeight.js | グループ管理・画像対応・レスポンシブ | 複数箇所で高さ揃えが必要な場合 |
| slick adaptiveHeight | アクティブスライドに合わせて変化 | slick使用時 |
| CSS flexbox | jQuery不要・最もシンプル | スライドが横に並ぶ構成 |
jQueryで最大高さを取得して全スライドに適用する
function equalizeSlideHeights() {
var $slides = $('.slide');
// いったんautoにリセット(リサイズ時の再計算のため)
$slides.height('auto');
// 全スライドの高さを取得して最大値を求める
var maxH = 0;
$slides.each(function () {
maxH = Math.max(maxH, $(this).outerHeight());
});
// 全スライドに最大高さを設定
$slides.height(maxH);
}
$(function () {
equalizeSlideHeights();
// リサイズ時に再計算(debounce)
var resizeTimer;
$(window).on('resize', function () {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(equalizeSlideHeights, 200);
});
});
height(“auto”)でリセット後に計算する
リサイズ時に再計算する場合、前回設定した高さが残ったまま計算すると正しい値が取れません。
リサイズ時に再計算する場合、前回設定した高さが残ったまま計算すると正しい値が取れません。
.height("auto") で自然な高さに戻してから最大値を求めてください。画像読み込み後に高さを再計算する
$(function () {
// 全ての画像が読み込まれてから高さを揃える
$(window).on('load', function () {
equalizeSlideHeights();
});
// DOMContentLoaded時点でも一度実行(画像なしスライドの即時対応)
equalizeSlideHeights();
});
画像を含むスライドはwindow loadを待つ
画像の読み込み前は高さが0になるため、
画像の読み込み前は高さが0になるため、
$(window).on("load") の中で実行してください。DOMContentLoadedだけでは不十分です。imagesLoaded ライブラリを使うと特定のコンテナの画像読み込み完了を検知できます。matchHeight.jsを使った実装
jquery.matchHeight.jsは画像読み込み・レスポンシブ・複数グループに自動対応します。詳しくはmatchHeight.jsの完全ガイドも参照してください。
$(function () {
// インストール後、セレクターを指定するだけ
$('.slide').matchHeight();
// グループ別に管理
$('.slide .card-title').matchHeight();
$('.slide .card-body').matchHeight();
});
slick.jsのadaptiveHeightを使う
$(function () {
$('#slider').slick({
adaptiveHeight: true, // アクティブスライドの高さに合わせてスライダーが変化
// 全スライドを同じ高さにしたい場合は false(デフォルト)
});
});
adaptiveHeight=falseで全スライド同じ高さ
slickはデフォルトで全スライドの最大高さに揃えます(
slickはデフォルトで全スライドの最大高さに揃えます(
adaptiveHeight: false)。adaptiveHeight: true にすると、スライド切り替え時にアクティブスライドの高さに変化します。どちらが適切かはデザイン要件次第です。CSSのflexboxで高さを揃える(jQuery不要)
.slider {
display: flex;
align-items: stretch;
overflow: hidden;
}
.slide {
flex: 0 0 100%;
display: flex;
flex-direction: column;
}
.slide .card {
height: 100%;
display: flex;
flex-direction: column;
}
.slide .card-body {
flex: 1;
}
まとめ
スライドの高さ揃えのポイントをまとめます。
- jQuery自作: height(“auto”)でリセット → outerHeight()で最大値 → .height(maxH)
- 画像対応: $(window).on(“load”)内で実行
- matchHeight.js: グループ・画像・レスポンシブを自動管理
- slick: adaptiveHeight=false(デフォルト)で最大高さに自動揃え
- CSS flexbox: align-items:stretchでJSなしで揃えられる
関連記事: matchHeight.jsで要素の高さを揃える完全ガイド / 要素の幅・高さを取得する完全ガイド
よくある質問(FAQ)
Qレスポンシブで高さが崩れます。
Aウィンドウリサイズ時に
height("auto") でリセットしてから再計算してください。debounce(200ms)で間引いて実行することも重要です。matchHeight.jsを使う場合は $.fn.matchHeight._update() を呼ぶと手動更新できます。Qモバイルでは高さを揃えたくないです。
Aウィンドウ幅で条件分岐します:
if ($(window).width() >= 768) { equalizeSlideHeights(); } else { $(".slide").height("auto"); }matchHeight.jsでは { enabled: $(window).width() >= 768 } オプションを使えます。Qslick.jsで高さが揃わないです。
Aslickの
adaptiveHeight: false(デフォルト)は全スライドの最大高さに揃えます。それでも揃わない場合はCSSの問題が多いです。.slick-track { display: flex; align-items: stretch; } と.slick-slide { height: auto; display: flex !important; } を追加する解決策もあります。Q非表示スライドの高さが0になります。
A
display:none の要素は outerHeight() が0を返します。cloneして一時的に表示してから高さを取得するか、visibility:hidden; position:absolute で表示して高さを取得してから戻す方法を使ってください。Qスライドにアコーディオンが含まれている場合は?
Aアコーディオンの開閉で高さが変わるため、アコーディオンの
click イベント後にもequalizeSlideHeights() を呼ぶ必要があります。ResizeObserver でスライドの高さ変化を監視して自動再計算する実装も堅牢です。

