--- layout: docs title: Modal group: components --- Modals are streamlined, but flexible, dialog prompts with the minimum required functionality and smart defaults. ## Contents * Will be replaced with the ToC, excluding the "Contents" header {:toc} **Due to how HTML5 defines its semantics, [the `autofocus` HTML attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-autofocus) has no effect in Bootstrap modals.** To achieve the same effect, use some custom JavaScript: {% highlight js %} $('#myModal').on('shown.bs.modal', function () { $('#myInput').focus() }) {% endhighlight %} {% callout warning %} #### Multiple open modals not supported Be sure not to open a modal while another is still visible. Showing more than one modal at a time requires custom code. {% endcallout %} {% callout warning %} #### Modal markup placement Always try to place a modal's HTML code in a top-level position in your document to avoid other components affecting the modal's appearance and/or functionality. {% endcallout %} {% callout warning %} #### Mobile device caveats There are some caveats regarding using modals on mobile devices. [See our browser support docs]({{ site.baseurl }}/getting-started/browsers-devices/#modals-navbars-and-virtual-keyboards) for details. {% endcallout %} ### Static example A rendered modal with header, body, and set of actions in the footer.
{% highlight html %} {% endhighlight %} ### Live demo Toggle a modal via JavaScript by clicking the button below. It will slide down and fade in from the top of the page.
{% highlight html %} {% endhighlight %} {% callout warning %} #### Make modals accessible Be sure to add `role="dialog"` and `aria-labelledby="..."`, referencing the modal title, to `.modal`, and `role="document"` to the `.modal-dialog` itself. Additionally, you may give a description of your modal dialog with `aria-describedby` on `.modal`. {% endcallout %} {% callout info %} #### Embedding YouTube videos Embedding YouTube videos in modals requires additional JavaScript not in Bootstrap to automatically stop playback and more. [See this helpful Stack Overflow post](https://stackoverflow.com/questions/18622508/bootstrap-3-and-youtube-in-modal) for more information. {% endcallout %} ## Optional sizes Modals have two optional sizes, available via modifier classes to be placed on a `.modal-dialog`.
{% highlight html %} {% endhighlight %} ## Remove animation For modals that simply appear rather than fade in to view, remove the `.fade` class from your modal markup. {% highlight html %} {% endhighlight %} ## Using the grid system To take advantage of the Bootstrap grid system within a modal, just nest `.container-fluid` within the `.modal-body` and then use the normal grid system classes within this container. {% example html %}
{% endexample %} ## Varying modal content based on trigger button Have a bunch of buttons that all trigger the same modal, just with slightly different contents? Use `event.relatedTarget` and [HTML `data-*` attributes](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_data_attributes) (possibly [via jQuery](https://api.jquery.com/data/)) to vary the contents of the modal depending on which button was clicked. See the Modal Events docs for details on `relatedTarget`. {% example html %}
{% endexample %} {% highlight js %} $('#exampleModal').on('show.bs.modal', function (event) { var button = $(event.relatedTarget) // Button that triggered the modal var recipient = button.data('whatever') // Extract info from data-* attributes // If necessary, you could initiate an AJAX request here (and then do the updating in a callback). // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead. var modal = $(this) modal.find('.modal-title').text('New message to ' + recipient) modal.find('.modal-body input').val(recipient) }) {% endhighlight %} ## Modals with dynamic heights If the height of a modal changes while it is open, you should call `$('#myModal').data('bs.modal').handleUpdate()` to readjust the modal's position in case a scrollbar appears. ## Usage The modal plugin toggles your hidden content on demand, via data attributes or JavaScript. It also adds `.modal-open` to the `` to override default scrolling behavior and generates a `.modal-backdrop` to provide a click area for dismissing shown modals when clicking outside the modal. ### Via data attributes Activate a modal without writing JavaScript. Set `data-toggle="modal"` on a controller element, like a button, along with a `data-target="#foo"` or `href="#foo"` to target a specific modal to toggle. {% highlight html %} {% endhighlight %} ### Via JavaScript Call a modal with id `myModal` with a single line of JavaScript: {% highlight js %}$('#myModal').modal(options){% endhighlight %} ### Options Options can be passed via data attributes or JavaScript. For data attributes, append the option name to `data-`, as in `data-backdrop=""`.
Name Type Default Description
backdrop boolean or the string 'static' true Includes a modal-backdrop element. Alternatively, specify static for a backdrop which doesn't close the modal on click.
keyboard boolean true Closes the modal when escape key is pressed
show boolean true Shows the modal when initialized.
### Methods #### `.modal(options)` Activates your content as a modal. Accepts an optional options `object`. {% highlight js %} $('#myModal').modal({ keyboard: false }) {% endhighlight %} #### `.modal('toggle')` Manually toggles a modal. **Returns to the caller before the modal has actually been shown or hidden** (i.e. before the `shown.bs.modal` or `hidden.bs.modal` event occurs). {% highlight js %}$('#myModal').modal('toggle'){% endhighlight %} #### `.modal('show')` Manually opens a modal. **Returns to the caller before the modal has actually been shown** (i.e. before the `shown.bs.modal` event occurs). {% highlight js %}$('#myModal').modal('show'){% endhighlight %} #### `.modal('hide')` Manually hides a modal. **Returns to the caller before the modal has actually been hidden** (i.e. before the `hidden.bs.modal` event occurs). {% highlight js %}$('#myModal').modal('hide'){% endhighlight %} ### Events Bootstrap's modal class exposes a few events for hooking into modal functionality. All modal events are fired at the modal itself (i.e. at the `