「Micromodal.js」を利用してモーダルウインドウを実装する方法
「Micromodal.js」を利用してモーダルウインドウを実装する方法
導入方法
CDN
以下のファイルをJSファイルを読み込んでください。
<script src="https://unpkg.com/micromodal/dist/micromodal.min.js"></script>
または、
<script src="https://cdn.jsdelivr.net/npm/micromodal/dist/micromodal.min.js"></script>
HTMLマークアップ
まず、DIVタグでモーダルダイアログの領域を定義します。
<div id="modal-1" aria-hidden="true" class="modal">
...
</div>
次に、モーダルダイアログのダイアログ外の背景領域を定義します。通常、この領域をクリックするとモーダルダイアログが閉じられます。
<div id="modal-1" aria-hidden="true" class="modal">
<div tabindex="-1" data-micromodal-close>
...
</div>
</div>
「data-micromodal-close」属性は、クリックすると、モーダルダイアログが閉じられる属性になります。
<div id="modal-1" aria-hidden="true" class="modal">
<div tabindex="-1" data-micromodal-close>
<div role="dialog" aria-modal="true" aria-labelledby="modal-1-title" >
...
</div>
</div>
</div>
「role=”dialog”」はダイアログ領域を認識させる属性です。
<div id="modal-1" aria-hidden="true" class="modal">
<div tabindex="-1" data-micromodal-close>
<div role="dialog" aria-modal="true" aria-labelledby="modal-1-title" >
<header>
<h2 id="modal-1-title">
...
</h2>
</header>
</div>
</div>
</div>
また、「aria-labelledby=”modal-1-title”」はモーダルダイアログのタイトル領域を示す属性になります。
<div id="modal-1" aria-hidden="true" class="modal">
<div tabindex="-1" data-micromodal-close>
<div role="dialog" aria-modal="true" aria-labelledby="modal-1-title" >
<header>
<h2 id="modal-1-title">
...
</h2>
<button aria-label="Close modal" data-micromodal-close>×</button>
</header>
</div>
</div>
</div>
属性「data-micromodal-close」を設定したボタンを設置すれば、閉じるボタンが実装できます。
<div id="modal-1" aria-hidden="true" class="modal">
<div tabindex="-1" data-micromodal-close>
<div role="dialog" aria-modal="true" aria-labelledby="modal-1-title" >
<header>
<h2 id="modal-1-title">
...
</h2>
<button aria-label="Close modal" data-micromodal-close>×</button>
</header>
</div>
</div>
</div>
<button data-micromodal-trigger="modal-1" class="modal-open">開く</button>
モーダルダイアログを開くボタンを設置します。
属性「data-micromodal-trigger」の値にモーダルダイアログ領域のIDを指定すればモーダルダイアログを開くボタンを設置できます。
MicroModal初期化
最後に「MicroModal」を初期化してください。
<script>
MicroModal.init();
</script>
サンプル/デモ
デモ1
サイトにも記載されているもっともシンプルなサンプルになります。
サンプル
スタイルシートの定義が最低限しかないため、俗にいう「モーダルダイアログ」のようには表示されません。
HTMLコード
<html>
<head>
<title>Micromodal</title>
<script src="https://unpkg.com/micromodal/dist/micromodal.min.js"></script>
<style type="text/css">
.modal {
display: none;
}
.modal.is-open {
display: block;
}
</style>
</head>
<body>
<!-- [1] -->
<div id="modal-1" aria-hidden="true" class="modal">
<!-- [2] -->
<div tabindex="-1" data-micromodal-close>
<!-- [3] -->
<div role="dialog" aria-modal="true" aria-labelledby="modal-1-title" >
<header>
<h2 id="modal-1-title">
Modal Title
</h2>
<!-- [4] -->
<button aria-label="Close modal" data-micromodal-close>×</button>
</header>
<div id="modal-1-content">
Modal Content
</div>
</div>
</div>
</div>
<button data-micromodal-trigger="modal-1" class="modal-open">開く</button>
<script>
MicroModal.init();
</script>
</body>
</html>
デモ
デモ2
最初のデモが最もシンプルなパターンだったので、次は、それなりにモーダルダイアログっぽくしてある、サンプルです。
以下のページを参考にしてあります。
サンプル
HTMLコード
<html>
<head>
<script src="https://unpkg.com/micromodal/dist/micromodal.min.js"></script>
<title>Micromodal demo(2)</title>
<style type="text/css">
/* モーダル */
.modal-overlay {
align-items: center;
background: rgba(0,0,0,.6);
bottom: 0;
display: flex;
justify-content: center;
left: 0;
position: fixed;
right: 0;
top: 0;
z-index: 100;
}
.modal-container {
background-color: #fff;
max-height: 80vh;
max-width: 500px;
overflow-y: auto;
padding: 30px;
width: 80%;
}
.modal-header {
align-items: center;
display: flex;
justify-content: space-between;
}
.modal-close {
background: transparent;
border: 0;
}
.modal-header .modal-close::before {
content: "\2715";
}
.modal-content {
line-height: 1.5;
margin-bottom: 2rem;
margin-top: 2rem;
}
.modal-open {
display: block;
/* margin: 100px auto; */
}
/* モーダルアニメーション */
@keyframes mmfadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes mmfadeOut {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
@keyframes mmslideIn {
from {
transform: translateY(15%); /* 下からモーダル表示 */ /* -15%なら上からになります */
}
to {
transform: translateY(0);
}
}
@keyframes mmslideOut {
from {
transform: translateY(0);
}
to {
transform: translateY(-10%); /* 上にモーダルが消えていきます*/ /* 10%にすると下にモーダルが消えます */
}
}
.micromodal-slide {
display: none;
}
.micromodal-slide.is-open {
display: block;
}
.micromodal-slide[aria-hidden="false"] .modal-overlay {
animation: mmfadeIn .3s cubic-bezier(.0, .0, .2, 1);
}
.micromodal-slide[aria-hidden="false"] .modal-container {
animation: mmslideIn .3s cubic-bezier(0, 0, .2, 1);
}
.micromodal-slide[aria-hidden="true"] .modal-overlay {
animation: mmfadeOut .3s cubic-bezier(.0, .0, .2, 1);
}
.micromodal-slide[aria-hidden="true"] .modal-container {
animation: mmslideOut .3s cubic-bezier(0, 0, .2, 1);
}
.micromodal-slide .modal-container,
.micromodal-slide .modal-overlay {
will-change: transform;
}
</style>
</head>
<body>
<div class="modal micromodal-slide" id="modal-1" aria-hidden="true">
<div class="modal-overlay" tabindex="-1" data-micromodal-close>
<div
class="modal-container"
role="dialog"
aria-modal="true"
aria-labelledby="modal-1-title"
>
<header class="modal-header">
<h2 class="modal-title" id="modal-1-title">Micromodal</h2>
<button
class="modal-close"
aria-label="Close modal"
data-micromodal-close
></button>
</header>
<div class="modal-content" id="modal-1-content">
<p class="modal-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute
irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute
irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute
irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.
</p>
<!-- /.modal-text -->
</div>
</div>
</div>
</div>
<!-- 開くボタン -->
<button data-micromodal-trigger="modal-1" class="modal-open">
開く
</button>
<script>
MicroModal.init({
disableScroll: true,
awaitOpenAnimation: true,
awaitCloseAnimation: true
});
</script>
</body>
</html>
デモ
デモ3
このサンプルは以下のページをもとに作成してあります。
サンプル
HTMLコード
<html>
<head>
<script src="https://unpkg.com/micromodal/dist/micromodal.min.js"></script>
<title>Micromodal demo(3)</title>
<style type="text/css">
/**************************\
Basic Modal Styles
\**************************/
.modal {
font-family: -apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica neue,helvetica,ubuntu,roboto,noto,segoe ui,arial,sans-serif;
}
.modal__overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.6);
display: flex;
justify-content: center;
align-items: center;
}
.modal__container {
background-color: #fff;
padding: 30px;
max-width: 500px;
max-height: 100vh;
border-radius: 4px;
overflow-y: auto;
box-sizing: border-box;
}
.modal__header {
display: flex;
justify-content: space-between;
align-items: center;
}
.modal__title {
margin-top: 0;
margin-bottom: 0;
font-weight: 600;
font-size: 1.25rem;
line-height: 1.25;
color: #00449e;
box-sizing: border-box;
}
.modal__close {
background: transparent;
border: 0;
}
.modal__header .modal__close:before { content: "\2715"; }
.modal__content {
margin-top: 2rem;
margin-bottom: 2rem;
line-height: 1.5;
color: rgba(0,0,0,.8);
}
.modal__btn {
font-size: .875rem;
padding-left: 1rem;
padding-right: 1rem;
padding-top: .5rem;
padding-bottom: .5rem;
background-color: #e6e6e6;
color: rgba(0,0,0,.8);
border-radius: .25rem;
border-style: none;
border-width: 0;
cursor: pointer;
-webkit-appearance: button;
text-transform: none;
overflow: visible;
line-height: 1.15;
margin: 0;
will-change: transform;
-moz-osx-font-smoothing: grayscale;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-transform: translateZ(0);
transform: translateZ(0);
transition: -webkit-transform .25s ease-out;
transition: transform .25s ease-out;
transition: transform .25s ease-out,-webkit-transform .25s ease-out;
}
.modal__btn:focus, .modal__btn:hover {
-webkit-transform: scale(1.05);
transform: scale(1.05);
}
.modal__btn-primary {
background-color: #00449e;
color: #fff;
}
/**************************\
Demo Animation Style
\**************************/
@keyframes mmfadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes mmfadeOut {
from { opacity: 1; }
to { opacity: 0; }
}
@keyframes mmslideIn {
from { transform: translateY(15%); }
to { transform: translateY(0); }
}
@keyframes mmslideOut {
from { transform: translateY(0); }
to { transform: translateY(-10%); }
}
.micromodal-slide {
display: none;
}
.micromodal-slide.is-open {
display: block;
}
.micromodal-slide[aria-hidden="false"] .modal__overlay {
animation: mmfadeIn .3s cubic-bezier(0.0, 0.0, 0.2, 1);
}
.micromodal-slide[aria-hidden="false"] .modal__container {
animation: mmslideIn .3s cubic-bezier(0, 0, .2, 1);
}
.micromodal-slide[aria-hidden="true"] .modal__overlay {
animation: mmfadeOut .3s cubic-bezier(0.0, 0.0, 0.2, 1);
}
.micromodal-slide[aria-hidden="true"] .modal__container {
animation: mmslideOut .3s cubic-bezier(0, 0, .2, 1);
}
.micromodal-slide .modal__container,
.micromodal-slide .modal__overlay {
will-change: transform;
}
</style>
</head>
<body>
<div class="modal micromodal-slide" id="modal-1" aria-hidden="true">
<div class="modal__overlay" tabindex="-1" data-micromodal-close>
<div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-1-title">
<header class="modal__header">
<h2 class="modal__title" id="modal-1-title">
Micromodal
</h2>
<button class="modal__close" aria-label="Close modal" data-micromodal-close></button>
</header>
<main class="modal__content" id="modal-1-content">
<p>
<code>タブ</code> キーを押せば、フォーカスたモーダル内でどのように移動するかわかると思います。また、 <code>esc</code> キーを押すとモーダルが閉じます。.
</p>
</main>
<footer class="modal__footer">
<button class="modal__btn modal__btn-primary">続ける...</button>
<button class="modal__btn" data-micromodal-close aria-label="Close this dialog window">閉じる</button>
</footer>
</div>
</div>
</div>
<!-- 開くボタン -->
<button data-micromodal-trigger="modal-1" class="modal-open">
開く
</button>
<script>
MicroModal.init({
onShow: modal => console.info(`${modal.id} is shown`), // [1]
onClose: modal => console.info(`${modal.id} is hidden`), // [2]
openTrigger: 'data-micromodal-trigger', // [3]
closeTrigger: 'data-micromodal-close', // [4]
openClass: 'is-open', // [5]
disableScroll: true, // [6]
disableFocus: false, // [7]
awaitOpenAnimation: false, // [8]
awaitCloseAnimation: false, // [9]
debugMode: true // [10]
});
</script>
</body>
</html>
デモ
オプション
オプション一覧
onShow
モーダルダイアログ表示時に呼び出されるコールバック関数を指定できるオプションです。
onClose
モーダルダイアログが閉じるときに呼び出され鵜rコールバック関数を指定できるオプションです。
openTrigger
モーダルダイアログを表示させるエレメントの属性名を指定できるオプションです。つまり開くボタンい設定する属性名を指定できるオプションです。
デフォルトは『data-micromodal-trigger』です。
closeTrigger
モーダルダイアログを閉じるエレメントの属性名を指定できるオプションです。つまり、閉じるボタンに設定する属性名を指定できるオプションです。
デフォルトは『data-micromodal-close』です。
openClass
モーダルダイアログが開いたときに適用されるカスタムクラスを指定できるオプションです。
デフォルトは『is-open』です。
disableScroll
モーダルダイアログ表示時、ページのスクロールを無効にできるオプションです。
デフォルトは『false』で、無効にはなっていません。
disableFocus
モーダルダイアログ表示時、フォーカス可能なエレメントに自動的にフォーカスを当てること無効にできるオプションです。
デフォルトは『false』で、無効にはなっていません。
awaitOpenAnimation
『true』に設定すれば、モーダルダイアログ表示時、アニメーションの終了を待ってから、モーダルダイアログ内のエレメントにフォーカスが移ることになります。
よって、モーダルダイアログ表示時にCSSにてアニメーションの定義を入れている場合には、『true』に設定してください。
awaitCloseAnimation
『true』に設定すれば、モーダルダイアログが閉じる際、アニメーションの終了を待ってから、モーダルダイアログが閉じられます。
よって、モーダルダイアログが閉じられる際に、CSSにてアニメーションの定義を入れている場合には、『true』に設定してください。
debugMode
,『true』に設定すれば、コンソールの警告を抑止することができます。
デフォルトは『false』です。
ご参考
関連ページ
- jQuery UIでModal Dialog(モーダルダイアログ)を表示する方法
- Bootstrapでモーダル(Modal)を作る方法
- Fancybox v4でモーダルウインドウを作る方法
- Fancybox v5でモーダルウインドウを作る方法
- モーダル(Modal)を自作する方法
- 「Nifty Modal Window Effects」を利用してモーダルウインドウを実装する方法