Vanilla JSでmatchHeightを自作してnpm公開してみた【jQuery不使用】

実務で地味に使う「高さ揃え」。

カードUIや一覧レイアウトで、

  • タイトルの高さがバラバラ
  • 行ごとに高さを揃えたい
  • デザインが微妙に崩れる

…みたいなこと、まだありますよね?

昔はjQueryを使用していたこともあり、 jquery-match-height を使っていました。

でも最近は、

  • できるだけ jQuery を使わない構成にしたい
  • 依存を増やしたくない
  • 本当に必要な機能だけ欲しい

という案件が増えてきました。

そこで、

「じゃあVanilla JSで作ればよくない?」

と思って作ってみたのが
vanilla-matchheight です。

👉 https://www.npmjs.com/package/@neruco/vanilla-matchheight


実務で困っていたこと

WordPress案件でよくあるのが、

  • ACFでカードを量産
  • タイトルや説明文の文字数がバラバラ
  • デザインは“きれいに揃っている前提”

という状況。

CSSだけでなんとかしようとすると限界があって、
結局JSで高さを揃えることになります。

でも、

「そのためだけにjQuery入れるのもな…」

というモヤモヤがずっとありました。


作ったもの

See the Pen @neruco/vanilla-matchheight demo by あお@neruco (@coder_ao) on CodePen.

今回作ったライブラリは、やっていることはシンプルです。

  • 同じ data-mh を持つ要素をグループ化
  • 行ごとに最大の高さを計算
  • その高さを適用

例えばこんな感じ。

HTML

<div class="card" data-mh="group1">Card A</div>
<div class="card" data-mh="group1">Card B</div>
<div class="card" data-mh="group1">Card C</div>

JavaScript

VanillaMatchHeight.applyDataApi();

これだけで、同じ data-mh を持つ要素同士の高さが揃います。


タイトルだけ揃える、みたいなこともできる

実務だと、

  • カード全体の高さを揃えたい
  • さらに、カード内のタイトル(h3)も揃えたい

というケースもあります。

その場合は、グループを分けるだけ。

<article class="card" data-mh="cards-a">
<h3 data-mh="cards-a-title">Title</h3>
</article>

cards-acards-a-title を別グループとして扱えばOKです。

実務目線で「こういうの欲しかった」を詰め込みました。


CDNでもnpmでも使えるようにした

せっかく作るなら、ちゃんと公開しようと思い、

  • UMD形式で出力
  • npm公開
  • jsDelivr対応

までやってみました。

CDNで使う場合はこんな感じです。

<script src="https://cdn.jsdelivr.net/npm/@neruco/vanilla-matchheight@1.0.0/dist/vanilla-matchheight.umd.min.js"></script>

まとめ

今回やってみて思ったのは、

  • 実務の小さな不満は、自分で解決できる
  • jQueryなしでも高さ揃えは十分実装できる
  • npm公開は思っていたよりハードルが低い

ということ。

もし、

  • jQueryを減らしたい
  • 軽量な高さ揃えが欲しい
  • 実務向けのシンプルな実装を探している

という方がいたら、よかったら使ってみてください。

👉 https://www.npmjs.com/package/@neruco/vanilla-matchheight