jQuery不要の高さ揃えライブラリ
既存のjquery.matchHeight.jsの思想を引き継ぎつつ、バニラJS(UMD)で再実装しました。
行単位(byRow)での高さ揃え、data-mhによるグルーピング、update/destroyなどのAPIを提供します。
- 後継ポイント:
jquery.matchHeight.jsの挙動・使い勝手を尊重しつつ、jQuery依存を排除(DOM APIのみで動作) - 対象ユースケース: 横に並んだカードの高さ揃え、レスポンシブ時の自動再計測、
data-mhでのグループ指定
<script src="./matchHeight.vanilla.js"></script>
<script>
// グローバルに matchHeight が追加されます。
matchHeight('[data-mh="group"]', { byRow: true });
</script>npm i match-height-vanillaCommonJS (Node/Bundler):
const matchHeight = require('match-height-vanilla');
matchHeight('[data-mh="group"]');ESM import(UMDをdefaultとして解決される環境で):
import matchHeight from 'match-height-vanilla';
matchHeight('[data-mh="group"]');注: 本ライブラリは UMD 配布です。多くのバンドラ(Vite/Webpack/Rollup)では
default importとして読み込めます。もしうまく解決されない場合はrequire(...)をご利用ください。
<div class="grid">
<div class="card" data-mh="group1">短い</div>
<div class="card" data-mh="group1">長い長い長いテキスト</div>
<div class="card" data-mh="group1">中くらい</div>
</div>
<script src="./matchHeight.vanilla.js"></script>
<script>
// data-mh="group1" の要素を行ごとに最大値で揃える
matchHeight('[data-mh="group1"]', { byRow: true });
// 画面サイズ変化等に追従させたい場合
matchHeight.enableAutoUpdate();
</script>指定要素の高さを揃えます。
-
elements:string | Element | Element[] | NodeList -
options:byRow(boolean, default:true): 行(同じgetBoundingClientRect().topを持つグループ)ごとに揃えるproperty('minHeight' | 'height', default:'minHeight'): どのCSSプロパティで揃えるかtarget(Element | null, default:null): 指定した要素の高さに合わせるtolerance(number, default:1): 行判定の誤差許容(px)
matchHeight('.card', { byRow: true }); // 行ごと
matchHeight('.plan', { byRow: false }); // 全体で最大値
matchHeight('.col', { target: document.querySelector('.primary') }); // 指定要素に合わせる[data-mh] を持つ要素をスキャンし、グループ名ごとに高さ揃えします。
matchHeight.scan(); // document 全体をスキャン
matchHeight.scan(rootEl, { byRow: true, property: 'minHeight' });再計測して再適用します。elements 省略時は内部レジストリ全体を更新します。
非表示(display:none)→表示に切り替えた直後などに有効。
matchHeight.update(); // すべて再計測
matchHeight.update('.card'); // 指定セレクタのみ再計測指定要素の高さ揃えを解除(inline styleをクリア)します。
matchHeight.destroy('.card');すべての要素に対して解除します。
matchHeight.destroyAll();ResizeObserver が使える環境ではそれを、無い環境では window.resize をスロットルして再計測を自動化します。
matchHeight.enableAutoUpdate();
// matchHeight.disableAutoUpdate();HTML上でグループ名を付けると、scan() でまとめて高さ揃えできます。
<div data-mh="group">A</div>
<div data-mh="group">B</div>
<div data-mh="group">C</div>
<script>
matchHeight.scan(); // "group" ごとに行単位で揃える
</script>- 非表示要素(
display:none)は計測できません。表示タイミングでmatchHeight.update()を呼んでください。 - デフォルトでは
min-heightを使います。heightで揃えたい場合はproperty: 'height'を指定してください。 - 行判定は
getBoundingClientRect().topをもとにtolerance(初期値 1px)で近似マッチさせています。フォントロードやズーム差で微妙にズレるケースではtoleranceを上げてください。 box-sizingが混在していると見た目に差が出る場合があります。必要に応じて CSS を統一してください。
-
目的は同じ(複数要素の高さ揃え)ですが、jQuery依存なしで軽量化しています。
-
代表的な移行例:
- 旧:
$('[data-mh="group"]').matchHeight();新:matchHeight.scan();(またはmatchHeight('[data-mh="group"]')) - 旧:
$('.item').matchHeight({ byRow: false });新:matchHeight('.item', { byRow: false }); - 旧:
$('.item').matchHeight({ remove: true });新:matchHeight.destroy('.item');
- 旧:
MIT
このライブラリは、jquery.matchHeight.js のコンセプトに基づき、jQuery非依存のUMDライブラリとして再実装したものです。オリジナルへの敬意を表します。
0.1.0初版(UMD配布・scan/update/destroy・enableAutoUpdate実装)