Modal
Optional label
Modal heading
Code:
<!--
Copyright IBM Corp. 2016, 2018
This source code is licensed under the Apache-2.0 license found in the
LICENSE file in the root directory of this source tree.
-->
<button class="bx--btn bx--btn--primary" type="button" data-modal-target="#modal-njovfhx1u9o">Show
modal</button>
<div data-modal id="modal-njovfhx1u9o" class="bx--modal " role="dialog"
aria-modal="true" aria-labelledby="modal-njovfhx1u9o-label" aria-describedby="modal-njovfhx1u9o-heading" tabindex="-1">
<div class="bx--modal-container">
<div class="bx--modal-header">
<p class="bx--modal-header__label bx--type-delta" id="modal-njovfhx1u9o-label">Optional label</p>
<p class="bx--modal-header__heading bx--type-beta" id="modal-njovfhx1u9o-heading">Modal heading</p>
<button class="bx--modal-close" type="button" data-modal-close aria-label="close modal" >
<svg focusable="false" preserveAspectRatio="xMidYMid meet" style="will-change: transform;" xmlns="http://www.w3.org/2000/svg" class="bx--modal-close__icon" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><path d="M12 4.7L11.3 4 8 7.3 4.7 4 4 4.7 7.3 8 4 11.3 4.7 12 8 8.7 11.3 12 12 11.3 8.7 8z"></path></svg>
</button>
</div>
<!-- Note: Modals with content that scrolls, at any viewport, requires `tabindex="0"` on the `bx--modal-content` element -->
<div class="bx--modal-content" >
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id accumsan augue. Phasellus consequat augue
vitae
tellus tincidunt posuere. Curabitur justo urna, consectetur vel elit iaculis, ultrices condimentum risus. Nulla
facilisi.
Etiam venenatis molestie tellus. Quisque consectetur non risus eu rutrum. </p>
</div>
<div class="bx--modal-content--overflow-indicator"></div>
<div class="bx--modal-footer">
<button class="bx--btn bx--btn--secondary" type="button" data-modal-close>Secondary button</button>
<button class="bx--btn bx--btn--primary" type="button" data-modal-primary-focus>Primary button</button>
</div>
</div>
<!-- Note: focusable span allows for focus wrap feature within Modals -->
<span tabindex="0"></span>
</div>
Optional label
Modal heading
Code:
<!--
Copyright IBM Corp. 2016, 2018
This source code is licensed under the Apache-2.0 license found in the
LICENSE file in the root directory of this source tree.
-->
<button class="bx--btn bx--btn--primary" type="button" data-modal-target="#modal-mft573cpvsd">Show
modal</button>
<div data-modal id="modal-mft573cpvsd" class="bx--modal " role="dialog"
aria-modal="true" aria-labelledby="modal-mft573cpvsd-label" aria-describedby="modal-mft573cpvsd-heading" tabindex="-1">
<div class="bx--modal-container">
<div class="bx--modal-header">
<p class="bx--modal-header__label bx--type-delta" id="modal-mft573cpvsd-label">Optional label</p>
<p class="bx--modal-header__heading bx--type-beta" id="modal-mft573cpvsd-heading">Modal heading</p>
<button class="bx--modal-close" type="button" data-modal-close aria-label="close modal" data-modal-primary-focus>
<svg focusable="false" preserveAspectRatio="xMidYMid meet" style="will-change: transform;" xmlns="http://www.w3.org/2000/svg" class="bx--modal-close__icon" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><path d="M12 4.7L11.3 4 8 7.3 4.7 4 4 4.7 7.3 8 4 11.3 4.7 12 8 8.7 11.3 12 12 11.3 8.7 8z"></path></svg>
</button>
</div>
<!-- Note: Modals with content that scrolls, at any viewport, requires `tabindex="0"` on the `bx--modal-content` element -->
<div class="bx--modal-content" >
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id accumsan augue. Phasellus consequat augue
vitae
tellus tincidunt posuere. Curabitur justo urna, consectetur vel elit iaculis, ultrices condimentum risus. Nulla
facilisi.
Etiam venenatis molestie tellus. Quisque consectetur non risus eu rutrum. </p>
</div>
<div class="bx--modal-content--overflow-indicator"></div>
</div>
<!-- Note: focusable span allows for focus wrap feature within Modals -->
<span tabindex="0"></span>
</div>
Optional label
Modal heading
Code:
<!--
Copyright IBM Corp. 2016, 2018
This source code is licensed under the Apache-2.0 license found in the
LICENSE file in the root directory of this source tree.
-->
<button class="bx--btn bx--btn--danger" type="button" data-modal-target="#modal-v0tvwmouc8f">Show
modal</button>
<div data-modal id="modal-v0tvwmouc8f" class="bx--modal bx--modal--danger" role="dialog"
aria-modal="true" aria-labelledby="modal-v0tvwmouc8f-label" aria-describedby="modal-v0tvwmouc8f-heading" tabindex="-1">
<div class="bx--modal-container">
<div class="bx--modal-header">
<p class="bx--modal-header__label bx--type-delta" id="modal-v0tvwmouc8f-label">Optional label</p>
<p class="bx--modal-header__heading bx--type-beta" id="modal-v0tvwmouc8f-heading">Modal heading</p>
<button class="bx--modal-close" type="button" data-modal-close aria-label="close modal" >
<svg focusable="false" preserveAspectRatio="xMidYMid meet" style="will-change: transform;" xmlns="http://www.w3.org/2000/svg" class="bx--modal-close__icon" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><path d="M12 4.7L11.3 4 8 7.3 4.7 4 4 4.7 7.3 8 4 11.3 4.7 12 8 8.7 11.3 12 12 11.3 8.7 8z"></path></svg>
</button>
</div>
<!-- Note: Modals with content that scrolls, at any viewport, requires `tabindex="0"` on the `bx--modal-content` element -->
<div class="bx--modal-content" >
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id accumsan augue. Phasellus consequat augue
vitae
tellus tincidunt posuere. Curabitur justo urna, consectetur vel elit iaculis, ultrices condimentum risus. Nulla
facilisi.
Etiam venenatis molestie tellus. Quisque consectetur non risus eu rutrum. </p>
</div>
<div class="bx--modal-content--overflow-indicator"></div>
<div class="bx--modal-footer">
<button class="bx--btn bx--btn--secondary" type="button" data-modal-close>Secondary button</button>
<button class="bx--btn bx--btn--danger" type="button" aria-label="Danger"
data-modal-primary-focus>Primary button</button>
</div>
</div>
<!-- Note: focusable span allows for focus wrap feature within Modals -->
<span tabindex="0"></span>
</div>
Optional label
Modal heading
Code:
<!--
Copyright IBM Corp. 2016, 2018
This source code is licensed under the Apache-2.0 license found in the
LICENSE file in the root directory of this source tree.
-->
<button class="bx--btn bx--btn--primary" type="button" data-modal-target="#modal-j7gwhh2rew7">Show
modal</button>
<div data-modal id="modal-j7gwhh2rew7" class="bx--modal " role="dialog"
aria-modal="true" aria-labelledby="modal-j7gwhh2rew7-label" aria-describedby="modal-j7gwhh2rew7-heading" tabindex="-1">
<div class="bx--modal-container">
<div class="bx--modal-header">
<p class="bx--modal-header__label bx--type-delta" id="modal-j7gwhh2rew7-label">Optional label</p>
<p class="bx--modal-header__heading bx--type-beta" id="modal-j7gwhh2rew7-heading">Modal heading</p>
<button class="bx--modal-close" type="button" data-modal-close aria-label="close modal" >
<svg focusable="false" preserveAspectRatio="xMidYMid meet" style="will-change: transform;" xmlns="http://www.w3.org/2000/svg" class="bx--modal-close__icon" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><path d="M12 4.7L11.3 4 8 7.3 4.7 4 4 4.7 7.3 8 4 11.3 4.7 12 8 8.7 11.3 12 12 11.3 8.7 8z"></path></svg>
</button>
</div>
<!-- Note: Modals with content that scrolls, at any viewport, requires `tabindex="0"` on the `bx--modal-content` element -->
<div class="bx--modal-content bx--modal-content--with-form" >
<div class="bx--form-item">
<label for="text-input-j7gwhh2rew7" class="bx--label">Text Input label</label>
<input id="text-input-j7gwhh2rew7" type="text" class="bx--text-input" placeholder="Optional placeholder text"
data-modal-primary-focus>
</div>
</div>
<div class="bx--modal-content--overflow-indicator"></div>
<div class="bx--modal-footer">
<button class="bx--btn bx--btn--secondary" type="button" data-modal-close>Secondary button</button>
<button class="bx--btn bx--btn--primary" type="button" >Primary button</button>
</div>
</div>
<!-- Note: focusable span allows for focus wrap feature within Modals -->
<span tabindex="0"></span>
</div>
Documentation
SCSS
Modifiers
Use these modifiers with .bx--modal
class.
Name | Description |
---|---|
.bx--modal--danger |
Selector for applying danger modal styles |
JavaScript
Getting component class reference
ES2015
import { Modal } from 'carbon-components';
With pre-build bundle (carbon-components.min.js
)
var Modal = CarbonComponents.Modal;
Instantiating
For one with a trigger button (a <button>
with data-modal-target
attribute)
Modal.init();
For one without a trigger button
// `#my-modal` is an element with `[data-modal]` attribute
Modal.create(document.getElementById('my-modal'));
Public methods
Name | Params | Description |
---|---|---|
release |
Deletes the instance | |
show |
Show the modal | |
hide |
Hide the modal |
Example - Showing modal
// `#my-modal` is an element with `[data-modal]` attribute
var modalInstance = Modal.create(document.getElementById('my-modal'));
modalInstance.show();
Options
Option | Default selector | Description |
---|---|---|
selectorInit |
'[data-modal]' | The css selector for root modal component |
selectorModalClose |
'[data-modal-close]' | The selector to find elements that close the modal |
selectorPrimaryFocus |
'[data-modal-primary-focus]' | The CSS selector to determine the element to put focus when modal gets open |
classVisible |
'is-visible' | Class to toggle visibility of modal |
classBody |
'bx--body--with-modal-open' | Class on <body> that toggles when a modal opens/closes |
attribInitTarget |
'data-modal-target' | The attribute on the launching element to target the modal |
initEventNames |
'['click']' | On specified events, if event matches the attribInitTarget, then initialize the component and run createdByLauncher if method exists |
Example - Putting focus on text box when modal gets open
<div
data-modal
id="my-modal"
class="bx--modal "
role="dialog"
aria-modal="true"
aria-labelledby="my-modal-label"
aria-describedby="my-modal-heading"
tabindex="-1"
>
<div class="bx--modal-container">
<div class="bx--modal-header">
<p class="bx--modal-header__heading bx--type-beta" id="my-modal-heading">
Modal heading
</p>
<button
class="bx--modal-close"
type="button"
data-modal-close
aria-label="close modal"
>
(The close button image)
</button>
</div>
<div class="bx--modal-content">
<label for="my-text-input" class="bx--label">Text Input label</label>
<input
id="my-text-input"
type="text"
class="bx--text-input"
placeholder="Optional placeholder text"
data-modal-primary-focus
/>
</div>
</div>
</div>
Events
Event option | Event name |
---|---|
eventBeforeShown |
'modal-beingshown' |
eventAfterShown |
'modal-shown' |
eventBeforeHidden |
'modal-beinghidden' |
eventAfterHidden |
'modal-hidden' |
Example - Preventing modals from being closed in a certain condition
document.addEventListener('modal-beinghidden', function(evt) {
if (myApplication.shouldModalKeptOpen(evt.target)) {
evt.preventDefault();
}
});
Example - Notifying events of all modals being closed to an analytics library
document.addEventListener('modal-hidden', function(evt) {
myAnalyticsLibrary.send({
action: 'Modal hidden',
id: evt.target.id,
});
});
FAQ
How do I point multiple elements to the same modal?
To trigger the same modal, you need to add the data-modal-target
attribute to
a element, and then point it to the same id. For example
<button
class="bx--btn bx-btn--primary"
type="button"
data-modal-target="#modal"
>
A button
</button>
<button
class="bx--btn bx-btn--secondary"
type="button"
data-modal-target="#modal"
>
Another button
</button>
Both these buttons would trigger the modal with the id of modal.