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

  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.

  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