viernes, 8 de agosto de 2014

Ventanas modales usando solo CSS

Este articulo me ha sido de mucha ayuda. Esta muy bien redactado, explicando paso a paso el codigo y además el auto incluye en descarga el codigo fuente final. Muy recomendado.

Fuente: http://www.nosolocss.com/blog/css/crear-ventanas-modales-usando-solo-css-y-su-selector-target



Crear ventanas modales usando solo css y su selector target

ventana modal con css

Hace algún tiempo escribí sobre como crear ventanas modales con la ayuda de Jquery UI, y como técnica para salir del paso rápidamente no esta mal, pero no es la mejor manera de hacerlo, mas que nada porque estamos cargando una librería entera en nuestro proyecto para hacer algo que podríamos hacer solo con CSSAhora podrás pensar que tal vez sea demasiado pesado hacer esto usando solo CSS, o que los resultados no van a estar a la altura, pero lo cierto es que con las nuevas características de CSS3, se pueden obtener efectos sorprendentes con muy pocas lineas de código, y escasos o nulos conocimientos de programación.


La parte HTML para crear esta demostración sera algo así:
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
<ul>
    <li><a href="#modal1">DESLIZAR</a></li>
    <li><a href="#modal2">ROTAR</a></li>
    <li><a href="#modal3">REDIMENSIONAR</a></li>
</ul>
<div id="modal1" class="modalmask">
    <div class="modalbox movedown">
        <a href="#close" title="Close" class="close">X</a>
        <h2>DESLIZAR</h2>
        <p>La ventana modal aparece por arriba y se desliza hasta su posición. Un efecto simple pero elegante.</p>
        <p>Aquí puedes incluir cualquier cosa como vídeos, mapas, formularios...</p>
    </div>
</div>
<div id="modal2" class="modalmask">
    <div class="modalbox rotate">
        <a href="#close" title="Close" class="close">X</a>
        <h2>ROTAR</h2>
        <p>Usando la propiedad transform de CSS3, podemos hacer que las ventanas aparezcan rotando.</p>
        <p>No hay nada de Javascript, solo unas pocas lineas de CSS.</p>
    </div>
</div>
<div id="modal3" class="modalmask">
    <div class="modalbox resize">
        <a href="#close" title="Close" class="close">X</a>
        <h2>REDIMENSIONAR</h2>
        <p>También puedes redimensionar la ventana hasta hacerla desaparecer.</p>
        <p>Las posibilidades que ofrece CSS3 son múltiples, tan solo hace falta un poco de imaginación para crear efectos realmente llamativos.</p>
    </div>
</div>
La clase modalmask sera la encargada de aplicar el fondo oscuro, característico de las ventanas modales, mediante la superposición de un div que se extienda sobre el contenido. En el interior de este div incluiremos la ventana, a la que se le aplican otras 2 clases, una para darle estilo y otra para animarla. Dentro incluiremos otro enlace para crear el botón de cerrar y el contenido que mostrara la ventana.
Lo realmente importante aquí es el CSS. Lo muestro por partes:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.modalmask {
    positionfixed;
    font-familyArialsans-serif;
    top0;
    right0;
    bottom0;
    left0;
    background: rgba(0,0,0,0.8);
    z-index99999;
    opacity:0;
    -webkit-transition: opacity 400ms ease-in;
    -moz-transition: opacity 400ms ease-in;
    transition: opacity 400ms ease-in;
    pointer-events: none;
}
.modalmask:target {
    opacity:1;
    pointer-events: auto;
}
En primer lugar el efecto modal, creado mediante  la superposición de un div semitransparente sobre todo el contenido, usando para ello  la propiedad z-index. Para ocultarlo establezco la opacidad a 0 y desactivo los eventos del puntero (pointer-events: none) para evitar que interfiera con la pagina estando oculto.
Para iniciar la animación y mostrar las diferentes ventanas modales hago uso del selector target de CSS3. Lo que hace este selector es modificar los estilos del div al que hace referencia un enlace. En este caso restablece la opacidad y reactiva los eventos del puntero para activar el efecto.
Una vez que tenemos la capa modal hay que dar forma a la ventana:
1
2
3
4
5
6
7
8
9
10
11
.modalbox{
    width400px;
    positionrelative;
    padding5px 20px 13px 20px;
    background#fff;
    border-radius:3px;
    -webkit-transition: all 500ms ease-in;
    -moz-transition: all 500ms ease-in;
    transition: all 500ms ease-in;
     
}
Y animar su aparición, aprovechando que el selector target también se puede usar con los elementos hijos:
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
.movedown {
    margin0 auto;
}
.rotate {
    margin10% auto;
    -webkit-transform: scale(-5,-5);
    transform: scale(-5,-5);
}
.resize {
    margin10% auto;
    width:0;
    height:0;
}
.modalmask:target .movedown{       
    margin:10% auto;
}
.modalmask:target .rotate{     
    transform: rotate(360deg) scale(1,1);
        -webkit-transform: rotate(360deg) scale(1,1);
}
.modalmask:target .resize{
    width:400px;
    height:200px;
}
Como se puede ver sobre estas lineas, establezco en cada animación el estado inicial en la clase correspondiente, y el estado final al hacer target, es decir, los estilos que se aplicaran al pulsar el enlace de cada ventana modal.
Ya solo quedaría el CSS correspondiente al botón o enlace encargado de cerrar las ventanas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.close {
    background#606061;
    color#FFFFFF;
    line-height25px;
    positionabsolute;
    right1px;
    text-aligncenter;
    top1px;
    width24px;
    text-decorationnone;
    font-weightbold;
    border-radius:3px;
}
.close:hover {
    background#FAAC58;
    color:#222;
}
No tiene nada especial porque para hacer desaparecer las ventanas modales y sus estilos, bastara con cambiar eltarget a otro enlace, en este caso #close, que no aporta ningun CSS.


Conclusión
Como se puede ver, las nuevas características CSS cada vez están mas avanzadas y, combinadas con HTML5, nos permiten hacer cosas que antes solo podíamos implementar con Javascript y sus librerías, lo cual es una buena noticia para los desarrolladores, ya que nos va a suponer una reducción considerable en el tamaño de las web y una mejora en la accesibilidad de las mismas.
Por otro lado, ahora que lo pienso, con el selector target tenemos otra forma de simular un evento onclick, mejor incluso que aquella que compartí hace algún tiempo, basada en el uso de inputs tipo radio. Sin duda con este selector vamos a poder crear efectos asombrosos, yo ya tengo algunos en mente. ¿Y tu?

2 comentarios:

Jesús Moreno - Ingeniero Ténico Informático - consultor Informático

Hola, soy Jesús Moreno Ingeniero Técnico Informático en sistemas por la US y propietario de éste blog. Mi trabajo en los ultimos años se ...