Ventana modal sólo con CSS

A raíz de mi proyecto musical más reciente lanzado, incluyendo el sitio web donde me divertí mucho utilizando Mootools para sus diferentes funcionalidades, iré ampliando los artículos relacionados con este framework de JS explicando los puntos más importantes de su desarrollo. Pero para comenzar, mostraré un modo de crear ventanas modales (lightbox, thickbox, greybox, modalbox… son todas ventanas modales) sólo con CSS. Mientras puedo, ahorro en plugins para no recargar los sitios, y en el caso de las ventanas emergentes no-obstructivas utilicé un elegante método donde a través de simple CSS se abren ventanas con mensajes varios. Para gatillarla, utilicé, claro, Mootools. Pero donde tomé prestado la idea, utilizaban Javascript puro para ello. Mostraré ambos métodos, a gusto y necesidad del usuario cuál decidir ocupar.

Comenzamos con el marcado HTML. Primero, un <div class="overlay"></div> el que será el fondo semi-transparente que cubrirá la página entera, y albergará la ventana del mensaje. Luego, un <div class="modal"> que contendrá el mensaje o contenido de nuestra ventana modal. Estas 2 classes, .overlay y .modal, estarán escondidas desde un principio (display: none;) y serán gatilladas desde algún link (display: block;). Después de ellas, el contenido del resto del sitio web.

<div id="fade" class="overlay"></div>
<div id="light" class="modal">
     <p>Lorem ipsum dolor sit…..</p>
</div>
<p>Texto del sitio web. Con un <a href="">link</a> abriremos la ventana.</p>

Nada de eso nos sirve sin un correcto uso de CSS. Para la base semi-transparente le damos opacidad a través del método cross-browser:

.overlay{
     display: none;
     position: absolute;
     top: 0;
     left: 0;
     width: 100%;
     height: 100%;
     background: #000;
     z-index:1001;
     opacity:.75;
     -moz-opacity: 0.75;
     filter: alpha(opacity=75);
}

Y la ventana modal del contenido mismo:

.modal {
     display: none;
     position: absolute;
     top: 25%;
     left: 25%;
     width: 50%;
     height: 50%;
     padding: 16px;
     background: #fff;
     color: #333;
     z-index:1002;
     overflow: auto;
}

Ver ejemplo sólo con CSS

Ahora, lo echamos a andar. A ambos div‘s debemos darle id‘s únicos, los que nos ayudarán a identificar los elementos que serán mostrados vía Javascript. La orden para ejecutarlos es en Javascript puro:

document.getElementById(‘light’).style.display=’block’;
document.getElementById(‘fade’).style.display=’block’

Y a través de Mootools:

$(‘light’).setStyle(‘display’, ‘block’);
$(‘fade’).setStyle(‘display’, ‘block’);

Lo que dice ahí, en castellano universal es: toma los elementos con el id light y fade, y agrégales estilo display: block; a cada uno. O sea, los hará aparecer desde display: none (oculto) a display: block; (visible).

Ver ejemplo funcionando con JS

Links

Sobre el Autor: Jorge Epuñan

Soy quien escribe en este sitio: diseñador gráfico de profesión, desarrollador web por preferencia y amante de la interacción humano-computador. Cuando no pienso en web, salgo a trotar por mis barrios en Santiago, Chile o me junto con amigos a un bar a conversar sobre nuevas tendencias y tecnologías. Twitter profesional y personal, además del Contacto.

  1. Victor San Martin

    Buenos tips, un modal bastante basico pero es la base para lograr buenas cosas.

    Felicitaciones por el sitio (2monos.net) me recuerda bastante a dontclick.it.

    Saludos

  2. CSSLab Admin

    Gracias Victor, al contrario de dontclick.it aqui es todo con HTML CSS JS, gran logro creo yo ya q desplaza bastante bien a Flash. Salu2.

  3. iván

    excelnte artículo!!! de 10!! te felicito, realmente muy creativo. Al momento de leerlo se me ocurrió que jugando con los z-index se podría mostrar entre medio del fondo gris y la ventana modal del mensaje, un div que ocupe toda la pantalla y trabaje como boton para cerrar todo, tipo lightbox, thickbox, greybox, modalbox…
    Bueno, voy a ver si pruebo y comento. saludos

  4. Gonzalo

    Hay un problema… en IE no me esta funcionando esto :S

    estoy jugando con javascript para hacer que se mueva el fondo de fade, hay un problema con la altura en IE (6).

    De todas maneras esta excelente =D

  5. Guillermo

    Saludo muy interesante los comentarios que he leido he apredindo mucho de cada uno. me sirvieron de nota para seguir mi camino que es infinito. porque cada dia son mas extensos la programacion y no es extatica sino dinamica

  6. Johnny

    excelente el aporte, pero tengo una consulta, la funcion me cumple perfectamente de cubrir el div overlay en toda la pagina y el div modal en el centro pero al hacer click fuera del div modal esta desaparece, como puedo solucionar esto , gracias de antemano

  7. Jorge Epuñan

    Johnny: Si lees el JS veras q el cerrar esta tanto para el btn como para el overlay; basta con q se lo quites.

    $(’light’).setStyle(’display’, ‘block’);
    //$(’fade’).setStyle(’display’, ‘block’);

    saludos.

  8. christian

    esta mal por que el css no tiene como cerrarce

  9. Pancho

    Yo creo que me he vuelto adicto a facebox. Best plugin ever

  10. jorge perez salinas

    Excelente: sensillo y manejable, para poderlo utilizar con jquery.
    Gracias

  11. Raul

    Buenas amigo me gusta muchisimo tu ejemplo, solo tengo un pequeño problema el cual los SWF se muestran por encima de la ventana modal, sabes como podria solucionarse?

  12. Jorge Epuñan

    Raul: ese tema ya lo aborde en un articulo muy popular; espero te sirva.

    Exito.

  13. Raul

    Estimado Jorge, si yo habia probado de esa forma y seguia sin funcionarme asi que vi detalladamente como incrustaste el SWF y me di cuenta que aparte de agregar el parametro

    tambien el tiene que tener la propiedad wmode=”opaque” y asi me funciono perfecto, muchas gracias jorge por tu gran colaboracion.

  14. Raul

    el <embed wmode=”opaque” y es que al agregarlo en DW no la coloca

  15. Villimon

    Hola… muy buen codigo para hacer las ventanas !!! pero en IE no funciona… donde puedo conseguir el codigo que falta para que funcione bien en internet explorer ??? gracias !!!

  16. jose

    Hola…no tengo mucho conocimiento de codigo , podrias especificarme como quedaria el para cerrar la ventana. Muchas gracias

  17. Sandra

    Esto funciona a la perfección si lo que quiero mostrar es un texto. Lo que necesito es que al pinchar se abra un .pdf . En este caso me podrías ayudar en como quedaría el código? Gracias.

  18. Jorge Epuñan

    Sandra: sobre los PDF’s, el problema es q se resuelven dependiendo del browser: si el usuario no tiene algun plugin de acrobat instalado, automaticamente se descargara; si lo tiene, se abrira en la misma ventana. Es algo q no puedes predecir lamentablemente, a menos q uses Flash Paper (q nunca despego, por cierto).

    Saludos.

  19. Jorge

    Hola. Quiero implementar una ventana modal, pero que se abra automáticamente al cargar el index de una web.
    Vi que en http://www.2monos.net/ implementaste eso ¿Cómo lo hago?

  20. Jorge Epuñan

    Jorge: basta con que lo actives, mediante Javascript, al momento en que el sitio se cargue. Esto se hace ingresando el comando descrito mas arriba en:

    <body onload=”document.getElementById(‘light’).style.display=’block’; document.getElementById(‘fade’).style.display=’block’”>

    Saludos

  21. Prof. Música

    Recien empieso en esto, y realmente no comprendo mucho sobre el lenguaje html, pero entre noches de desvelos lo vamos logrando, mi blog esta dedicado a una fundacion sin fines de lucro, por lo que debo de repararmelas para diceñar o hacer cualquier cosa, que la fundacion amerite. Felicidades de nuevo por la pagina, y porntamente empleare esta ventana modal, solo una cosa, en el primer ejemplo que es de puro css no me da opciones para cerrar la ventana modal, ¿por que?

  22. Prof. Música

    No sé is tenga que ver, pero se trata de una plantilla de blogger, ¿esta funcion se podria aplicar? y de ser asi ¿donde se pegan los codigos? se que el css puedo colocarlo entre las etiquetas style antes del cierre del /head y el html de pues del cierra del /head en el inicio del body o antes del /body pero el enlace cual es como llamo la funcio
    Texto del sitio web. Con un link abriremos la ventana.
    cual es la url?? jeje disculpame de verdad es que comienzo en esto y debo aprenderlo pronto, gracias.

  23. Paco

    Hola! Muy bueno el aporte…. sólo una pregunta:
    ¿Cómo puedo hacer para que la ventana modal se abra JUSTO en el centro de la página, sea cual sea el tamaño de la pantalla? No quiero jugar con porcentajes, sino decirle que se abra justo en el centro ,tanto vertical como horizontalmente.
    Muchas gracias de antemano, máquinas!
    Fran.

  24. César

    Estan intersantes tus estilos, pero tienes el problema que no corre en internet explorer, y por desgracia es el navegador mas utilizado en el mundo

  25. oscar

    Muy bueno. Gracias por el aporte =)

  26. Intruso

    Para centrarlo dale en el css lo siguiente:
    position:absolute;
    left:50%; top:50%;
    width:350px; height:550px;
    margin-left:-175px; margin-top:-275px;
    Listo. Si no usas Flash en tu web también dale a ambos:
    position:fixed;
    para que no se mueva de la pantalla.

  27. Getze

    soy nueva en esto de los overlays y no domino al 100 CSS, tengo una duda los códigos van entre y donde sea? o entre y Espero su respuesta GRacias.

  28. Getze

    Hola soy yo nuevamente, ya logre hacerlo funcionar pero ahora quiero saber si puedo hacer que se abran varias ventanas en unsa sola web pero con contenidos diferentes y como hacerlo. GRacias

  1. [...] Ventanas modales actualmente hay por montones, cada una ofrece mejores prestaciones y se comportan relativamente bien dentro del entorno ...
    CSSLab » Review 2: Shadowbox
  2. [...] de esa web. Ponerme en su lugar y darme cuenta si realmente vale la pena utilizar alguna ventana modal, ...
    CSSLab - Nuestro verdadero cliente
  3. [...] Si siguiéramos esas reglas siempre, nunca habrían innovaciones tales como AJAX, ventanas modales, validaciones de formularios por blur entre ...
    CSSLab - Las 10 leyes de Jorge para el diseño y desarrollo web
  4. [...] a través de esa web. Ponerme en su lugar y darme cuenta si realmente vale la pena utilizar alguna ...
    Blog de Cristiam Herrera Daza » Blog Archive » Nuestro verdadero cliente
1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221| buy cialis canada paypal empfehlung online apotheke viagra generic viagra using master card viagra store in las vegas how to get doctor to prescribe cialis viagra no prescription overnight delivery what kind of doctor to see propecia rx proscar uk where to buy v herbal viagra alternative off the counter in ireland cialis name brndAccutane Online Doxycycline online Buy Cheap Lexapro Online No Prescription Prednisone Online Buy Accutane No Prescription