【HTML/CSS/Javascript】レスポンシブ対応可能なモーダルウィンドウを作成する方法
今回はレスポンシブ対応のモーダルウィンドウの作成方法をまとめてみました。
サンプルページは →→こちら
jQueryとアイコンフォントの読み込み
まず、jQueryとアイコンフォントを読み込みます。インターネット上に公開してくれているので、URLで読み込むことができます。
アイコンフォントは『Material Design Iconic Font』を使用してみました。
Font Awesomeと同じような使い方ができます。以下を参考にしてみてください。
https://www.tipdip.jp/tips_posts/production/1803/
HTMLを記述
HTMLを記述します。
HTML
ウィンドウ1</h2>
モーダルウィンドウが開きました。</p>
<a data-target="modal2" class="modal_switch"><span>ウィンドウ2へ
ウィンドウ2
あのイーハトーヴォのすきとおった風、
夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
この様にウィンドウの高さが違う場合でも
この様に表示することができます。<a class="modal_close"><i class="zmdi zmdi-close">
『<a data-target=”〇〇” >』と対応する『<id=”〇〇”>』のモーダルを呼び出しています。
例えば、最初の『<a data-target=”modal1″>』をクリックすると『<div id=”modal1″>』が呼び出されます。
『<a class=”modal_close”>』はモーダルを閉じるボタンです。
CSS
.modal_open{ display: inline-block; margin: 3vw; float: left; } .modal_box { position: fixed; z-index: 7777; display: none; width: 80%; max-width: 840px; margin: 0; padding: 60px 2vw 80px; border: 2px solid #aaa; text-align: center; background: #fff; box-sizing: border-box; } .modal_close { position: absolute; top: 0; right: 0; display: block; width: 62px; font-size: 46px; color: #000; line-height: 62px; text-align: center; background: #e6e6e6; } .modal_close i { line-height: 62px; vertical-align: bottom; } .modal_bg { position: fixed; top: 0; left: 0; z-index: 6666; display: none; width: 100%; height: 120%; background-color: rgba(0,0,0,0.7); } .link_area { overflow: hidden; max-width: 410px; margin: 60px auto 0; text-align: center; } .link_area .modal_link { display: inline; } .link_area .modal_link a { display: inline-block; width: 180px; color: #000; line-height: 2.5; text-decoration: none; margin: 0 10px; background: #e6e6e6; } .link-area ul li.modal_link:first-child a { float: left; } .link-area ul li.modal_link:last-child a { float: right; } @media screen and (max-width: 769px) { /* ウィンドウサイズ769px以下の時のスタイル */ .modal_box { padding: 50px 2vw 40px; } .modal_close { width: 40px; line-height: 40px; font-size: 30px; } .modal_close i { line-height: 44px; } .link_area { margin: 25px auto 0; } .link_area .modal_link a { margin: 15px auto 0; } .link_area ul li.modal_link:first-child a { float: none; margin-top: 0; } .link_area ul li.modal_link:last-child a { float: none; } }
CSSはクローズボタンのデザイン指定やウィンドウサイズを770pxでレスポンシブ対応するよう切り替えています。
Javascript
$(function(){ // 「.modal_open」をクリックしたらモーダルと黒い背景を表示する $('.modal_open').click(function(){ // 黒い背景をbody内に追加 $('body').append(''); $('.modal_bg').fadeIn(); // data-targetの内容をIDにしてmodalに代入 var modal = '#' + $(this).attr('data-target'); // モーダルをウィンドウの中央に配置する function modalResize(){ var w = $(window).width(); var h = $(window).height(); var x = (w - $(modal).outerWidth(true)) / 2; var y = (h - $(modal).outerHeight(true)) / 2; $(modal).css({'left': x + 'px','top': y + 'px'}); } // modalResizeを実行 modalResize(); // modalをフェードインで表示 $(modal).fadeIn(); // .modal_bgか.modal_closeをクリックしたらモーダルと背景をフェードアウトさせる $('.modal_bg, .modal_close').off().click(function(){ $('.modal_box').fadeOut(); $('.modal_bg').fadeOut('slow',function(){ $('.modal_bg').remove(); }); }); // ウィンドウがリサイズされたらモーダルの位置を再計算する $(window).on('resize', function(){ modalResize(); }); // .modal_switchを押すとモーダルを切り替える $('.modal_switch').click(function(){ // 押された.modal_switchの親要素の.modal_boxをフェードアウトさせる $(this).parents('.modal_box').fadeOut(); // 押された.modal_switchのdata-targetの内容をIDにしてmodalに代入 var modal = '#' + $(this).attr('data-target'); // モーダルをウィンドウの中央に配置する function modalResize(){ var w = $(window).width(); var h = $(window).height(); var x = (w - $(modal).outerWidth(true)) / 2; var y = (h - $(modal).outerHeight(true)) / 2; $(modal).css({'left': x + 'px','top': y + 'px'}); } // modalResizeを実行 modalResize(); $(modal).fadeIn(); // ウィンドウがリサイズされたらモーダルの位置を再計算する $(window).on('resize', function(){ modalResize(); }); }); }); });
フェードイン効果や背景を黒くしたり、モーダルウィンドウを画面の中央に配置する指示をしています。リサイズされる度にモーダルの位置を再計算してくれます。
サンプルページは →→こちら
参考ページ
・https://www.tipdip.jp/tips_posts/production/2090/
・https://www.tipdip.jp/tips_posts/production/1803/
この記事へのコメント