Hacer por nosotros mismos este sistema realmente no tiene mucha complejidad, si tenemos un poco de idea de CSS y hemos seguido el Manual de Mootools publicado en DesarrolloWeb.com. En este artículo no vamos a explicar cómo se haría este sistema DHTML paso por paso, sino que vamos a publicar directamente un script, creado por nosotros mismos, que genera los popups y los muestra. Lo que aprenderemos a continuación es a usar esos scripts en nuestras propias páginas.
Queremos ir explicando poco a poco diversos componentes útiles para crear interfaces de usuario en páginas web, que hemos creado el propio equipo de DesarrolloWeb.com y tenemos en producción en este sitio web. Lo iremos publicando todo en el Taller de Mootools.
El desarrollo de este tipo de popups podría hacerse de diversos modos y con más y menos opciones de personalización. La versión que publicamos es bastante sencilla y por supuesto que podría implementarse de una manera más elaborada, pero al menos veremos un popup sencillo de entender y plenamente usable.
Veremos una receta paso por paso para poner en marcha este popup.
var MiPopup = new Class({
initialize: function(miHtml,ancho,alto,titulo){
this.titulo=titulo;
this.tamanoBody = window.getScrollSize();
this.posScroll = window.getScroll();
this.espacioDisponibleVentana = window.getSize();
this.capaSombra = new Element("div", {'id': 'capasombra', 'style': 'width: ' + this.tamanoBody.x + 'px; height: ' + this.tamanoBody.y + 'px; ' });
this.capaSombra.inject(document.body);
var myFx = new Fx.Tween(this.capaSombra,{'duration': 300});
myFx.start('opacity',0,0.8);
this.contenido = new Element("div", {'id': 'contenidopopup'});
this.contenido.set('html', "<div class=cuerpotextopopup>" + miHtml + "</div>");
var titulo = new Element("div", {'id': 'titulopopup'});
titulo.set('html', this.titulo);
var cerrar = new Element("div", {'id': 'cerrarpopup'});
cerrar.addEvent('click', function(){
this.cerrar();
}.bind(this));
cerrar.inject(titulo,'top');
titulo.inject(this.contenido,'top');
this.capaPopup = new Element("div", {'id': 'capapopup', 'style': 'margin-left:-' + ancho/2 +'px; top:' + (this.posScroll.y + (this.espacioDisponibleVentana.y/2) - (alto/2)-15) +'px'});
this.capaPopup.inject(this.capaSombra,'after');
var myFx2 = new Fx.Tween(this.capaPopup,{'duration': 700});
myFx2.start('width',4,ancho);
myFx2.addEvent('complete', function(){
var myFx3 = new Fx.Tween(this.capaPopup,{'duration': 700});
myFx3.start('height',4,alto+30);
myFx3.addEvent('complete', function(){
this.contenido.inject(this.capaPopup);
this.contenido.setStyle('opacity', 0);
this.contenido.setStyle('display', 'block');
var myFx4 = new Fx.Tween(this.contenido,{'duration': 600});
myFx4.start('opacity',0,1);
}.bind(this));
}.bind(this));
this.capaSombra.addEvent('click', function(){
this.cerrar();
}.bind(this)
);
},
cerrar: function(){
var myFx = new Fx.Tween(this.capaPopup,{'duration': 500});
myFx.start('opacity',1,0);
myFx.addEvent('complete', function(){
var myFx2 = new Fx.Tween(this.capaSombra,{'duration': 500});
myFx2.start('opacity',0.8,0);
myFx2.addEvent('complete', function(){
this.capaSombra.destroy();
this.capaPopup.destroy();
}.bind(this));
}.bind(this));
}
});
Como se puede ver, la clase tiene un método initialize(), que es el constructor y un método cerrar() que es el que se encargar de cerrar el popup.
El método constructor recibe 4 parámetros, que son el HTML que queremos mostrar en el popup, la anchura y altura que deseamos que tenga y finalmente una cadena con el título para la cabecera del popup. Al llamar al constructor se muestra directamente el popup en la página, es decir, construir el popup hace que éste se muestre directamente en la página. Luego veremos cómo llamar a este constructor desde nuestros scripts como respuesta a una acción del usuario.
El método cerrar() no nos debe importar demasiado, puesto que nosotros no tenemos que invocarlo directamente para cerrar el popup, sino que ya se enlaza desde el botón de cerrar del popup automáticamente.
/*POPUP*/
#capasombra {
background:#000000 none repeat scroll 0 0;
cursor:pointer;
left:0;
opacity:0;
position:absolute;
text-align:center;
top:0;
}
#capapopup {
background-color:#ccF;
border:3px solid #339;
height:5px;
left:50%;
overflow:hidden;
padding:4px;
position:absolute;
text-align:left;
width:4px;
}
#cerrarpopup {
background:transparent url(images/cerrarpopup.png) no-repeat scroll 0 0;
cursor:pointer;
float:right;
height:28px;
width:35px;
}
#titulopopup {
background: #cf6 none repeat scroll 0 0;
border-bottom: 2px solid #ffc;
font-size:1em;
font-weight:bold;
height:32px;
line-height:27px;
margin-bottom:3px;
overflow:hidden;
padding:2px 3px 0 10px;
text-align:left;
}
#contenidopopup {
display:none;
opacity:0;
}
.cuerpotextopopup{padding:5px;font-size: 0.75em;}
<a href="#" id="popup1">Este enlace abre un popup!</a>
<br>
<br>
<div id="capa">Haciendo clic en esta capa también se abre un popup!</div>
Si os fijáis, lo único que se tiene que colocar es un identificador a ese elemento, porque ahora tendremos que hacer un script para asociar ese o esos elementos al popup.
Tenemos primero que definir un evento "click" sobre el elemento que deseemos (podría ser también cualquier otro tipo de evento, pero el típico que necesitaremos será el clic). Luego podríamos llamar al constructor del popup para generar el popup DHTML. La propia llamada al constructor se encargará de abrir el popup.
Al constructor le enviaremos varios datos, como se comentó antes. El más importante es el código HTML del texto que se quiere mostrar en el cuerpo del popup. Pero también tenemos que indicar una anchura y altura, con dos números enteros que tendremos que marcar en el momento de invocar el popup. Luego también debemos especificar el título con el que encabezar el popup.
Tenemos a continuación dos códigos de ejemplo, para poder asociar los eventos a cada uno de los dos elementos que vimos en el paso anterior.
$("popup1").addEvent("click", function(e){
e.stop();
var htmlPopup = "<b>Hola amigos!</b>,<p>Esto es una prueba de un popup DHTML con la típica capa de sombra!</p><p>Podríamos hacerlo fácilmente con Mootools, aunque este script he de aceptar que podría mejorarse.";
new MiPopup(htmlPopup, 400, 160, "Primer Popup desde un enlace");
});
$("capa").addEvent("click", function(e){
e.stop();
var htmlPopup = "Este popup es sencillo de usar, pero con funcionalidad limitada!";
new MiPopup(htmlPopup, 600, 50, "Primer Popup desde un enlace");
});
<html>
<head>
<title>Probando popup DHTML Mootools</title>
<style type="text/css">
body{
font-family: verdana, arial;
}
/*POPUP*/
#capasombra {
background:#000000 none repeat scroll 0 0;
cursor:pointer;
left:0;
opacity:0;
position:absolute;
text-align:center;
top:0;
}
#capapopup {
background-color:#ccF;
border:3px solid #339;
height:5px;
left:50%;
overflow:hidden;
padding:4px;
position:absolute;
text-align:left;
width:4px;
}
#cerrarpopup {
background:transparent url(images/cerrarpopup.png) no-repeat scroll 0 0;
cursor:pointer;
float:right;
height:28px;
width:35px;
}
#titulopopup {
background: #cf6 none repeat scroll 0 0;
border-bottom: 2px solid #ffc;
font-size:1em;
font-weight:bold;
height:32px;
line-height:27px;
margin-bottom:3px;
overflow:hidden;
padding:2px 3px 0 10px;
text-align:left;
}
#contenidopopup {
display:none;
opacity:0;
}
.cuerpotextopopup{padding:5px;font-size: 0.75em;}
</style>
<script src="../mootools-1.2.4-core-yc.js" type="text/javascript"></script>
<script>
var MiPopup = new Class({
initialize: function(miHtml,ancho,alto,titulo){
this.titulo=titulo;
this.tamanoBody = window.getScrollSize();
this.posScroll = window.getScroll();
this.espacioDisponibleVentana = window.getSize();
this.capaSombra = new Element("div", {'id': 'capasombra', 'style': 'width: ' + this.tamanoBody.x + 'px; height: ' + this.tamanoBody.y + 'px; ' });
this.capaSombra.inject(document.body);
var myFx = new Fx.Tween(this.capaSombra,{'duration': 300});
myFx.start('opacity',0,0.8);
this.contenido = new Element("div", {'id': 'contenidopopup'});
this.contenido.set('html', "<div class=cuerpotextopopup>" + miHtml + "</div>");
var titulo = new Element("div", {'id': 'titulopopup'});
titulo.set('html', this.titulo);
var cerrar = new Element("div", {'id': 'cerrarpopup'});
cerrar.addEvent('click', function(){
this.cerrar();
}.bind(this));
cerrar.inject(titulo,'top');
titulo.inject(this.contenido,'top');
this.capaPopup = new Element("div", {'id': 'capapopup', 'style': 'margin-left:-' + ancho/2 +'px; top:' + (this.posScroll.y + (this.espacioDisponibleVentana.y/2) - (alto/2)-15) +'px'});
this.capaPopup.inject(this.capaSombra,'after');
var myFx2 = new Fx.Tween(this.capaPopup,{'duration': 700});
myFx2.start('width',4,ancho);
myFx2.addEvent('complete', function(){
var myFx3 = new Fx.Tween(this.capaPopup,{'duration': 700});
myFx3.start('height',4,alto+30);
myFx3.addEvent('complete', function(){
this.contenido.inject(this.capaPopup);
this.contenido.setStyle('opacity', 0);
this.contenido.setStyle('display', 'block');
var myFx4 = new Fx.Tween(this.contenido,{'duration': 600});
myFx4.start('opacity',0,1);
}.bind(this));
}.bind(this));
this.capaSombra.addEvent('click', function(){
this.cerrar();
}.bind(this)
);
},
cerrar: function(){
var myFx = new Fx.Tween(this.capaPopup,{'duration': 500});
myFx.start('opacity',1,0);
myFx.addEvent('complete', function(){
var myFx2 = new Fx.Tween(this.capaSombra,{'duration': 500});
myFx2.start('opacity',0.8,0);
myFx2.addEvent('complete', function(){
this.capaSombra.destroy();
this.capaPopup.destroy();
}.bind(this));
}.bind(this));
}
});
window.addEvent("domready", function(){
$("popup1").addEvent("click", function(e){
e.stop();
var htmlPopup = "<b>Hola amigos!</b>,<p>Esto es una prueba de un popup DHTML con la típica capa de sombra!</p><p>Podríamos hacerlo fácilmente con Mootools, aunque este script he de aceptar que podría mejorarse.";
new MiPopup(htmlPopup, 400, 160, "Primer Popup desde un enlace");
});
$("capa").addEvent("click", function(e){
e.stop();
var htmlPopup = "Este popup es sencillo de usar, pero con funcionalidad limitada!";
new MiPopup(htmlPopup, 600, 50, "Primer Popup desde un enlace");
});
});
</script>
</head>
<body>
<a href="#" id="popup1">Este enlace abre un popup!</a>
<br>
<br>
<br>
<div id="capa">Haciendo clic en esta capa también se abre un popup!</div>
</body>
</html>
Finalmente, ponemos un enlace para los que quieran ver el script en marcha.
![]() beni088... | El mismo ejemplo con jquery | 04/3/2010 |