2018.10.08

jQuery非依存のVanilla JavaScriptモーダルウィンドウライブラリ Micromodal.js


この記事では、JavaScript モーダルウィンドウライブラリ、Micromodal.js を紹介します。

Micromodal.js は以下の特徴を持っています。

  • 軽量である(1.9 KB!)
  • WAI-ARIA ガイドライン に則ったアクセシビリティ対応
  • ライブラリに依存しない Pure JavaScript で書かれている
  • スタイルが自由(デフォルトの装飾が適用されていない)

CSS が付属されていないのがサイトのテイストに合わせやすくて逆に嬉しいです。jQuery 製のライブラリは結構個性的な装飾ついちゃってること多い気がするので。Pure JavaScript なので Vue や React とも相性が良さそうです。

というわけで、ここから使いかたを紹介していきます。

Micromodal.js の使いかた

インストール

まずはインストール方法です。npm リポジトリおよび CDN に公開されています。

npm

$ npm install micromodal --save

yarn

$ yarn add micromodal --save

CDN

https://unpkg.com/micromodal/dist/micromodal.min.js

ライブラリの基本動作

後述する起動時のオプションによっても異なりますが、基本の動作を先に説明します。

モーダルが閉じた状態:

<div id="modal-1" aria-hidden="true"><!-- Content --></div>

モーダルが開いた状態:

<div id="modal-1" aria-hidden="false" class="is-open"><!-- Content --></div>

このライブラリの挙動は非常に単純です。① aria-hidden の値を切り替える、② classis-open をつけたり外したりする、ということしかやりません。

モーダルの中身のマークアップもスタイルも、開閉時のアニメーションなども開発者に委ねられています。とはいえ サンプルの HTML と CSS が公開されているので、こちらをベースにプロジェクトに合わせてカスタマイズしていくとよいでしょう。

装飾のためのクラスや後述する data 属性をすべて取り払うと、以下のようなマークアップがベースの骨組みになっていることがアクセシビリティという Micromodal のテーマからしても好ましいようです。

<div id="modal-1" aria-hidden="true">
  <div tabindex="-1">
    <div 
      role="dialog"
      aria-modal="true"
      aria-labelledby="modal-1-title"
      aria-describedby="modal-1-content"
    >
      <header>
        <h2 id="modal-1-title">Micromodal</h2>
      </header>
      <main id="modal-1-content">
        <p>Modal content</p>
      </main>
    </div>
  </div>
 </div>

data 属性で制御する

data 属性からモーダルの開閉を制御する方法を紹介します。

<!-- モーダル -->
<div id="modal-1" aria-hidden="true">
  <!-- この div がオーバーレイになるとする -->
  <div tabindex="-1" data-micromodal-close>
    <div  role="dialog" aria-modal="true" aria-labelledby="..." aria-describedby="...">
      <!-- 略 -->
    </div>
  </div>
</div>

<!-- 開くボタン -->
<button data-micromodal-trigger="modal-1">open</button>

<script>
  MicroModal.init();
</script>

モーダルのマークアップの一番外側に id を付与します。

モーダルを開くためのボタンやリンクに data-micromodal-trigger 属性を付与します。属性値は開きたいモーダルの id です。

クリックしたときにモーダルを閉じる機能を持たせたい要素に data-micromodal-close 属性を付与します。属性値は不要で、先祖要素のモーダルを閉じます。上記の例であれば、オーバーレイをクリックするとモーダルが閉じる挙動を実現できます。

MicroModal オブジェクトの init メソッドを呼び出します。まず data-micromodal-trigger 属性が検索され、その属性値を id に持つ要素がモーダルと認識されます。

JavaScript から操作する

data 属性ではなく、JavaScript からモーダルを開閉することもできます。

MicroModal.show('modal-id');
MicroModal.close('modal-id');

ボタンやリンククリック以外のきっかけでモーダルを操作したい場合に有効です。例えば Ajax 通信の結果をもとにモーダルを表示するなどでしょうか。

オプション

モーダルの挙動を制御するためのオプションがいくつか用意されています。

init の第一引数または show の第二引数にオプションオブジェクトを渡します。

MicroModal.init({
  disableScroll: true,
  disableFocus: true,
});

MicroModal.show('modal-1', {
  // show メソッドにもオプションを渡せます
  awaitCloseAnimation: true
});

オプションの一覧は以下の通りです。

オプション 説明
onShow function モーダルが開くタイミングで実行される関数。modal オブジェクトを引数にとります。
onClose function モーダルが閉じるタイミングで実行される関数。modal オブジェクトを引数にとります。
openTrigger string モーダルを開く要素に付与する属性名。デフォルト値は "data-micromodal-trigger" です。
closeTrigger string モーダルを閉じる要素に付与する属性名。デフォルト値は "data-micromodal-close" です。
disableScroll boolean モーダル裏の画面スクロールを制御します。デフォルト値は false です。(つまりスクロールする)
disableFocus boolean モーダルを開いたときに最初のフォーカス可能な要素にフォーカスが当たるか制御します。デフォルト値は false です。(つまりフォーカスが当たる)
awaitCloseAnimation boolean モーダルを閉じるときの CSS アニメーションを待つかどうかを制御します。デフォルト値は false です。(つまり待たずにすぐ閉じる)
debugMode boolean コンソールに警告メッセージを出力するかを制御します。デフォルト値は false です。(つまりメッセージを出力する)

IE 11 対応

ライブラリのコードは ES2015 で書かれているようで、そのままでは IE 11 では動作しません。IE 11 には定義されていないメソッドである Array.fromObject.assign wを使用しているため、それぞれのポリフィルを読み込む必要があります。

それぞれ MDN からポリフィルのコードを引っ張ってきましょう。

Array.from
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Polyfill

Object.assign
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Polyfill

上記のコードを polyfill.js など適当な名前のファイルにコピペして、Micromodal を読み込む前に読み込めば OK です。

HTMLの例
<script src="/js/polyfill.js"></script>
<script src="https://unpkg.com/micromodal/dist/micromodal.min.js"></script>
モダンJSの例
require('./polyfill.js');
const MicroModal = require('micromodal');

以上、Micromodal.js を紹介しました。