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: , , ,

4 Responses to “JavaScript overlay using Prototype and Script.aculo.us”

  1. Steve Says:

    Cheers mate, found this useful, going to adapt it to handle content through ajax. ;)

  2. Steve Says:

    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%’ });

  3. Matt Says:

    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;

  4. JDD Says:

    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

Leave a Reply