Mostrando entradas con la etiqueta Las animaciones en CSS3. Mostrar todas las entradas
Mostrando entradas con la etiqueta Las animaciones en CSS3. Mostrar todas las entradas

sábado, 14 de junio de 2014

Una ventana modal



1. Objetivo

Vamos a crear lo que se conoce como "ventana modal". Una ventana modal es una ventana que se abre en la página web por encima del contenido en curso y que luego podemos cerrar haciendo clic con el ratón.

Hemos sacado este ejemplo del sitio web de Paul Hayes: http://www.paulrhayes.com/2011-03/css-modal/


2. El botón

La ventana modal aparecerá cuando se haga clic en un botón. En primer lugar, vamos a crear un vínculo a en la página HTML para el botón. Este vínculo usará la clase que llamaremos openModal.

<p><a href="#ejemplo" class="openModal">Abrir la ventana Modal</a></p>

Ahora podrá aplicarle el formato que quiera. Le proponemos el siguiente:

a.openModal {
margin: 1em auto;
display: block;
width: 200px;
background: #ccc;
text-align: center;
text-decoration: none;
color: black;
padding: 10px;
-moz-border-radius: 7px;
border-radius: 7px;
background: -moz-linear-gradient(#fff, #ddd);
background: -webkit-gradient(linear, right top, right bottom,
from(rgb(255,255,255)), to(rgb(230,230,230)));
text-shadow: 0 1px 0 #fff;
border: 1px solid rgba(0,0,0,0.1);
-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.3);
-moz-box-shadow: 0 1px 1px rgba(0,0,0,0.3);
box-shadow: 0 1px 1px rgba(0,0,0,0.3);
}

Así se visualizará el botón:



3. La ventana modal

La ventana modal es un elemento aside que presenta el código de identificación ejemplo y que usa la clase modal. El código de identificación es importante, ya que lo vamos a usar con la pseudo-clase target.

El título del contenido es un elemento h2 y el texto del contenido es un elemento p. El botón de cierre es un vínculo que dispone de su propio código de identificación close y de un title con la etiqueta close.

<aside id="ejemplo" class="modal">
<div>
<h2>Modal box</h2>
<p>Integer posuere...</p>
<a href="#close" title="Close">Cerrar</a>
</div>
</aside>

Estos son los estilos CSS que propone el autor. Se han usado las siguientes propiedades CSS3: bordes redondeados (border-radius), una sombra (box-shadow), un degradado (linear-gradient) y un texto sombreado (text-shadow).

.modal > div {
width: 500px;
background: #fff;
position: relative;
margin: 10% auto;
/* Prettify */
padding: 30px;
-moz-border-radius: 7px;
border-radius: 7px;
-webkit-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
-moz-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
box-shadow: 0 3px 20px rgba(0,0,0,0.9);
background: -moz-linear-gradient(#fff, #ccc);
background: -webkit-gradient(linear, right bottom, right
top, color-stop(1, rgb(255,255,255)), color-stop(0.57,
rgb(230,230,230)));
text-shadow: 0 1px 0 #fff;
}

Así se visualizará la ventana con ese diseño:



4. El botón de cierre

El botón de cierre es un vínculo a que se encuentra dentro de la caja <div> de la ventana modal:

<a href="#close" title="Close">Cerrar</a>

Sin embargo, nosotros no queremos que se vea la etiqueta del vínculo, Cerrar, en el ejemplo. Para eso, el autor aplica una transparencia al color del texto de dicho vínculo, que se encuentra posicionado en posición absoluta, en el borde superior derecho de su elemento padre, la ventana modal:

.modal a[href="#close"] {
position: absolute;
right: 0;
top: 0;
color: transparent;
}

En lugar del texto, queremos mostrar una aspa. El autor utiliza la pseudo-clase :after y la propiedad content para insertar una X. Ese elemento presentará una posición absoluta, en el borde superior derecho de la ventana. El círculo ha sido creado con bordes redondeados. Estos son los estilos CSS que propone el autor:

.modal a[href="#close"]:after {
content: ’X’;
display: block;
/* Position */
position: absolute;
right: -10px;
top: -10px;
width: 1.5em;
padding: 1px 1px 1px 2px;
/* Style */
text-decoration: none;
text-shadow: none;
text-align: center;
font-weight: bold;
background: #000;
color: #fff;
border: 3px solid #fff;
-moz-border-radius: 20px;
border-radius: 20px;
-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.5);
-moz-box-shadow: 0 1px 3px rgba(0,0,0,0.5);
box-shadow: 0 1px 3px rgba(0,0,0,0.5);
}

Este es el botón que habremos creado:


El autor también aplica un estilo al botón de cierre de la ventana cuando se pasa el cursor por encima (:hover) y cuando está activo (:focus), con una transformación de cambio de escala (scale). El botón se ampliará ligeramente y aparecerá subrayado:

.modal a[href="#close"]:focus:after,
.modal a[href="#close"]:hover:after {
-webkit-transform: scale(1.1,1.1);
-moz-transform: scale(1.1,1.1);
transform: scale(1.1,1.1);
}
.modal a[href="#close"]:focus:after {
outline: 1px solid #000;
}



5. Ocultar el cuerpo de la página

Otra característica de esta ventana modal es que "oscurece" la ventana del navegador, es decir, el cuerpo (body) de la página web. Ese efecto se obtiene con el elemento aside. Dicho elemento utiliza la clase modal.

<aside id="ejemplo" class="modal">
...
</aside>

El estilo de la clase modal define el posicionamiento (position: fixed), aplica un fondo negro semitransparente (background: rgba(0,0,0,0.5)) y, cuando se carga la página, hace que la opacidad (opacity) sea de 0, de modo que esta no aparecerá "oscurecida". Por último, cuando se use la ventana modal, el cuerpo de la página "se ocultará" progresivamente. Esto se consigue con la propiedad transition sobre la opacidad (opacity).

.modal {
/* Overlay page content */
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
z-index: 10000;
/* Hide for now */
opacity: 0;
pointer-events: none;
/* Transformación de la transparencia al abrir la ventana */
-webkit-transition: opacity 500ms ease-in;
-moz-transition: opacity 500ms ease-in;
transition: opacity 500ms ease-in;
}


6. La animación de apertura

Cuando el usuario haga clic en el botón, la ventana modal se abrirá con una animación: se visualizará progresivamente, al mismo tiempo que el fondo oscuro aparecerá también progresivamente.

La animación utilizada es un cambio de escala 3D que solamente funcionará con el motor de renderizado WebKit (Safari y Chrome). Mozilla Firefox ignorará ese efecto y mostrará directamente la ventana modal, sin el efecto de cambio de escala. Además, se le ha aplicado una sombra. El autor ha previsto cuatro etapas para esta animación.

Este es el código CSS de la animación, a la que se le ha dado el nombre de bounce :

@-webkit-keyframes bounce {
0% {
-webkit-transform: scale3d(0.1,0.1,1);
-webkit-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
-moz-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
transform: scale3d(0.1,0.1,1);
box-shadow: 0 3px 20px rgba(0,0,0,0.9);
}
55% {
-webkit-transform: scale3d(1.08,1.08,1);
-webkit-box-shadow: 0 10px 20px rgba(0,0,0,0);
-moz-box-shadow: 0 10px 20px rgba(0,0,0,0);
transform: scale3d(1.08,1.08,1);
box-shadow: 0 10px 20px rgba(0,0,0,0);
}
75% {
-webkit-transform: scale3d(0.95,0.95,1);
-webkit-box-shadow: 0 0 20px rgba(0,0,0,0.9);
-moz-box-shadow: 0 0 20px rgba(0,0,0,0.9);
transform: scale3d(0.95,0.95,1);
box-shadow: 0 0 20px rgba(0,0,0,0.9);
}
100% {
-webkit-transform: scale3d(1,1,1);
-webkit-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
-moz-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
transform: scale3d(1,1,1);
box-shadow: 0 3px 20px rgba(0,0,0,0.9);
}
}


7. Activar la animación de apertura

Esta animación deberá aplicarse, en el momento de ocultar el cuerpo de la página (.modal:target), sobre la ventana modal que ha sido insertada como primer elemento hijo (.modal:target > div).

.modal:target > div {
-webkit-animation-name: bounce;
-moz-animation-name: bounce;
animation-name: bounce;
}


8. Aplicar la ocultación

Ahora vamos a aplicar el efecto que permitirá ocultar la página:

.modal:target {
opacity: 1;
pointer-events: auto;
}


9. La animación de cierre

La animación de cierre aplica un cambio de escala a la ventana modal, para visualizarla con una proporción de 0.1.

@-webkit-keyframes minimise {
0% {
-webkit-transform: scale3d(1,1,1);
transform: scale3d(1,1,1);
}
100% {
-webkit-transform: scale3d(0.1,0.1,1);
transform: scale3d(0.1,0.1,1);
}
}


10. Activar la animación de cierre

Esta animación deberá aplicarse cuando se oculte la ventana modal, que ha sido insertada como primer elemento hijo (.modal > div).

.modal > div {
...
/* Aplicación de la animación de cierre */
-webkit-animation: minimise 500ms linear;
-moz-animation: minimise 500ms linear;
animation: minimise 500ms linear;
...
}


11. El código completo

Este es el código completo de la página web:

<!DOCTYPE HTML>
<html lang="es">
<head>
<title>Título del documento</title>
<meta charset="UTF-8" />
<style>
/* El contenedor que oculta el body */
.modal {
/* Overlay page content */
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
z-index: 10000;
/* Transformación de la transparencia al abrir la página */
-webkit-transition: opacity 500ms ease-in;
-moz-transition: opacity 500ms ease-in;
transition: opacity 500ms ease-in;
/* Hide for now */
opacity: 0;
pointer-events: none;
}
/* La caja div del contenido de la ventana modal */
.modal > div {
width: 500px;
background: #fff;
position: relative;
margin: 10% auto;
/* Aplicación de la animación de cierre */
-webkit-animation: minimise 500ms linear;
-moz-animation: minimise 500ms linear;
animation: minimise 500ms linear;
/* Prettify */
padding: 30px;
-moz-border-radius: 7px;
border-radius: 7px;
-webkit-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
-moz-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
box-shadow: 0 3px 20px rgba(0,0,0,0.9);
background: -moz-linear-gradient(#fff, #ccc);
background: -webkit-gradient(linear, right bottom, right top,
color-stop(1, rgb(255,255,255)), color-stop(0.57,
rgb(230,230,230)));
text-shadow: 0 1px 0 #fff;
}
/* El botón de apertura */
a.openModal {
margin: 1em auto;
display: block;
width: 200px;
background: #ccc;
text-align: center;
text-decoration: none;
color: black;
padding: 10px;
-moz-border-radius: 7px;
border-radius: 7px;
background: -moz-linear-gradient(#fff, #ddd);
background: -webkit-gradient(linear, right top, right bottom,
from(rgb(255,255,255)), to(rgb(230,230,230)));
text-shadow: 0 1px 0 #fff;
border: 1px solid rgba(0,0,0,0.1);
-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.3);
-moz-box-shadow: 0 1px 1px rgba(0,0,0,0.3);
box-shadow: 0 1px 1px rgba(0,0,0,0.3);
}
/* El vínculo-botón de cierre */
.modal a[href="#close"] {
position: absolute;
right: 0;
top: 0;
color: transparent;
}
/* El vínculo-botón de cierre */
.modal a[href="#close"]:after {
content: ’X’;
display: block;
/* Posicionamiento */
position: absolute;
right: -10px;
top: -10px;
width: 1.5em;
padding: 1px 1px 1px 2px;
/* Formato */
text-decoration: none;
text-shadow: none;
text-align: center;
font-weight: bold;
background: #000;
color: #fff;
border: 3px solid #fff;
-moz-border-radius: 20px;
border-radius: 20px;
-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.5);
-moz-box-shadow: 0 1px 3px rgba(0,0,0,0.5);
box-shadow: 0 1px 3px rgba(0,0,0,0.5);
}
/* El vínculo-botón de cierre cuando se pase el cursor o cuando esté
activo */
.modal a[href="#close"]:focus:after,
.modal a[href="#close"]:hover:after {
-webkit-transform: scale(1.1,1.1);
-moz-transform: scale(1.1,1.1);
transform: scale(1.1,1.1);
}
.modal a[href="#close"]:focus:after {
outline: 1px solid #000;
}
/* Ocultar la página */
.modal:target {
opacity: 1;
pointer-events: auto;
}
/* Aplicación de la animación de apertura */
.modal:target > div {
-webkit-animation-name: bounce;
-moz-animation-name: bounce;
animation-name: bounce;
}
/* Animación de apertura */
@-webkit-keyframes bounce {
0% {
-webkit-transform: scale3d(0.1,0.1,1);
-webkit-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
-moz-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
transform: scale3d(0.1,0.1,1);
box-shadow: 0 3px 20px rgba(0,0,0,0.9);
}
55% {
-webkit-transform: scale3d(1.08,1.08,1);
-webkit-box-shadow: 0 10px 20px rgba(0,0,0,0);
-moz-box-shadow: 0 10px 20px rgba(0,0,0,0);
transform: scale3d(1.08,1.08,1);
box-shadow: 0 10px 20px rgba(0,0,0,0);
}
75% {
-webkit-transform: scale3d(0.95,0.95,1);
-webkit-box-shadow: 0 0 20px rgba(0,0,0,0.9);
-moz-box-shadow: 0 0 20px rgba(0,0,0,0.9);
transform: scale3d(0.95,0.95,1);
box-shadow: 0 0 20px rgba(0,0,0,0.9);
}
100% {
-webkit-transform: scale3d(1,1,1);
-webkit-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
-moz-box-shadow: 0 3px 20px rgba(0,0,0,0.9);
transform: scale3d(1,1,1);
box-shadow: 0 3px 20px rgba(0,0,0,0.9);
}
}
/* Animación de cierre */
@-webkit-keyframes minimise {
0% {
-webkit-transform: scale3d(1,1,1);
transform: scale3d(1,1,1);
}
100% {
-webkit-transform: scale3d(0.1,0.1,1);
transform: scale3d(0.1,0.1,1);
}
}
</style>
</head>
<body>
<p><a href="#ejemplo" class="openModal">Abrir la ventana
Modal</a></p>
<aside id="ejemplo" class="modal">
<div>
<h2>Modal box</h2>
<p>Integer posuere erat a ante venenatis dapibus
posuere velit aliquet. Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Vestibulum id ligula porta felis euismod
semper. Curabitur blandit tempus porttitor. Nulla vitae elit
libero, a pharetra augue. Vivamus sagittis lacus vel augue
laoreet rutrum faucibus dolor auctor. Vestibulum id ligula
porta felis euismod semper.</p>
<a href="#close" title="Close">Cerrar</a>
</div>
</aside>
</body>
</html>


12. La visualización de la página

Así se visualizará inicialmente la página:



Cuando haga clic en el botón, el fondo oscuro y la ventana modal aparecerán progresivamente y ya no se podrá usar el botón de apertura:


Cuando haga clic en el botón de cierre de la ventana modal, se producirá el efecto contrario.


Espero haber ayudado en algo. Hasta la próxima oportunidad!







Un formulario que parpadee



1. Objetivo

Queremos resaltar un formulario en un página web haciendo que su borde parpadee. No es muy "estético", ¡pero se trata de un ejemplo!


2. La estructura del formulario

Vamos a crear un formulario normal y corriente:

<form id="registro" method="#" action="#">
<p>
<label for="nombre">Su nombre: </label>
<input type="text" id="nombre" />
</p>
<p>
<label for="email">Su e-mail: </label>
<input type="email" id="email" />
</p>
<p>
<input type="submit" id="enviar" value="Enviar" />
</p>
</form>


3. El diseño

Le aplicaremos un diseño al formulario con los estilo CSS3 habituales:

#registro{
width: 300px;
padding: 10px;
border: 1px solid #333;
border-radius: 10px;
}


4. La animación

Para hacer que el borde del formulario parpadee, vamos a aplicarle una sombra que pasará de rojo a amarillo.

Vamos a crear una animación a la que llamaremos sombra. En la primera etapa, en el 0%, definimos una sombra roja de 15 píxeles y, en el 100%, una sombra amarilla.

@-webkit-keyframes sombra {
0% {
box-shadow: 0 0 15px red;
}
100% {
box-shadow: 0 0 15px yellow;
}
}
@-moz-keyframes sombra {
0% {
box-shadow: 0 0 15px red;
}
100% {
box-shadow: 0 0 15px yellow;
}
}
@keyframes sombra {
0% {
box-shadow: 0 0 15px red;
}
100% {
box-shadow: 0 0 15px yellow;
}
}

Vamos a aplicar esta animación al formulario. La animación tendrá un movimiento ease-in (se acelerará al final), no tendrá fin (infinite), alternará el sentido de la animación (alternate) y durará 500 milisegundos (500ms).

#registro {
width: 300px;
padding: 10px;
border: 1px solid #333;
border-radius: 10px;
/* Animación */
-webkit-animation: sombra ease-in infinite alternate 500ms;
-moz-animation: sombra ease-in infinite alternate 500ms;
animation: sombra ease-in infinite alternate 500ms;
}


5. La visualización

Este será el resultado obtenido: ¡image que el borde parpadea y que le escuecen los ojos de verlo!



Espero haber ayudado en algo. Hasta la próxima oportunidad!







Rotación y transparencia



1. Objetivo

Vamos a crear una animación en la cual una imagen va a girar sobre sí misma y se va a volver transparente.


2. La estructura

Cree una caja <div> con un código de identificación.

<div id="imagen"><img src="leon.jpg" alt="León" /></div>

Aplíquele una posición absoluta.

#imagen {
position: absolute;
left: 400px;
top: 300px;
}


3. La animación

Para hacer que la imagen se vuelva transparente vamos a usar la propiedad opacity.

Para hacer que la imagen gire sobre ella misma vamos a usar la propiedad transform.

@-webkit-keyframes girar {
0% {
opacity: 1;
-webkit-transform: rotate(0deg);
}
100% {
opacity: 0;
-webkit-transform: rotate(360deg);
}
}
@-moz-keyframes girar {
0% {
opacity: 1;
-moz-transform: rotate(0deg);
}
100% {
opacity: 0;
-moz-transform: rotate(360deg);
}
}
@keyframes girar {
0% {
opacity: 1;
transform: rotate(0deg);
}
100% {
opacity: 0;
transform: rotate(360deg);
}
}

Ahora vamos a aplicar esta animación con el selector de la caja:

#imagen {
position: absolute;
left: 400px;
top: 300px;
-webkit-animation: girar 5s infinite;
-moz-animation: girar 5s infinite;
animation: girar 5s infinite;
}


4. La visualización

Este es el resultado final esperado:



Espero haber ayudado en algo. Hasta la próxima oportunidad!







Un desplazamiento simple



1. Objetivo

Vamos a desplazar, ininterrumpidamente, un caja <div> de izquierda a derecha y luego de derecha a izquierda.


2. La estructura

Vamos a crear una caja <div> con el código de identificación #caja.

<div id="caja"><p>&nbsp;</p></div>

Le vamos a aplicar un estilo muy sencillo:

#caja {
background-color: red;
position: relative;
width: 100px;
height: 100px;
}


3. La animación

Nuestra caja roja deberá desplazarse hasta una posición fijada en la mitad de la duración total y, a continuación, volverá a su posición inicial, para finalizar la animación. Necesitaremos por lo tanto tres keyframes: a 0%, 50% y 100%. Indicaremos la posición a la que deberá llegar en cada etapa con la propiedad left. Hemos llamado a la animación redBox.

@-webkit-keyframes redBox {
0% {
left: 10px;
}
50% {
left: 400px;
}
100% {
left: 10px;
}
}
@-moz-keyframes redBox {
0% {
left: 10px;
}
50% {
left: 400px;
}
100% {
left: 10px;
}
}
@keyframes ’redBox’ {
0% {
left: 10px;
}
50% {
left: 400px;
}
100% {
left: 10px;
}
}

En las propiedades CSS de la caja <div>, indicaremos las propiedades necesarias: 
  • el nombre de la animación: animation-name. 
  • la duración de la animación: animation-duration. 
  • las repeticiones de la animación: animation-iteration.

#caja {
background-color: red;
position: relative;
width: 100px;
height: 100px;
-webkit-animation-name: redBox;
-webkit-animation-duration: 5s;
-webkit-animation-iteration-count: infinite;
-moz-animation-name: redBox;
-moz-animation-duration: 5s;
-moz-animation-iteration-count: infinite;
animation-name: redBox;
animation-duration: 5s;
animation-iteration-count: infinite;
}

O bien, con la sintaxis abreviada:

#caja {
background-color: red;
position: relative;
width: 100px;
height: 100px;
-webkit-animation: redBox 5s infinite;
-moz-animation: redBox 5s infinite;
animation: redBox 5s infinite;
}


4. La visualización

Así se verá en la pantalla:



Espero haber ayudado en algo. Hasta la próxima oportunidad!







La creación de una animación



El objetivo del módulo dedicado a las animaciones es el de crear animaciones para las páginas web sin JavaScript, ni ningún framework de tipo jQuery, MooTools o Dojo.

Este breve módulo, Animation, aún está en fase de Working Draft el 19 de febrero de 2013: http://www.w3.org/TR/css3-animations/

El sitio web Can I use (http://caniuse.com/) nos indica que el módulo es bastante reconocido, pero que es preciso utilizar los prefijos de los navegadores.


Aún así, este modulo nos ofrece inmensas posibilidades y su objetivo podría ser, simplemente, el de competir con la tecnología Adobe Flash. Sin entrar en un debate sobre tecnologías que no tendría en absoluto cabida en este libro, recuerde que, por razones técnicas, Apple no autoriza las animaciones Flash en sus iPhone e iPad.

¡La solución serán las animaciones en CSS3!

Con este módulo tendremos infinitas posibilidades de creación, en cuanto comience a ser compatible con los navegadores. En los próximos meses aparecerán sin duda numerosos ejemplos en la Web.

Una animación tiene lugar en el tiempo. Para gestionar el tiempo utilizaremos las "imágenes clave", keyframes en inglés. Una imagen clave o keyframe es una etapa de una animación en la que el elemento animado sufre un cambio.

Con la regla @keyframes podrá administrar las etapas de su animación. Todas las animaciones deberán tener una regla @keyframes.

Usted deberá establecer las diferentes etapas de su animación e indicar los cambios que deberán aplicarse a las diferentes propiedades. Cada etapa podrá ser identificada con un valor en porcentaje, siendo 100 % la duración total de la animación.

Podrá indicar la duración de su animación con la propiedad animation-duration.

El movimiento de la animación estará gestionado por la propiedad animation-timing-function. Podrá aplicar aumentos y disminuciones de la velocidad, al igual que con las transiciones.

Del mismo modo podrá indicar cuántas veces deberá repetirse la animación. Se trata de la noción de iteración. Usted podrá indicarla con la propiedad animation-iteration-count.

La propiedad animation-delay sirve para indicar que la animación deberá comenzar tras un plazo determinado, y no inmediatamente.

La propiedad animation-direction le permite indicar si la animación deberá realizarse en el sentido inverso.

La propiedad animation-play-state sirve para indicar si la animación se está ejecutando o si está en pausa.

Podrá usar la sintaxis abreviada animation siguiendo este orden: 
  • animation-name 
  • animation-duration 
  • animation-timing-function 
  • animation-delay 
  • animation-iteration-count 
  • animation-direction

Y no olvide que deberá utilizar, claro está, los prefijos propietarios de los navegadores.



Espero haber ayudado en algo. Hasta la próxima oportunidad!







       
free counters

Páginas vistas en total según Google