Reveal Modal
Modal dialogs, or pop-up windows, are handy for prototyping and production. Foundation includes Reveal our jQuery modal plugin, to make this easy for you.
Basic
You can create a reveal modal using minimal markup. The anchor tag with the reveal-modal-id is what triggers the Reveal.
HTML
<a href="#" data-reveal-id="myModal">Click Me For A Modal</a>
<div id="myModal" class="reveal-modal" data-reveal aria-labelledby="modalTitle" aria-hidden="true" role="dialog">
<h2 id="modalTitle">Awesome. I have it.</h2>
<p class="lead">Your couch. It is mine.</p>
<p>I'm a cool paragraph that lives inside of an even cooler modal. Wins!</p>
<a class="close-reveal-modal" aria-label="Close">×</a>
</div>
Rendered HTML
Click Me For A ModalIntermediate
You can create a reveal modal with another inside it. Setting reveal.multiple_opened
to true
will not close previously opened reveal modals. You can even put a video into a reveal.
HTML
<!-- Triggers the modals -->
<a href="#" data-reveal-id="firstModal" class="radius button">Modal in a modal…</a>
<a href="#" data-reveal-id="videoModal" class="radius button">Example Modal with Video…</a>
<!-- Reveal Modals begin -->
<div id="firstModal" class="reveal-modal" data-reveal aria-labelledby="firstModalTitle" aria-hidden="true" role="dialog">
<h2 id="firstModalTitle">This is a modal.</h2>
<p>Reveal makes these very easy to summon and dismiss. The close button is simply an anchor with a unicode character icon and a class of <code>close-reveal-modal</code>. Clicking anywhere outside the modal will also dismiss it.</p>
<p>Finally, if your modal summons another Reveal modal, the plugin will handle that for you gracefully.</p>
<p><a href="#" data-reveal-id="secondModal" class="secondary button">Second Modal...</a></p>
<a class="close-reveal-modal" aria-label="Close">×</a>
</div>
<div id="secondModal" class="reveal-modal" data-reveal aria-labelledby="secondModalTitle" aria-hidden="true" role="dialog">
<h2 id="secondModalTitle">This is a second modal.</h2>
<p>See? It just slides into place after the other first modal. Very handy when you need subsequent dialogs, or when a modal option impacts or requires another decision.</p>
<a class="close-reveal-modal" aria-label="Close">×</a>
</div>
<div id="videoModal" class="reveal-modal large" data-reveal aria-labelledby="videoModalTitle" aria-hidden="true" role="dialog">
<h2 id="videoModalTitle">This modal has video</h2>
<div class="flex-video widescreen vimeo">
<iframe width="1280" height="720" src="//www.youtube-nocookie.com/embed/wnXCopXXblE?rel=0" frameborder="0" allowfullscreen></iframe>
</div>
<a class="close-reveal-modal" aria-label="Close">×</a>
</div>
<!-- Reveal Modals end -->
Advanced
Additional classes can be added to your reveal modal to change its appearance.
The class options:
tiny
: Set the width to 30%.small
: Set the width to 40%.medium
: Set the width to 60%.large
: Set the width to 70%.xlarge
: Set the width to 95%.full
: Set the width and height to 100%.
Note: Default on small is 100% (full) width.
Removing the Background
HTML
<div class="reveal-modal-bg" style="display: none"></div>
Firing a Reveal Modal
To launch a modal, just add a data-reveal-id
to the object which you want to fire the modal when clicked. The data-reveal-id
needs to match the id
of your reveal.
HTML
<a href="#" data-reveal-id="myModal">Click Me For A Modal</a>
You can also open and close Reveal via Javascript:
// trigger by event
$('a.reveal-link').trigger('click');
$('a.close-reveal-modal').trigger('click');
// or directly on the modal
$('#myModal').foundation('reveal', 'open');
$('#myModal').foundation('reveal', 'close');
Or you can call one right after the other:
<div class='reveal-modal' id='first-modal' data-reveal>
I'm the firstborn!
<a class='open-second'>Click me!</a>
</div>
<div class='reveal-modal' id='second-modal' data-reveal>
I'm the secondborn!
<a class='close'>Close modal</a>
</div>
<a class='open-first'>Click me!</a>
// There's no need to close a previous modal before you
// open another one.
$('a.open-first').on('click', function() {
$('#first-modal').foundation('reveal','open');
});
$('a.open-second').on('click', function() {
$('#second-modal').foundation('reveal', 'open');
});
$('a.close').on('click', function() {
$('#second-modal').foundation('reveal', 'close');
});
Firing a Reveal Modal with Ajax Content
To launch a modal with content from another page, just add adata-reveal-ajax
attribute pointing to the url of that page. When clicked, the Reveal modal will be opened with a content from that page. Beware: content of the object from data-reveal-id
attribute will be overwritten as a result.
To use an url from href
attribute just add data-reveal-ajax="true"
instead.
JS
<button data-reveal-id="myModal" data-reveal-ajax="http://some-url">
Click Me For A Modal
</button>
<a href="http://some-url" data-reveal-id="myModal" data-reveal-ajax="true">
Click Me For A Modal
</a>
Ajax-based Reveal modals can also be opened via Javascript:
JS
// just an url
$('#myModal').foundation('reveal', 'open', 'http://some-url');
// url with extra parameters
$('#myModal').foundation('reveal', 'open', {
url: 'http://some-url',
data: {param1: 'value1', param2: 'value2'}
});
// url with custom callbacks
$('#myModal').foundation('reveal', 'open', {
url: 'http://some-url',
success: function(data) {
alert('modal data loaded');
},
error: function() {
alert('failed loading modal');
}
});
Please refer to http://api.jquery.com/jQuery.ajax/ for a complete list of possible parameters.
Event Bindings
There are a series of events that you can bind to for triggering callbacks:
Deprecation Notice
Previous versions of the reveal plugin emitted un-namespaced open
, opened
, close
and closed
events, however, these have been replaced by the namespaced open.fndtn.reveal
, opened.fndtn.reveal
, close.fndtn.reveal
and closed.fndtn.reveal
events. The un-namespaced events have been fully deprecated.
$(document).on('open.fndtn.reveal', '[data-reveal]', function () {
var modal = $(this);
});
$(document).on('opened.fndtn.reveal', '[data-reveal]', function () {
var modal = $(this);
});
$(document).on('close.fndtn.reveal', '[data-reveal]', function () {
var modal = $(this);
});
$(document).on('closed.fndtn.reveal', '[data-reveal]', function () {
var modal = $(this);
});
Accessibility
This component is not yet fully accessible. While it is usable via the keyboard, it has to be checked if additional ARIA attributes can enhance the components accessibility.
Customize with Sass
Reveal modals can be easily customized using our Sass variables.
SCSS
$include-html-reveal-classes: $include-html-classes;
// We use these to control the style of the reveal overlay.
$reveal-overlay-bg: rgba($black, .45);
$reveal-overlay-bg-old: $black;
// We use these to control the style of the modal itself.
$reveal-modal-bg: $white;
$reveal-position-top: rem-calc(100);
$reveal-default-width: 80%;
$reveal-max-width: $row-width;
$reveal-modal-padding: rem-calc(20);
$reveal-box-shadow: 0 0 10px rgba($black,.4);
// We use these to style the reveal close button
$reveal-close-font-size: rem-calc(40);
$reveal-close-top: rem-calc(8);
$reveal-close-side: rem-calc(11);
$reveal-close-color: $base;
$reveal-close-weight: $font-weight-bold;
// We use this to set the default radius used throughout the core.
$reveal-radius: $global-radius;
$reveal-round: $global-rounded;
// We use these to control the modal border
$reveal-border-style: solid;
$reveal-border-width: 1px;
$reveal-border-color: $steel;
$reveal-modal-class: "reveal-modal";
$close-reveal-modal-class: "close-reveal-modal";
Semantic Markup With Sass
You can create your own reveal modals using our Sass mixins.
Setting the background
You can use the reveal-bg()
mixin to create your own reveal modal, like so:
.custom-reveal-class {
@include reveal-bg();
}
Creating the base structure
You can use this mixin to create the structure of a reveal modal
.custom-reveal-class {
@include reveal-modal-base(
// Provides reveal base styles, can be set to false to override.
$base-style:true,
// Sets reveal width Default: $reveal-default-width or 80%
$width:$reveal-default-width
);
}
Set Reveal Base Styles
You can use this mixin to style the reveal modal defaults
.custom-reveal-class {
@include reveal-modal-style(
// Sets background color of reveal modal. Default: $reveal-modal-bg or #fff
$bg:$reveal-modal-bg,
// Set reveal border style. Default: $reveal-border-style or solid
$border:true,
// Width of border (i.e. 1px). Default: $reveal-border-width.
$border-style:$reveal-border-style,
// Color of border. Default: $reveal-border-color.
$border-width:$reveal-border-width,
// Color of border. Default: $reveal-border-color.
$border-color:$reveal-border-color,
// Choose whether or not to include the default box-shadow. Default: true, Options: false
$box-shadow:true,
// Default: $reveal-position-top or 50px
$top-offset:$reveal-position-top
);
}
Add a close button
You can use this mixin to create a close button for the reveal modal
.custom-reveal-class {
@include reveal-close(
$color:$reveal-close-color
);
}
Note: rem-calc();
is a function we wrote to convert px
to rem
. It is included in _variables.scss.
Using the Javascript
foundation.min.js
are available on your page. You can refer to the Javascript documentation on setting that up.
If you are not using foundation.min.js and individually adding plugins, include foundation.reveal.js
AFTER the foundation.js
file. Your markup should look something like this:
<body>
...
<script src="js/vendor/jquery.js"></script>
<script src="js/foundation/foundation.js"></script>
<script src="js/foundation/foundation.reveal.js"></script>
<!-- Other JS plugins can be included here -->
<script>
$(document).foundation();
</script>
</body>
Required Foundation Library: foundation.reveal.js
Optional Javascript Configuration
Reveal options can only be passed in during initialization at this time. However, you can bind to the open, opened, close, and closed events.
You can also specify an AJAX error callback with the option on_ajax_error.{
animation: 'fadeAndPop',
animation_speed: 250,
close_on_background_click: true,
dismiss_modal_class: 'close-reveal-modal',
multiple_opened: false,
bg_class: 'reveal-modal-bg',
root_element: 'body',
on_ajax_error: $.noop,
bg : $('.reveal-modal-bg'),
css : {
open : {
'opacity': 0,
'visibility': 'visible',
'display' : 'block'
},
close : {
'opacity': 1,
'visibility': 'hidden',
'display': 'none'
}
}
}
### Adding New Reveal Content After Page Load If you add new content after the page has been loaded, you will need to reinitialize the Foundation JavaScript by running the following:
$(document).foundation();
Reflow will make Foundation check the DOM for any elements and re-apply any listeners to them.
$(document).foundation('reveal', 'reflow');
*
Sass Errors?
If the default "foundation" import was commented out, then make sure you import this file:
SCSS
@import "foundation/components/reveal";