Skip to main content Skip to docs navigation

模态框(Modal)

使用 Bootstrap 的 JavaScript 模态框插件向您的站点添加对话框,用于用户通知或完全自定义的内容。

工作原理

在开始使用 Bootstrap 的模态组件之前,请务必阅读以下内容,因为我们的菜单选项最近发生了变化。

  • 模态框是用 HTML、CSS 和 JavaScript 构建的。 它们位于文档中的所有其他内容之上,并从 <body> 中移除滚动,以便模态内容滚动。
  • 单击模态框的“背景”将自动关闭模态框。
  • Bootstrap 一次只支持一个模态框窗口。 不支持嵌套模态框,因为我们认为那是糟糕的用户体验。
  • 模态框使用 position:fixed,它的渲染有时会有些特殊。 只要有可能,将您的模态框放在 HTML 的顶层位置,以避免来自其他元素的潜在干扰。 将 .modal 嵌套在另一个固定元素中时,您可能会遇到问题。
  • 再次,由于使用了 position:fixed,在移动设备上使用模态框有一些注意事项。 查看我们的浏览器支持文档了解详情。
  • 由于 HTML5 定义其语义的方式,autofocus HTML 属性 在 Bootstrap 模式中无效。 要达到相同的效果,请使用一些自定义 JavaScript:
var myModal = document.getElementById('myModal')
var myInput = document.getElementById('myInput')

myModal.addEventListener('shown.bs.modal', function () {
  myInput.focus()
})
该组件的动画效果依赖于 prefers-reduced-motion 媒体查询。 请参阅无障碍文档的减弱动画效果部分

继续阅读演示和使用指南。

示例

下面是一个 static 模态框示例(意味着它的 positiondisplay 已被覆盖)。 包括模态框标题、模态框正文(padding 必需)和模态框页脚(可选)。 我们要求您尽可能在模态框标题中包含关闭操作,或提供另一个明确的关闭操作。

<div class="modal" tabindex="-1">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">Modal title</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <p>Modal body text goes here.</p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

现场演示

下面的示例演示了通过单击下面的按钮来切换模态框的显示。 它将向下滑动并从页面顶部淡入。

<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

静态背景

当背景设置为静态时,在其外部单击时模态将不会关闭。 单击下面的按钮进行尝试。

<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#staticBackdrop">
  Launch static backdrop modal
</button>

<!-- Modal -->
<div class="modal fade" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="staticBackdropLabel">Modal title</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Understood</button>
      </div>
    </div>
  </div>
</div>

滚动长内容

当模态框对于用户的视口或设备而言变得太长时,它们会独立于页面本身滚动。 试试下面的演示,这就是我的意思。

您还可以通过将 .modal-dialog-scrollable 添加到 .modal-dialog 来创建允许滚动内容的可滚动模态框。

<!-- Scrollable modal -->
<div class="modal-dialog modal-dialog-scrollable">
  ...
</div>

垂直居中

.modal-dialog-centered 添加到 .modal-dialog 以使模态框垂直居中。

<!-- Vertically centered modal -->
<div class="modal-dialog modal-dialog-centered">
  ...
</div>

<!-- Vertically centered scrollable modal -->
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
  ...
</div>

工具提示(Tooltips)和弹出框(popovers)

工具提示弹出框 可以根据需要放置在模态框内 . 当模态框关闭时,其中的任何工具提示和弹出框也会自动关闭。

<div class="modal-body">
  <h5>Popover in a modal</h5>
  <p>This <a href="#" role="button" class="btn btn-secondary popover-test" title="Popover title" data-bs-content="Popover body content is set in this attribute.">button</a> triggers a popover on click.</p>
  <hr>
  <h5>Tooltips in a modal</h5>
  <p><a href="#" class="tooltip-test" title="Tooltip">This link</a> and <a href="#" class="tooltip-test" title="Tooltip">that link</a> have tooltips on hover.</p>
</div>

使用网格

通过将 .container-fluid 嵌套在 .modal-body 中,在 modal 中使用 Bootstrap 网格系统。 然后,像在其他任何地方一样使用普通的网格系统类。

<div class="modal-body">
  <div class="container-fluid">
    <div class="row">
      <div class="col-md-4">.col-md-4</div>
      <div class="col-md-4 ms-auto">.col-md-4 .ms-auto</div>
    </div>
    <div class="row">
      <div class="col-md-3 ms-auto">.col-md-3 .ms-auto</div>
      <div class="col-md-2 ms-auto">.col-md-2 .ms-auto</div>
    </div>
    <div class="row">
      <div class="col-md-6 ms-auto">.col-md-6 .ms-auto</div>
    </div>
    <div class="row">
      <div class="col-sm-9">
        Level 1: .col-sm-9
        <div class="row">
          <div class="col-8 col-sm-6">
            Level 2: .col-8 .col-sm-6
          </div>
          <div class="col-4 col-sm-6">
            Level 2: .col-4 .col-sm-6
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

改变模态内容

有多个按钮都触发相同的模态框,内容略有不同? 使用 event.relatedTargetHTML data-bs-* 属性 根据单击的按钮来改变模态框的内容。

下面是一个现场演示,后面是示例 HTML 和 JavaScript。 如需更多信息,请阅读模态框事件文档以了解有关 relatedTarget 的详细信息。

<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal" data-bs-whatever="@mdo">Open modal for @mdo</button>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal" data-bs-whatever="@fat">Open modal for @fat</button>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal" data-bs-whatever="@getbootstrap">Open modal for @getbootstrap</button>

<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">New message</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form>
          <div class="mb-3">
            <label for="recipient-name" class="col-form-label">Recipient:</label>
            <input type="text" class="form-control" id="recipient-name">
          </div>
          <div class="mb-3">
            <label for="message-text" class="col-form-label">Message:</label>
            <textarea class="form-control" id="message-text"></textarea>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Send message</button>
      </div>
    </div>
  </div>
</div>
var exampleModal = document.getElementById('exampleModal')
exampleModal.addEventListener('show.bs.modal', function (event) {
  // Button that triggered the modal
  var button = event.relatedTarget
  // Extract info from data-bs-* attributes
  var recipient = button.getAttribute('data-bs-whatever')
  // If necessary, you could initiate an AJAX request here
  // and then do the updating in a callback.
  //
  // Update the modal's content.
  var modalTitle = exampleModal.querySelector('.modal-title')
  var modalBodyInput = exampleModal.querySelector('.modal-body input')

  modalTitle.textContent = 'New message to ' + recipient
  modalBodyInput.value = recipient
})

在模态框之间切换

通过巧妙地放置 data-bs-targetdata-bs-toggle 属性来在多个模态框之间切换。 例如,您可以从已打开的登录模态框切换到密码重置模态框。 请注意,不能同时打开多个模态框——此方法只是在两个单独的模态框之间切换。

Open first modal
<div class="modal fade" id="exampleModalToggle" aria-hidden="true" aria-labelledby="exampleModalToggleLabel" tabindex="-1">
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalToggleLabel">Modal 1</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        Show a second modal and hide this one with the button below.
      </div>
      <div class="modal-footer">
        <button class="btn btn-primary" data-bs-target="#exampleModalToggle2" data-bs-toggle="modal">Open second modal</button>
      </div>
    </div>
  </div>
</div>
<div class="modal fade" id="exampleModalToggle2" aria-hidden="true" aria-labelledby="exampleModalToggleLabel2" tabindex="-1">
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalToggleLabel2">Modal 2</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        Hide this modal and show the first with the button below.
      </div>
      <div class="modal-footer">
        <button class="btn btn-primary" data-bs-target="#exampleModalToggle" data-bs-toggle="modal">Back to first</button>
      </div>
    </div>
  </div>
</div>
<a class="btn btn-primary" data-bs-toggle="modal" href="#exampleModalToggle" role="button">Open first modal</a>

更改动画

$modal-fade-transform 变量决定了 .modal-dialog 在模态淡入动画之前的变换状态,$modal-show-transform 变量决定了 .modal-dialog 在模态框淡入动画结束时的变换。

例如,如果你想要一个放大动画,你可以设置 $modal-fade-transform: scale(.8)

移除动画

对于只是出现而不需要淡入动画的模态框,请从模态标记中删除 .fade 类。

<div class="modal" tabindex="-1" aria-labelledby="..." aria-hidden="true">
  ...
</div>

动态高度

如果模态框打开区间高度发生变化,您应该调用 myModal.handleUpdate() 来调整模态框的位置,以防出现滚动条。

无障碍

请务必将引用模态框标题的 aria-labelledby="..." 添加到 .modal。 此外,您可以在 .modal 上使用 aria-describeby 来描述您的模态框。 请注意,您不需要添加 role="dialog",因为我们已经通过 JavaScript 添加了它。

嵌入 YouTube 视频

在模态框中嵌入 YouTube 视频需要额外的 JavaScript,而不是在 Bootstrap 中停止、自动播放等等。 查看这篇有用的 Stack Overflow 帖子了解更多信息。

可选尺寸

模态框有三种可选尺寸,可通过修饰符类放置在 .modal-dialog 上。 这些尺寸在某些断点处开始,以避免在较窄的视口上出现水平滚动条。

尺寸 模态框最大宽度
Small .modal-sm 300px
Default None 500px
Large .modal-lg 800px
Extra large .modal-xl 1140px

我们默认的不带修饰符类的模态框构成了“中等”大小的模态。

<div class="modal-dialog modal-xl">...</div>
<div class="modal-dialog modal-lg">...</div>
<div class="modal-dialog modal-sm">...</div>

全屏模态框

另一个可配置的选项是弹出的覆盖用户视口的模态框,可通过放置在 .modal-dialog 上的修饰符类获得。

适用于
.modal-fullscreen 总是
.modal-fullscreen-sm-down 576px 以下
.modal-fullscreen-md-down 768px 以下
.modal-fullscreen-lg-down 992px 以下
.modal-fullscreen-xl-down 1200px 以下
.modal-fullscreen-xxl-down 1400px 以下
<!-- Full screen modal -->
<div class="modal-dialog modal-fullscreen-sm-down">
  ...
</div>

Sass

变量

$modal-inner-padding:               $spacer;

$modal-footer-margin-between:       .5rem;

$modal-dialog-margin:               .5rem;
$modal-dialog-margin-y-sm-up:       1.75rem;

$modal-title-line-height:           $line-height-base;

$modal-content-color:               null;
$modal-content-bg:                  $white;
$modal-content-border-color:        rgba($black, .2);
$modal-content-border-width:        $border-width;
$modal-content-border-radius:       $border-radius-lg;
$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width);
$modal-content-box-shadow-xs:       $box-shadow-sm;
$modal-content-box-shadow-sm-up:    $box-shadow;

$modal-backdrop-bg:                 $black;
$modal-backdrop-opacity:            .5;
$modal-header-border-color:         $border-color;
$modal-footer-border-color:         $modal-header-border-color;
$modal-header-border-width:         $modal-content-border-width;
$modal-footer-border-width:         $modal-header-border-width;
$modal-header-padding-y:            $modal-inner-padding;
$modal-header-padding-x:            $modal-inner-padding;
$modal-header-padding:              $modal-header-padding-y $modal-header-padding-x; // Keep this for backwards compatibility

$modal-sm:                          300px;
$modal-md:                          500px;
$modal-lg:                          800px;
$modal-xl:                          1140px;

$modal-fade-transform:              translate(0, -50px);
$modal-show-transform:              none;
$modal-transition:                  transform .3s ease-out;
$modal-scale-transform:             scale(1.02);

Loop

响应式全屏模式是通过 $breakpoints 映射和 scss/_modal.scss 中的循环生成的。

@each $breakpoint in map-keys($grid-breakpoints) {
  $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
  $postfix: if($infix != "", $infix + "-down", "");

  @include media-breakpoint-down($breakpoint) {
    .modal-fullscreen#{$postfix} {
      width: 100vw;
      max-width: none;
      height: 100%;
      margin: 0;

      .modal-content {
        height: 100%;
        border: 0;
        @include border-radius(0);
      }

      .modal-header {
        @include border-radius(0);
      }

      .modal-body {
        overflow-y: auto;
      }

      .modal-footer {
        @include border-radius(0);
      }
    }
  }
}

用法

模态插件通过数据属性或 JavaScript 按需切换显示和隐藏内容。 它还覆盖默认滚动行为并生成一个 .modal-backdrop 以提供一个单击区域,以便在单击模态框外时关闭显示的模态框。

使用数据属性

切换模态框的显示和隐藏

无需编写 JavaScript 即可激活模态框。 在控件元素(如按钮)上设置 data-bs-toggle="modal" 以及 data-bs-target="#foo" href="#foo" 以针对特定模态框进行切换。

<button type="button" data-bs-toggle="modal" data-bs-target="#myModal">Launch modal</button>

关闭

可以通过 模态框内 的按钮上的 data 属性实现关闭,如下所示:

<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>

或在 模态框外 的按钮上,使用 data-bs-target,如下所示:

<button type="button" class="btn-close" data-bs-dismiss="modal" data-bs-target="#my-modal" aria-label="Close"></button>
虽然支持关暑模态框的两种方式,但请记住,从模态框外关闭与WAI-ARIA 模态对话框设计模式不匹配。 这样做需要您自担风险。

使用 JavaScript

用一行 JavaScript 创建一个模态框:

var myModal = new bootstrap.Modal(document.getElementById('myModal'), options)

选项

选项可以通过数据属性或 JavaScript 传递。 对于数据属性,将选项名称附加到 data-bs-,如 data-bs-backdrop=""

名称 类型 默认值 描述
backdrop 布尔类型或字符串 'static' true 包括一个可关闭模态框的背景元素。 或者,指定为 static,在单击背景时不关闭模态框。
keyboard 布尔类型 true 按下退出键时关闭模态框
focus 布尔类型 true 初始化时将焦点放在模态框上。

方法

异步方法和变换(transitions)

所有 API 方法都是异步并启动transition。 它们会在过渡开始后但在过渡结束之前返回给调用者。 此外,过渡中的组件上的方法调用将被忽略

查看我们的 JavaScript 文档了解更多信息

传递选项

将您的内容激活为模态框。 接受可选 object 选项。

var myModal = new bootstrap.Modal(document.getElementById('myModal'), {
  keyboard: false
})

toggle

手动切换模态框。 在模态框实际显示或隐藏之前返回调用者(即在 shown.bs.modalhidden.bs.modal 事件之前发生)。

myModal.toggle()

show

手动打开一个模态框。 在模态框实际显示之前返回调用者(即在 shown.bs.modal 事件发生之前)。

myModal.show()

此外,您可以将 DOM 元素作为可在模态框事件中接收的参数传递(即 relatedTarget 属性)。

var modalToggle = document.getElementById('toggleMyModal') // relatedTarget
myModal.show(modalToggle)

hide

手动隐藏模态框。 在模态框实际隐藏之前返回调用者(即在 hidden.bs.modal 事件发生之前)。

myModal.hide()

handleUpdate

如果模态框在打开后的高度发生变化(例如,出现滚动条时),请手动重新调整模态框的位置。

myModal.handleUpdate()

dispose

销毁模态框 (删除 DOM 元素上存储的数据)。

myModal.dispose()

getInstance

静态 方法,允许您获取与 DOM 元素关联的模态框实例

var myModalEl = document.getElementById('myModal')
var modal = bootstrap.Modal.getInstance(myModalEl) // Returns a Bootstrap modal instance

getOrCreateInstance

静态 方法,允许您获取与 DOM 元素关联的模态框实例,或者在未初始化的情况下创建一个新实例

var myModalEl = document.querySelector('#myModal')
var modal = bootstrap.Modal.getOrCreateInstance(myModalEl) // Returns a Bootstrap modal instance

事件

Bootstrap 的模态框类公开了一些事件(用作模态框功能内部的勾子)。 所有模态框事件都在模态框元素本身上触发(即在 <div class="modal"> 处)。

事件类型 描述
show.bs.modal 此事件在调用 show 实例方法时立即触发。 如果由单击引起,则单击的元素可用作事件的 relatedTarget 属性。
shown.bs.modal 当模态框对用户可见时触发此事件(将等待 CSS 过渡完成)。 如果由单击引起,则单击的元素可用作事件的 relatedTarget 属性。
hide.bs.modal 当调用 hide 实例方法时,会立即触发此事件。
hidden.bs.modal 当模态框对用户隐藏完成时会触发此事件(将等待 CSS 过渡完成)。
hidePrevented.bs.modal 此事件在模态框为显示状态时触发,其 backdrop 为 static, 当执行模式外的单击时,或退出键按下退出键并且键盘选项 data-bs-keyboard 设置为 false
var myModalEl = document.getElementById('myModal')
myModalEl.addEventListener('hidden.bs.modal', function (event) {
  // do something...
})