入れ子モーダルとは?
入れ子モーダルとは、その名の通り、あるモーダルウィンドウの中から、さらに別のモーダルウィンドウを開く仕組みのこと。まるで、ロシアのマトリョーシカ人形みたいに、モーダルがモーダルを内包するようなイメージだね。
ユーザーが最初のモーダル(親モーダル)内のボタンなどをクリックすると、その親モーダルの上に新しいモーダル(子モーダル)が重なって表示されるんだ。通常、子モーダルが表示されている間は、親モーダルも背景の一部となって操作できなくなるよ。
モーダルの基本的な使い方やスタイリング方法が分かってきたね!情報を効果的に見せるモーダルは、ウェブサイトの使いやすさを向上させるのにとても役立つ。
でも、時には「モーダルの中で、さらに詳しい情報を別のモーダルで見せたいな」とか、「いくつかのステップに分けて操作を進めてほしいな」なんて思うこともあるかもしれない。そんな時に活躍するのが「入れ子モーダル(ネストされたモーダル)」なんだ。今回は、このちょっと高度なテクニックに挑戦してみよう!
入れ子モーダルとは、その名の通り、あるモーダルウィンドウの中から、さらに別のモーダルウィンドウを開く仕組みのこと。まるで、ロシアのマトリョーシカ人形みたいに、モーダルがモーダルを内包するようなイメージだね。
ユーザーが最初のモーダル(親モーダル)内のボタンなどをクリックすると、その親モーダルの上に新しいモーダル(子モーダル)が重なって表示されるんだ。通常、子モーダルが表示されている間は、親モーダルも背景の一部となって操作できなくなるよ。
入れ子モーダルは、上手に使うとユーザー体験を向上させることができるけど、使いすぎるとかえって混乱を招くこともあるから注意が必要だよ。代表的な使いどころはこんな感じだ。
入れ子モーダルを作るには、HTML、CSS、JavaScriptそれぞれで少し工夫が必要になるよ。
まず、表示したいモーダルの数だけ、それぞれのモーダル要素(オーバーレイとコンテンツのセット)をHTML内に用意しておく。それぞれに異なるid
を付けて区別できるようにしよう。
<!-- 最初のモーダル (親モーダル) -->
<div class="modal-overlay" id="modalOverlay1">
<div class="modal-content" id="modalContent1">
<div class="modal-header">
<h3 class="modal-title">親モーダル</h3>
<button class="modal-close-button" data-modal-id="modalOverlay1">×</button>
</div>
<div class="modal-body">
<p>これが最初のモーダルです。</p>
<button id="openNestedModalBtn">入れ子モーダルを開く</button>
</div>
<div class="modal-footer">
<button class="btn-secondary" data-modal-id="modalOverlay1">閉じる</button>
</div>
</div>
</div>
<!-- 2番目のモーダル (子モーダル) -->
<div class="modal-overlay" id="modalOverlay2"> <!-- 別のオーバーレイ -->
<div class="modal-content" id="modalContent2">
<div class="modal-header">
<h3 class="modal-title">子モーダル</h3>
<button class="modal-close-button" data-modal-id="modalOverlay2">×</button>
</div>
<div class="modal-body">
<p>これが入れ子になったモーダル(子モーダル)です!</p>
</div>
<div class="modal-footer">
<button class="btn-secondary" data-modal-id="modalOverlay2">閉じる</button>
</div>
</div>
</div>
ここでは、各モーダルが独自のオーバーレイを持つようにしているけど、CSSのz-index
をうまく使えば、オーバーレイは1つだけでも実現できるよ(その場合、JavaScriptでの管理が少し複雑になる)。
z-index
)見た目の基本スタイルは、これまで作ってきたモーダルと同じで大丈夫。入れ子モーダルで特に重要なのが、重ね順 (z-index
) の管理だ。
後から開くモーダル(子モーダル)が、必ず親モーダルの手前に表示されるように、子モーダルのz-index
値を親モーダルよりも大きく設定する必要があるんだ。
/* 親モーダルのオーバーレイ */
#modalOverlay1 { z-index: 1000; }
#modalOverlay1 .modal-content { z-index: 1010; } /* 親モーダルのコンテンツ */
/* 子モーダルのオーバーレイ */
#modalOverlay2 {
z-index: 1005; /* 親のコンテンツより手前、子のコンテンツより後ろ */
background-color: rgba(0, 0, 0, 0.3); /* 少し薄くして重なりを表現 */
}
#modalOverlay2 .modal-content { z-index: 1020; } /* 子モーダルのコンテンツ (最前面) */
このように、z-index
の値を段階的に大きくしていくことで、モーダルが正しく重なって表示されるよ。
JavaScriptでは、それぞれのモーダルを開閉するためのロジックが必要になる。
これを実現するには、現在どのモーダルが開いているかを把握したり、開いているモーダルのリストを管理したりする必要が出てくる場合がある。単純な2段階の入れ子なら、そこまで複雑にしなくても作れるよ。
入れ子モーダルの場合も、アクセシビリティは非常に重要だ。特に以下の点に注意しよう。
aria-modal="true"
: 各モーダルコンテンツ要素にこの属性を指定すると、スクリーンリーダーに対して「このモーダルが表示されている間は、他の部分は操作不能ですよ」と伝えられる。aria-hidden="true"
を使う)と、混乱を防げる場合がある。これらのアクセシビリティ対応は、モーダル専用のアクセシビリティのページ (03-07) で、もっと詳しく見ていくよ。
z-index
地獄に注意: モーダルが増えてくると、z-index
の管理が複雑になりがち。計画的に値を設定しよう。さあ、実際に2段階の入れ子モーダルがどんな風に動くか見てみよう!下のボタンをクリックして、最初のモーダルを開き、その中のボタンでさらに子モーダルを開いてみてね。
重ね順や状態管理に関する言葉を覚えよう!
意味:入れ子になった、ネストされた
Original: We are creating a nested modal structure for a multi-step process.
意訳:複数ステップのプロセスのために、入れ子になったモーダル構造を作成しています。
意味:z-index(CSSのプロパティで、要素の重ね合わせの順番を指定する)
Original: A higher z-index value means the element will be displayed in front of elements with a lower value.
意訳:z-indexの値が大きいほど、その要素は値が小さい要素の前面に表示されます。
意味:スタッキングコンテキスト(要素がどのように重なるかを決定するHTML要素のグループ)
Original: Elements with a 'position' value other than 'static' and a z-index can create a new stacking context.
意訳:「static」以外の「position」値とz-indexを持つ要素は、新しいスタッキングコンテキストを作成できます。
意味:(モーダルの)状態管理(どのモーダルが開いているか、などの情報を管理すること)
Original: For complex UIs with multiple modals, robust state management is important.
意訳:複数のモーダルを持つ複雑なUIでは、堅牢な状態管理が重要です。
今回は、モーダルの中からさらにモーダルを開く「入れ子モーダル」の作り方と、その際の注意点について学んだね。
z-index
をうまく使って、モーダルが正しく重なって表示されるようにする。入れ子モーダルは、うまく使えば複雑な情報や操作を分かりやすく整理できる強力なテクニックだ。でも、常に「ユーザーにとって本当に分かりやすいかな?」と考えることを忘れずにね!
次のページでは、表示されたモーダルウィンドウをマウスでドラッグして移動できるようにする方法を学ぶよ。お楽しみに!