如果用户在模态框外单击,我如何防止模态框(使用 Bulma CSS 框架)关闭?

How can I prevent a modal (using the Bulma CSS framework) from closing if the user clicks outside of it?

Bulma是一个纯粹的CSS框架,不提供JavaScript。话虽如此,我将如何添加 JavaScript 以防止用户在模态之外单击时关闭模态组件(特别是卡片变体)或在用户点击 ESC 时阻止模态组件关闭在他们的键盘上?

在示例中,他们可能对这种行为进行了编码。布尔玛不包括它。要激活模式,只需在 .modal 容器上添加 is-active 修饰符。只要您不自己删除 is-active 修饰符,模态框就会保持打开状态。

如你所说,bulma不提供任何js给你。因此,您是否以及如何处理模态的关闭事件完全取决于您。

仅当相应按钮之一被点击时,类似这样的操作才会关闭模态框。

  var modal = document.getElementById('modal');
  var elements = document.getElementsByClassName('toggle-modal');
  for (var i = 0; i < elements.length; i++) {
    elements[i].addEventListener('click', toggleClass);
  }

  function toggleClass() {
    modal.classList.toggle('is-active');
  }
<link href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.4.1/css/bulma.css" rel="stylesheet"/>
  
  
  <button class="toggle-modal">Open Modal</button>
  <div class="modal" id="modal">
    <div class="modal-background"></div>
    <div class="modal-card">
      <header class="modal-card-head">
        <p class="modal-card-title">Modal title</p>
        <button class="delete toggle-modal"></button>
      </header>
      <section class="modal-card-body">
        <!-- Content ... -->
      </section>
      <footer class="modal-card-foot">
        <a class="button is-success toggle-modal">Save changes</a>
        <a class="button toggle-modal">Cancel</a>
      </footer>
    </div>
  </div>

由于您必须自己编写 JS,因此只需在单击关闭按钮或您想要触发关闭模态的任何内容时删除模态类。

这是来自 the bulma docs

的代码

$(".modal-button").click(function() {
  var target = $(this).data("target");
  $("html").addClass("is-clipped");
  $(target).addClass("is-active");
});

$(".modal-close").click(function() {
  $("html").removeClass("is-clipped");
  $(this).parent().removeClass("is-active");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.4.1/css/bulma.css" rel="stylesheet">

<!-- modal button -->
<p>
  <a class="button is-primary is-large modal-button" data-target="#modal">Launch example modal</a>
</p>

<!-- modal content -->
<div id="modal" class="modal">
  <div class="modal-background"></div>
  <div class="modal-content">
    <div class="box">
      <article class="media">
        <div class="media-left">
          <figure class="image is-64x64">
            <img src="http://bulma.io/images/placeholders/128x128.png" alt="Image">
          </figure>
        </div>
        <div class="media-content">
          <div class="content">
            <p>
              <strong>John Smith</strong> <small>@johnsmith</small> <small>31m</small>
              <br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean efficitur sit amet massa fringilla egestas. Nullam condimentum luctus turpis.
            </p>
          </div>
          <nav class="level">
            <div class="level-left">
              <a class="level-item">
                <span class="icon is-small"><i class="fa fa-reply"></i></span>
              </a>
              <a class="level-item">
                <span class="icon is-small"><i class="fa fa-retweet"></i></span>
              </a>
              <a class="level-item">
                <span class="icon is-small"><i class="fa fa-heart"></i></span>
              </a>
            </div>
          </nav>
        </div>
      </article>
    </div>
  </div>
  <button class="modal-close"></button>
</div>

最简单的做法是不使用他们的 "built-in" 背景,只为第一个模态 div 设置背景颜色。我通过这样做在我的 React 应用程序中绕过了它:

<div style={{ backgroundColor : 'rgba(0,0,0,0.86)'}} id="modal-image-detail" className="modal modal-fx-superScaled">

然后我从第二个 div

中删除了 className="modal-background"