1. ホーム
  2. ジャバスクリプト

[解決済み】複数のモーダルが重なって表示される

2022-04-21 20:55:20

質問

オーバーレイが背面ではなく、最初のモーダルの上に表示されるようにしたいのですが、どうすればいいですか?

$('#openBtn').click(function(){
	$('#myModal').modal({show:true})
});
<a data-toggle="modal" href="#myModal" class="btn btn-primary">Launch modal</a>

<div class="modal" id="myModal">
	<div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
          <h4 class="modal-title">Modal title</h4>
        </div><div class="container"></div>
        <div class="modal-body">
          Content for the dialog / modal goes here.
          <br>
          <br>
          <br>
          <br>
          <br>
          <a data-toggle="modal" href="#myModal2" class="btn btn-primary">Launch modal</a>
        </div>
        <div class="modal-footer">
          <a href="#" data-dismiss="modal" class="btn">Close</a>
          <a href="#" class="btn btn-primary">Save changes</a>
        </div>
      </div>
    </div>
</div>
<div class="modal" id="myModal2" data-backdrop="static">
	<div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
          <h4 class="modal-title">Second Modal title</h4>
        </div><div class="container"></div>
        <div class="modal-body">
          Content for the dialog / modal goes here.
        </div>
        <div class="modal-footer">
          <a href="#" data-dismiss="modal" class="btn">Close</a>
          <a href="#" class="btn btn-primary">Save changes</a>
        </div>
      </div>
    </div>
</div>


<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.0/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.0/js/bootstrap.min.js"></script>

を変更しようとしたのですが z-index.modal-backdrop が、ごちゃごちゃになる。

場合によっては、同じページに2つ以上のモーダルがあることもあります。

解決方法は?

YermoLamers & @Ketwarooの回答からヒントを得て解決しました。

バックドロップのz-indexの修正

このソリューションでは setTimeout というのも .modal-backdrop が作成されないと、イベント show.bs.modal がトリガーされます。

$(document).on('show.bs.modal', '.modal', function() {
  const zIndex = 1040 + 10 * $('.modal:visible').length;
  $(this).css('z-index', zIndex);
  setTimeout(() => $('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack'));
});

  • これは、すべての .modal ページで作成された (動的なモーダルも)
  • 背景が瞬時に前のモーダルに重なる

jsfiddleの例

z-index

何らかの理由でハードコードされたz-indexが気に入らない場合は、次のようにページで最も高いz-indexを計算することができます。

const zIndex = 10 +
  Math.max(...Array.from(document.querySelectorAll('*')).map((el) => +el.style.zIndex));

スクロールバーの修正

ブラウザの高さを超えるモーダルがページ上にある場合、2つ目のモーダルを閉じるときにその中でスクロールすることができません。これを修正するには、以下を追加します。

$(document).on('hidden.bs.modal', '.modal',
  () => $('.modal:visible').length && $(document.body).addClass('modal-open'));

バージョン

このソリューションは、bootstrap 3.1.0 - 3.3.5でテストされています。