質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

2回答

19770閲覧

モーダルウィンドウを重ねて表示

NameLess9068

総合スコア12

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2016/11/18 07:44

jqueryに関する質問です。
以下のコードを用いて表示されたモーダルウィンドウ1の上に重ねて別のモーダルウィンドウ2を表示させたいです。
以下のコードのIDとClass名だけを変更してモーダルウィンドウ2を作成しました。
しかし、モーダルウィンドウ2が表示されるとモーダルウィンドウ1が消えてしまいます。
「.modal-overlay」あるいは「.modal-close」をクリックというコメント付近のコードを削除すると、問題は解決しますが、当然モーダルを閉じることができなくなってしまいます。
どうすればこの問題を解決できるか教えてください。

jquery

1$(function() { 2 // 「#modal-open」をクリック 3 $('.modal-open').click(function() { 4 // オーバーレイ用の要素を追加 5 $('body').append('<div class="modal-overlay"></div>'); 6 // オーバーレイをフェードイン 7 $('.modal-overlay').fadeIn('slow'); 8 9 // モーダルコンテンツのIDを取得 10 var modal = '#' + $(this).attr('data-target'); 11 // モーダルコンテンツの表示位置を設定 12 modalResize(); 13 // モーダルコンテンツフェードイン 14 $(modal).fadeIn('slow'); 15 16 // 「.modal-overlay」あるいは「.modal-close」をクリック 17 $('.modal-overlay, #modal-close').off().click(function() { 18 // モーダルコンテンツとオーバーレイをフェードアウト 19 $(modal).fadeOut('slow'); 20 $('.modal-overlay').fadeOut('slow', function() { 21 // オーバーレイを削除 22 $('.modal-overlay').remove(); 23 }); 24 }); 25 26 // リサイズしたら表示位置を再取得 27 $(window).on('resize', function() { 28 modalResize(); 29 }); 30 31 // モーダルコンテンツの表示位置を設定する関数 32 function modalResize() { 33 // ウィンドウの横幅、高さを取得 34 var w = $(window).width(); 35 var h = $(window).height(); 36 37 // モーダルコンテンツの表示位置を取得 38 var x = (w - $(modal).outerWidth(true)) / 2; 39 var y = (h - $(modal).outerHeight(true)) / 2; 40 41 // モーダルコンテンツの表示位置を設定 42 $(modal).css({ 43 'left' : x + 'px', 44 'top' : y + 'px' 45 }); 46 } 47 48 }); 49});

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sk_3122

2016/11/18 08:10

モーダルダイアログの中から さらにモーダルダイアログを呼ぶ感じでしょうか? jQuery 部分だけじゃなくて html 部分の動くソースもあると試しやすいのですが。 class="modal-open" を指定したトリガ、と data-target="モーダルとして表示するべき要素のID"、ですかね…?
sk_3122

2016/11/18 08:16

ああ、CSSもないと駄目ですかね。要は、動くソースがあれば 実際に試してみて おかしいところを指摘しやすいということです。ソースだけ見て机上デバッグするよりその方が楽なので、回答も付きやすいかと思います。
guest

回答2

0

とりあえず明らかに「ああ動かないだろうな」というところだけ。
「ダイアログA」から「ダイアログB」を呼び出す、

重なりとしては最終的に以下のようになる想定。

z-index 大

|「ダイアログB」
|「ダイアログB用のオーバーレイ」
|「ダイアログA」
|「ダイアログA用のオーバーレイ」
|「body」

z-index 小

javascript

1 2// オーバーレイ用の要素を追加 3$('body').append('<div class="modal-overlay"></div>'); 4 5// オーバーレイをフェードイン 6$('.modal-overlay').fadeIn('slow');

javascript

1// オーバーレイ用の要素を追加 2//★一旦変数に取る 3var $overlay = $('<div class="modal-overlay"></div>'); 4$('body').append($overlay); 5 6// オーバーレイをフェードイン 7//★ .modal-overlay だと、このclassが指定されている要素がすべて対象になる 8// = ダイアログA用のオーバーレイもダイアログB用のオーバーレイも対象になってしまう 9// 変数で指定すれば、上で生成したオーバーレイだけが対象になる 10$overlay.fadeIn('slow'); 11 12// ★以降も .modal-overlay で指定している箇所は変数 $overlay に差し替える 13

とかですかね。

あとはオーバーレイを重ねるなら z-index の指定をどうするか とかですかね
「ダイアログA」の上に「ダイアログB」を重ねるなら、
「ダイアログB用のオーバーレイ」は「ダイアログA」の上に重ならないと駄目ですよね

投稿2016/11/18 09:25

sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

モーダルの考え方は、親ウィンドウより優先的に処理される子ウィンドウですから
モーダルを開いている間は親ウィンドウを操作できないので
別のモーダルを開くということは理論的にありえないのでは?
アラートが出ている最中に別のアラートがだせないのと同じです

投稿2016/11/18 07:57

yambejp

総合スコア114742

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問