仕事でモーダルを自作することがたまにあるので、ある程度カスタマイズすることを想定して、簡単なモーダルを作成してみました。
モーダルの中身はHTMLに埋め込んでおく想定です。
サンプルコード
.modalがモーダルを立ち上げるリンク、#modal01~modal03がモーダルの中身になります。
.modalのhrefと一致するモーダルの中身が表示されます。
HTML
<div id="contents"> <a href="#modal01" class="modal">モーダル1</a> <a href="#modal02" class="modal">モーダル2</a> <a href="#modal03" class="modal">モーダル3</a> </div> <div id="modal01"> <h2>モーダル1の中身です。</h2> <div class="image"><img src="http://placehold.it/400x300/E74C3C/000000" width="400" height="300" alt="" /></div> <a href="#modal02" class="modal-next modal-change">次へ</a> <a href="" class="modal-close">閉じる</a> <div class="modal-nav"> <span>モーダル1へ</span> <a href="#modal02" class="modal-change">モーダル2へ</a> <a href="#modal03" class="modal-change">モーダル3へ</a> </div> </div> <div id="modal02"> <h2>モーダル2の中身です。</h2> <div class="image"><img src="http://placehold.it/400x600/3498DB/000000" width="400" height="600" alt="" /></div> <a href="#modal01" class="modal-prev modal-change">前へ</a> <a href="#modal03" class="modal-next modal-change">次へ</a> <a href="" class="modal-close">閉じる</a> <div class="modal-nav"> <a href="#modal01" class="modal-change">モーダル1へ</a> <span>モーダル2へ</span> <a href="#modal03" class="modal-change">モーダル3へ</a> </div> </div> <div id="modal03"> <h2>モーダル3の中身です。</h2> <div class="image"><img src="http://placehold.it/400x300/2ECC71/000000" width="400" height="300" alt="" /></div> <a href="#modal02" class="modal-prev modal-change">前へ</a> <a href="" class="modal-close">閉じる</a> <div class="modal-nav"> <a href="#modal01" class="modal-change">モーダル1へ</a> <a href="#modal02" class="modal-change">モーダル2へ</a> <span>モーダル3へ</span> </div> </div>
CSS
モーダルに必要な部分のみ抜粋しています。
#modal-bg { display: none; position: fixed; top: 0; left: 0; z-index: 9999; width: 100%; height: 100%; min-height: 100%; background: #000000; opacity: 0.8; cursor: pointer; } #modal { position: absolute; z-index: 9999; left: 50%; } #modal01, #modal02, #modal03 { display: none; position: relative; width: 600px; /* モーダルの幅を指定 */ }
JavaScript
// モーダルの立ち上げ function modalOpen(target) { // モーダルに必要な要素の挿入 $('body').css('position', 'relative').append('<div id="modal-bg"></div><div id="modal"></div>'); $(target).appendTo('#modal').show(); $('#modal-bg').show(); // モーダル高さが画面高さより狭いとき if ($('#modal').height() <= $(window).height() ) { // モーダルの位置指定(上下中央に配置) $('#modal').css({ top: $(window).scrollTop() + ($(window).height() / 2) - ($('#modal').height() / 2), marginLeft: - $('#modal').width() / 2 }); // モーダル高さが画面高さより広いとき } else { // モーダルの位置指定(画面の上から10pxに配置) $('#modal').css({ top: $(window).scrollTop() + 10, marginLeft: - $('#modal').width() / 2 }); } } // モーダルの中身切り替え function modalChange(target) { // モーダルの中身を元に戻す $('#modal').children().clone().appendTo('body').hide(); // モーダルの中身を削除 $('#modal').html(''); // 次のモーダルの中身を挿入 $(target).appendTo('#modal').show(); } // モーダルを閉じる function modalClose() { // モーダルの中身を元に戻す $('#modal').children().clone().appendTo('body').hide(); // モーダルと背景を削除 $('#modal-bg').remove(); $('#modal').html('').remove(); } $(function() { // モーダルを開くとき $(document).on('click', 'a.modal', function() { var target = $(this).attr('href'); modalOpen(target); return false; }); // モーダルの中身を切り替えるとき $(document).on('click', 'a.modal-change', function() { var target = $(this).attr('href'); modalChange(target); return false; }); // モーダルを閉じるとき $(document).on('click', '#modal-bg, a.modal-close', function() { modalClose(); return false; }); });
JavaScriptはコメントで書いてある通りですが、モーダルを開く関数、モーダルの中身を切り替える関数、モーダルを閉じる関数を用意しています。
a.modalをクリックしたときにモーダル立ち上げ、モーダル内でa.modal-changeをクリックしたときにモーダル内の切り替え、#modal-bgかa.modal-closeをクリックしたときにモーダルを閉じるように設定しています。
コメントが承認されるまで時間がかかります。