JavaScript overlay using Prototype and Script.aculo.us
As part of the interface for a web application, I wrote the following code to implement a modal dialogue box in JavaScript (similar to the Lightbox effect).
While there are a few different examples of this effect that I could have used, I was after something straight-forward and lightweight with clear separation of design (CSS) and presentation logic (JavaScript).
function DialogOverlay(content, container) { // Manage arguments and assign defaults, if (typeof container == 'undefined' ) container = document.body; if (null == (this.container = $(container))) throw("container is not valid"); // Assign instance variables this.content = content; this.overlay = new Element('div', { 'class': 'overlay' }).hide(); this.dialog = new Element('div', { 'class': 'dialog' }).hide(); // Hide the overlay when clicked. Ignore clicks on the dialog. Event.observe(this.overlay, 'click', this.hide.bindAsEventListener(this)); Event.observe(this.dialog, 'click', function(event) { Event.stop(event) }); // Insert the elements into the DOM this.dialog.insert(this.content); this.container.insert(this.overlay); this.container.insert(this.dialog); // Content may have been hidden if it is embedded in the page content.show(); this.dialog.hide(); } DialogOverlay.prototype.show = function() { new Effect.Appear(this.overlay, { duration: 0.5, to: 0.8 }); this.dialog.show(); return this; }; DialogOverlay.prototype.hide = function(event) { this.dialog.hide(); this.overlay.hide(); return this; };
Adding a dialogue object to your page is simple:
<script type="text/javascript"> var dialog = new Element('div'); dialog.insert(new Element('h2').insert('Dialogue')); var overlay = new DialogOverlay(dialog); </script>
In addition, you'll need some CSS to control the presentation of the overlay and dialogue box:
.overlay { width: 100%; height: 100%; background: black; position: fixed; top: 0; left: 0; z-index: 98; } .dialog { width: 50%; min-height: 50%; background: white; position: fixed; top: 25%; left: 25%; z-index: 99; }
I uploaded the JavaScript class (overlay.js) and made a quick example page to show it working.
Tags: development, javascript, prototype, scriptaculous
June 4th, 2008 at 5:15 pm
Cheers mate, found this useful, going to adapt it to handle content through ajax.
June 4th, 2008 at 5:33 pm
Sorry for double post, but just to add, for some reason the overlay was only working up to the last element on the page, (if the browser was bigger than content) so I change line:
this.overlay.setStyle({ height: document.body.getHeight() + ‘px’ });
to:
this.overlay.setStyle({ height: ‘100%’ });
June 5th, 2008 at 9:06 am
Hi Steve, thanks for the feedback - glad you found it useful!
I think I came across the height issue myself at some stage. I also changed the CSS so that the overlay position is fixed, stopping the user scrolling past the end of the overlay.
It was able to centre the dialogue better with a fixed height and width, using negative margins to bring it back in line:
top: 50%;
left: 50%;
width: 30em;
height: 22em;
margin: -11em 0 0 -15em;
August 22nd, 2008 at 11:18 pm
I optimized your code a bit, I didn’t test it so there could be some bugs.
I made the dialog appear after the overlay has finished its fade-in animation.
http://gist.github.com/6855