弹出模态窗口时如何禁用背景

3 html javascript css modal-dialog

我正在构建网页模板,并对模态弹出窗口进行了一些修改,如下所示:

<div class="modal fade" id="myModal4" tabindex="-1" role="dialog" style="background-color:#FECE1A;display:none;width:750px;left:46%" aria-hidden="true">
  <div class="modal-dialog">
  <script>
    $("#myModal4").on("show", function () {
      $("body").addClass("modal-open");
    }).on("hidden", function () {
      $("body").removeClass("modal-open")
    });
  </script>
  <!--Modal Content-->
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

并且body.modal-open css函数像这样

body.modal-open {
  overflow: hidden;
}
Run Code Online (Sandbox Code Playgroud)

弹出窗口工作正常。问题是,每当出现弹出窗口时,我仍然可以单击模板的标题菜单和背景中的某些链接。如何禁用后台的所有内容,以便只能单击弹出窗口中的可用内容。

Toa*_*gma 6

介绍

一个简单的解决方案是添加一个<div>覆盖背景的 ,并且位于弹出窗口下方但位于所有其他内容上方。

下面是一个非常简单的例子,我想象你正在尝试做的事情。希望您可以对其进行调整以适合您的场景。

例子

function openModal() {
  $("#overlay").css({"display":"block"});
  $("#modal").css({"display":"block"});
}
Run Code Online (Sandbox Code Playgroud)
#modal {
  position:fixed;
  left:50%;
  top:50%;
  transform:translate(-50%, -50%);
  border:solid 1px #000;
  display:none;
  background-color:#fff;
}

#overlay {
  position:fixed;
  left:0;
  top:0;
  width:100vw;
  height:100vh;
  display:none;
  background-color:#000;
  opacity:0.5;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Awesome Content!

<button onclick="openModal()">Open Modal!</button>

<div id="overlay"></div>
<div id="modal"><h1>Modal Content!</h1></div>
Run Code Online (Sandbox Code Playgroud)

关键点

  • div#overlay出现在#modaldiv 之前 - 这就是我将模态设置为顶部的方式。或者你可以在 CSS 中使用z-index

  • opacity此处不需要该值,它只是用作叠加层相对于页面/模式的位置的演示;

  • 这里的实现细节都不重要。JavaScript 不应该很重要,我的大部分 CSS 也不应该重要。这个例子的存在只是为了给你指明正确的方向。


Jam*_*las 5

您可以使用覆盖层-覆盖整个html的屏幕的整个尺寸的另一个div,并在主体上提供半透明的灰色阴影。

在此示例中,使用两个div。

一个是叠加层,另一个(为方便起见,在叠加层内部)是模态。

<div class="overlay">
  <div class="modal">
    This is the modal. You can put whatever you like in here.
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

现在叠加层需要样式:

.overlay {
  position: fixed; /* Positioning and size */
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  background-color: rgba(128,128,128,0.5); /* color */
  display: none; /* making it hidden by default */
}
Run Code Online (Sandbox Code Playgroud)

模态也需要一些:

.modal {
  position: fixed; /* positioning in center of page */
  top: 50vh;
  left: 50vw;
  transform: translate(-50%,-50%);
  height: 400px; /* size */
  width: 600px;
  background-color: white; /* background color */
}
Run Code Online (Sandbox Code Playgroud)

通过添加以下内容来包含jQuery:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

在代码顶部的head标签中。

然后,使用此按钮打开模式:

<button onclick="$('.overlay').show();">Open modal</button>
Run Code Online (Sandbox Code Playgroud)

和此jQuery代码以捕获点击叠加层,但不点击其子级。

$('.overlay').on('click', function(e) {
  if (e.target !== this) {
    return;
  }
  $('.overlay').hide();
});
Run Code Online (Sandbox Code Playgroud)

<div class="overlay">
  <div class="modal">
    This is the modal. You can put whatever you like in here.
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)
.overlay {
  position: fixed; /* Positioning and size */
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  background-color: rgba(128,128,128,0.5); /* color */
  display: none; /* making it hidden by default */
}
Run Code Online (Sandbox Code Playgroud)
.modal {
  position: fixed; /* positioning in center of page */
  top: 50vh;
  left: 50vw;
  transform: translate(-50%,-50%);
  height: 400px; /* size */
  width: 600px;
  background-color: white; /* background color */
}
Run Code Online (Sandbox Code Playgroud)