Mostrando entradas con la etiqueta Javascript. Mostrar todas las entradas
Mostrando entradas con la etiqueta Javascript. Mostrar todas las entradas

viernes, 28 de septiembre de 2012

Diapositivas estilo prezzi con Impress.js

[caption id="attachment_183" align="aligncenter" width="480"]impress.js impress.js[/caption]

impress.js es una herramienta para crear presentaciones con el poder de CSS3 transforms y transitions en navegadores modernos e inspirado en la idea de prezi.

Necesitas tener mucho conocimiento de HTML y CSS para poder usar impress.js efectivamente. y algo mas importante, necesitas ser diseñador tambien, porque las presentaciondes de impress.js no traen estilos por defecto, no hay ningun layout automatico para ellos...

Necesitas diseñar y construir esto a mano. entonces... ¿Todavia te gustaria saber como usar impress.js?

HTML

Debes tener en cuenta, que para comenzar tu codigo HTML debes comenzarla con la etiqueta
<!doctype html>

ya que impress.js trabaja con html5, si no empiezas el documento como html5, no funcionará.

Impress.js no depende de ninguna hoja de estilo externa. El script añade todo el estilo necesario para que la presentación funcione.

El estilo que utilizaremos es solo un demo (desde la web del autor ya que el ejemplo, es igual, solo que traducido), mas que todo para ver como darle estilos a los steps de las presentaciones.

Se creativo, construye uno propio. Nosotros no buscamos que todas las presentaciondes con impress.js luzcan igual verdad?

Al crear su propia presentación puedes deshacerte de este archivo. Empezar desde cero, es divertido!
<link href="css/impress-demo.css" rel="stylesheet" />

El elemento body es usado por impress.js para establecer algunos nombres de las clases que utiliza, que permitira detectar el apoyo y el estado de la presentacion CSS u otros scripts.

El primer y muy util nombre de clase es el `impress-not-supported`. Esta clase dice, que navegador no soporta las caracteristicas  requeridas por impress.js, entonces, puedes aplicar algun estilo fallback  en tu CSS. No es necesario añadir manualmente esto en el elemento. Si el script detecta que el navegador no es muy bueno el agregara la clase, pero añadir esto al HTML, hara que un usuario sin JavaScript pueda tener un estilo Fallback.

Cuando impress.js detecta que el navegador no soporta las caracteristicas requeridas, esta nombre de la clase sera removida.

El nombre de la clase en el elemento cuerpo, tambien depende de la presentacion activa en el momento.
<body class="impress-not-supported">

Por ejemplo, este mensaje fallback sera solo visible cuando la clase `impress-not-supported` esté en el cuerpo.
<div class="fallback-message">
<p>tu navegador <b>no soporta las caracteristicas requeridas</b> por impress.js.</p>
<p>para una mejor experiencia, por favor utiliza la version mas reciente de <b>Chrome</b>,<b>Safari</b> o <b>Firefox</b></p>
</div>

Este es el elemento nucleo usado por impress.js.

Esta sera la envoltura de cada steps de tu presentacion. En este elemento toda la magia de impress.js sucede. No tiene porque se un <div>. solo el "ID" es importante aqui, ya que asi es como el script lo encuentra.

Probablemente no vas a necesitar esto ahora, pero aqui estan unas opciones de configuracion que pueden usarse en estos elementos.

Para cambiar la duracion de la transición entre los slides, usa `data-transition-duration="2000"` dandole a esto, un numero de ms. por defecto vendra a 1000 (1s).

puedes tambien controlar la perspectiva con `data-perspective="500"` dandole a esto un número
nde pixeles, por defecto esta en 1000. puedes establecerlo en 0 si no buscas ningun efecto 3D. Si estas pensando en cambiar este valor, asegurate de entender como funciona la perspectiva en CSS 

pero como dije, no necesitas esto por ahora, entonces no te preocupes aqui hay simples, pero interesantes cosas  con respecto a este tag.
<div id="impress">

Aqui es donde comienzan las cosas interesantes.

Cada paso de la presentacion debe  ser un elemento dentro de `#impress` con un nombre de clase de `step`. Este elemento step esta posicionado  rotado y escalado por impress.js y la camara los muestra en cada step de la presentacion.

La informacion del posicionamiento se pasa a traves de los atributos de datos.

en el ejemplo solo especificaremos "x" y "y" y la posicion de cada elemento step con los atributos `data-x="-1000"` y `data-y="-1500`. esto quiere decir que "el centro" de los elementos (si, el centro) sera posicionado en el punto x= -1000px y y= -1500px de la presentacion 'canvas'

esta no sera rotada ni escalada
<div id="bored" class="step slide" data-x="-1000" data-y="-1500">
<q>No estas simplemente <b>aburrid@</b> con todas esas presentacions de slides basicos</q>
</div>

El atributo ID de el elemento step es usado para identificarlo en la url, pero es opcional. si no esta definido, este obtendrá un valor por defecto de 'step-N' es un numero de slide.

por lo tanto en el ejemplo debajo de esto, será ''step-2". La parte hash de la url cuando este step esté activo será '#/step-2'.

Tambien puedes usar '#step-2' en un link, para colocarlo directamente en este step. Por favor, nota que mientras '#/step-2' (con slash) tambien funcionaria, no es recomendado. usando el clasico 'id' - based links como '#step-2' hace estos link utiles en el modo fallback.
<div class="step slide" data-x="0" data-y="-1500">
<q>No piensas que las presentaciones <strong>en navegadores modernos</strong> deberian ser mejores?<strong>copiando los limites</strong> de las clasicas cubiertas de slides.</q>
</div>
<div class="step slide" data-x="1000" data-y="-1500">
<q>Te gustaria <strong>impresionar tu audiencia</strong>con <strong>impresionantes visualizaciones</strong> de tu charla?</q>
</div>

Este es un ejemplo de un elemento step siendo escalado. De nuevo, usamos el atributo 'data-' , pero esta vez es `data-scale="4"` esto quiere decir que este elemento será 4  veces mayor que los otros.

hablando de la presentación y el punto de vista de las transiciones significa que, tendrá que ser reducido (4 veces) para poder volver a su tamaño correcto.
<div id="title" class="step" data-x="0" data-y="0" data-scale="4">
<span class="try">Entonces puedes intentar</span>
<h1>impress.js<sup>*</sup></h1>
<span class="footnote"><sup>*</sup> Sin rima ninguna</span>
</div>

Este elemento tiene rotación. La notación no debería ser una sorpresa. Nosotros utilizamos el atributo 'data-rotate="90"', lo que significa que este elemento debe ser rotado 90 grados en sentido horario.
<div id="its" class="step" data-x="850" data-y="3000" data-rotate="90" data-scale="5">
<p>Esta es una<strong> herramienta para presentaciones</
nstrong> <br/>
inspirado en la idea de <a href="http://prezi.com">prezi.com</a> <br/>
y basado en el <strong>poder de CSS3 transforms y transitions</strong> en navegadores modernos.</p>
</div>
<div id="big" class="step" data-x="3500" data-y="2100" data-rotate="180" data-scale="6">
<p>visualiza tus <b>grandes </b> <span class="thoughts">pensamientos</span></p>
</div>

Y ahora esto se pone de verdad excitante! ahora movemos esto en Tercera Dimension. Junto con 'data-x' y 'data-y' puedes definir la posicion en un tercer eje (z), con 'data-z'. en el ejemplo usamos 'data-z=".3000"' lo que significa que el elemento puede estar posicionado a unos 3000 pixeles de nosotros.
<div id="tiny" class="step" data-x="2825" data-y="2325" data-z="-3000" data-rotate="300" data-scale="1">
<p>y <b>peque&ntilde;as</b> ideas</p>
</div>

Este paso aquí no introduce nada nuevo cuando se trata de los atributos de datos, pero debes notar en la demostración de que algunas palabras de este texto se están animando. Es una transición CSS muy básica que se aplica a los elementos cuando este step es alcanzado.

En el comienzo de la presentación de todos los elementos step se les da la clase de 'future'. Esto significa que no han sido visitados todavía. Cuando la presentación se mueve a un paso dado el nombre de la clase 'future' se cambia a 'present'. Así es como la animación en este paso funciona - el texto se mueve cuando el step cambia el nombre de la clase a 'present'

Finalmente, cuando el step deja el `present` la clase se retira del elemento y la clase `past` se añade. Así que, básicamente todos los elementos step tienen una de tres clases: `future`, `present` o `past`. Pero sólo el step actual tiene la clase `present`.
<div id="ing" class="step" data-x="3500" data-y="-850" data-rotate="270" data-scale="6">
<p>mediante <b class="positioning">positioning</b>, <b class="rotating">rotating</b> y <bclass="scaling">scaling.</b> Esto, en un canvas infinito</p>
</div>
<div id="imagination" class="step" data-x="6700" data-y="-300" data-scale="6">
<p>El unico <b>limite</b> es tu <b class="imagination">imaginacion</b></p>
</div>
<div id="source" class="step" data-x="6300" data-y="2000" data-rotate="20" data-scale="4">
<p>quieres saber mas?</p>
<q><a href="http://github.com/bartaz/impress.js">usa el codigo</a>, Luke!</q>
</div>
<div id="one-more-thing" class="step" data-x="6000" data-y="4000" data-scale="2">
<p>una cosa mas...</p>
</div>

Y la última muestra del poder y la flexibilidad de impress.js. Usted puede no sólo posicionar el elemento en 3D, sino que también girar alrededor de cualquier eje. Así que esto de aquí obtendrá rotacion en -40 grados (40 grados en sentido antihorario) alrededor del eje X y 10 grados (sentido horario) alrededor del eje Y.        Por supuesto, puedes hacerla girar alrededor del eje Z con 'data-rotate-z' -que tiene exactamente el mismo efecto que 'data-rotation' (estos dos son básicamente los mismos).
<div id="its-in-3d" class="step" data-x="6200" data-y="4300" data-z="-100" data-rotate-x="-40" data-rotate-y="10" data-scale="2">
<p><span class="have">sabias </span> <span class="you">t&#65533;, </span> <span class="noticed">que</span> <span class="its">esto es</span> <span class="in">en </span> <b>3D<sup>*</sup></b>?</p>
<span class="footnote">* toma eso, prezi ;)</span>
</div>

Así que para hacer un resumen de todos los atributos posibles que
nsirven para colocar los steps de la presentación, tenemos:

  •  "data-x", "data-y", "data-z" - estos definen la posicion del centro en pixeles del elemento step en el canvas; Su valor inicial es 0

  •  "data-rotate-x", "data-rotate-y", "data-rotate-z", "data-rotate" - estos definen la rotacion de el elemento en grados alrededor de los ejes; su valor inicial es 0 "data-rotate" y "data-rotate-z" son exactamente los mismos.

  •  "data-scale" - define el scale de el elemento step; su valor inicial es 1.


Estos valores son usados por impress.js en las funciones de transformacion CSS, asi que para mas informacion consulta CSS transform docs.
<div id="overview" class="step" data-x="3000" data-y="1500" data-scale="10">
</div>


"hint" no está relacionado con impress.js de ninguna manera. Sin embargo, le puede mostrar cómo utilizar las funciones impress.js en forma creativa. Cuando el step de presentación se muestra (selected) su elemento obtiene la clase de "active" y el elemento de cuerpo se basa en la clase Identificación del step activo "impress-on-ID" (donde ID es el id del step)... Tal vez no sea tan clara, debido a todos estos "IDs" en la frase anterior, por ejemplo, cuando el primer step (el unico con el ID de "bored") está activo, el elemento del cuerpo recibe una clase de "impress-on-bored". Esta clase la utiliza este "hint" a continuación. Compruebe el archivo CSS para ver cómo se muestra con retraso en la animación CSS cuando el primer step de la presentación es visible durante un par de segundos. Y cuando se trata de este fragmento de código JavaScript a continuación, (los niños, no hagan esto en casa) Es una solución rápida y sucia para obtener texto de sugerencia distinta para los dispositivos táctiles. En un mundo real debe ser por lo menos en distintos archivo JS... y el contenido de touch debe estar probablemente sólo oculta en algún lugar de HTML - no codificado en la secuencia de comandos.

<div class="hint">
<p>Usa la barra espaciadora o las flechas para navegar</p>
</div>
<script>
if ("ontouchstart" in document.documentElement) {
document.querySelector(".hint").innerHTML = "<p>Toque a la izquierda o derecha para navegar</p>";
}
</script>

Por último, pero no menos importante. Para que todo lo que se ha descrito anteriormente funcione realmente, es necesario incluir impress.js en la página. De aquí me basta con incluir la fuente completa de la secuencia de comandos para que sea más legible. Tambien es necesario llamar a `impress().init()` para inicializar la función de presentación impress.js. Y debe hacerlo en el final de su documento. No sólo porque es una buena práctica, sino también porque se debe hacer cuando todo el documento está listo. Por supuesto que se puede envolver en cualquier tipo de evento "DOM ready", pero yo estaba demasiado perezoso para hacerlo ;)
<script src="js/impress.js"></script>
<script>impress().init();</script>

Y eso es todo.!! Espero puedan hacer magnificas presentaciones con impress.js

Resultado: Ver                                Archivos: Descargar

 

Efecto: Tipografía Interactiva con HTML5

[caption id="attachment_149" align="aligncenter" width="434"]tipografia interactiva tipografia interactiva[/caption]



Con HTML5 ganando popularidad, este tutorial describe lo que en realidad es sólo la punta del iceberg que es el diseño interactivo. En este tutorial voy a ir por el desarrollo de banners dinámicos, y generativa para darle a su sitio web que poco más de wow!

Si usted está interesado en leer más sobre la especificación de HTML 5, este es un gran recurso: DiveIntoHTML5 byMarkPilgrim

HTML

El formato HTML es muy sencillo, ya que vamos a hacer todo el trabajo con JavaScript, en el elemento canvas:
<canvas id="banner"></canvas>

JAVASCRIPT

Como era de esperar, sera JavaScript el que este haciendo todo el trabajo pesado aquí. Pero, ante todo, tendremos que comprobar si los usuarios están usando un navegador moderno que soporte el elemento canvas. Si no está apoyado, mostrará lo siguiente: una imagen estática. Vamos a usar Modernizr para comprobar esto.

Variables

Vamos a empezar definiendo algunas variables:
//Las palabras que se escribiran en el banner.
var keyword = "Bienvenid@s",
canvas, context,
bgCanvas, bgContext,
density = 13,
particles = [],
colour = '#fff0a4',
mouse = { x:0, y:0 },
isDrawing = false,
canvasW, canvasH;

Una pequeña explicación: La palabra clave aquí va a ser la palabra que desea mostrar en el banner. El canvas, es una variable que contendrá el elemento canvas de HTML. Este será asignado después. El contexto es lo que nos permite dibujar y escribir en el canvas. La variable de la densidad tiene el número de píxeles que queremos tener (tanto horizontal como verticalmente) entre cada partícula del banner. En la matriz de partículas se almacenan todas las partículas y sus respectivos ajustes. La variable color es el color que cada partícula tendrá. Por último, la variable isDrawing va a hacernos saber si estamos haciendo hover sobre el banner, y el canvasW y canvasH son la anchura del lienzo y la altura respectivamente.

Configurando el banner

El primer paso es llamar a la función de recarga, y también vamos a pedir a tamaño de la ventana:
this.initialize = function( canvas_id ) {
reload( canvas_id );
window.onresize = function(event) {
reload( canvas_id );

En la función de recarga se inicializa el canvas, el contexto y establecemos las medidas respectivas. Entonces llamamos las funciones prepare, setupParticles y draw.
var reload = function( canvas_id ) {
canvas = document.getElementById( canvas_id );
if ( !window.HTMLCanvasElement ) return false;
context = canvas.getContext('2d');
canvasW = window.innerWidth;
canvasH = 300;
canvas.width = canvasW;
canvas.height = canvasH;
bgCanvas = document.createElement('canvas');
bgContext = bgCanvas.getContext('2d');
bgCanvas.width = canvasW;
bgCanvas.height = canvasH;
prepare();
setupParticles();
draw();

Lo primero a destacar aquí, es que la función toma una variable de cadena, que debe coincidir con el ID de elemento en el código HTML. En nuestro caso, que pasaría "canvas-banner".

Como puedes ver, ambos, el
ncanvas de fondo y el canvas principal se establece en el mismo tamaño. Vamos a entrar aqui para ver por qué estamos utilizando dos elementos canvas en la siguiente sección.

El canvas de fondo

Ok, ahora voy dar algunas explicaciones: La razón por la cual tenemos dos canvas aquí, es más o menos el núcleo de estos banners. El canvas de fondo es donde se va a imprimir el texto o imágenes. Posteriormente, se analizará a través de los datos de la imagen (píxel por píxel) del canvas. Si nos encontramos con un píxel negro sabremos que nos hemos dibujado en este lugar, y por lo tanto, va a crear una partícula en su lugar.
var prepare = function() {
//Elegimos la funte y el tamaño
bgContext.font = "300px 'Jockey One'";
//Ahora llenamos la palabra clave en el texto del canvas
bgContext.fillText(keyword, ( canvasW / 2 ) - ( Math.round( bgContext.measureText(keyword).width/2 )) , 260 );

El comando fillText arriba, toma tres parámetros: el primero es el texto para escribir, la segunda y la tercera es la "x" y "y" respectivamente. A continuación, vamos a crear nuestras partículas. Esto pronto se elaborará en el canvas principal, pero por ahora, nos limitaremos a almacenarlos en nuestra gama de partículas:
var setupParticles = function() {
particles = [];
//Declaramos nuestras variables locales
var imageData, image_Data,
pixel,
width = 0,
i = 0,
slide = false;
//tomamos el image - data - from (0,0) a los bordes del canvas
imageData = bgContext.getImageData( 0, 0, canvasW, canvasH );
image_Data= imageData.data;
for( var height = 0; height ++i;
slide = ((i % 2) == 0);
width = 0;
if (slide == true) {
width += 6;
}
//Luego Iterar horizontalmente sobre los datos de imagen
for( width; width //Obtenemos el pixel situado en nuestra iteración actual.
pixel = image_Data[ ( ( width + ( height * canvasW )) * 4 ) - 1 ];
//El pixel se dibuja
if( pixel == 255 ) {
//añadimos coordenadas y colores a nuestro array de particulas.
particles.push({
colour : colour,
x : width,
y : height

Sí, eso es una gran parte del código, voy a ir a las partes difíciles ahora. En realidad, todo lo que estamos haciendo es recorrer cada pixel enésimo, donde n es el conjunto de la densidad en la salida. getImageData toma cuatro valores, el "X" y "Y" de la esquina superior izquierda, así como para la parte inferior derecha. En nuestro caso, le pasamos dos ceros a la izquierda (parte superior) y la anchura y altura del canvas, que son las coordenadas de la parte inferior derecha. Se devuelve una lista muy grande, que contiene los datos de color de cada píxel en el lienzo. ¿Por qué estamos multiplicando esta por cuatro? Debido a que dentro de esta lista, cada píxel está representado por cuatro valores, rojo, verde, azul y un valor de alfa. Por defecto, todos los ImageData del canvas contienen, es una larga lista de ceros - haciendo uso de este canvas (en nuestro caso, el uso fillText), los píxeles ahora contienen los datos correctos de color. Finalmente, han empujado a la coordenadas X e Y en un diccionario simple, que ahora vamos a usar para dibujar nuestro banner.

Dibujando el banner

En este sentido, finalmente, podemos unir todo. Con nuestra lista de posiciones "X" y "Y", almacenados en la matriz de partículas, podemos dibujar el banner.
var draw = function() {
context.clearRect( 0, 0, canvasW, canvasH );
var dx, dy, sqrDist,
scale = 1;
for ( var i = 0, len = particles.length; i ...
context.beginPath();
context.moveTo( x, y - height / 2 );
context.lineTo( x + width / 2, y - height / 4 );
context.lineTo( x + width / 2, y + height / 4 );
context.lineTo( x, y + height / 2 );
context.lineTo( x - width / 2, y + height / 4 );
context.lineTo( x - width / 2, y - height / 4 );
context.lineTo( x, y - height / 2 );
context.closePath();
context.fill();

nnvamos a recorrer a través de cada una de las partículas que previamente se almacenaron para establecer el color y para dibujar una forma en el punto (x, y). Con eso, tenemos un banner estático muy simple ... ahora viene la parte divertida, vamos a añadir un poco de interactividad.

añadiendo interactividad
var mouse = {x:0, y:0, o: false}

La variable del ratón se actualizará por dos funciones, una de seguimiento del movimiento, y un seguimiento de si el ratón ha dejado el elemento de tela:
var MouseMove = function( e ) {
mouse.x = e.offsetX || ( e.layerX - canvas.offsetLeft );
mouse.y = e.offsetY || ( e.layerY - canvas.offsetTop );
if( !isDrawing ) {
isDrawing = true;
drawTimeout = setTimeout( function() {
draw();
isDrawing = false;
}, 60);
}
};
var MouseOut = function(e) {
isDrawing = false;
clearTimeout( drawTimeout );
draw();

Con el fin de hacer que funcione, también es necesario unir los eventos de JavaScript a nuestro elemento canvas. Esto vendra dentro de la función de recarga.
canvas.addEventListener('mousemove', MouseMove, false);
canvas.addEventListener('mouseout', MouseOut, false);

Ahora que podemos realizar un seguimiento del ratón, tenemos que cambiar nuestra función de dibujo un poco, sobre la base de cómo queremos interactuar con el ratón.
var p = particles[i];
dx = p.x - mouse.x;
dy = p.y - mouse.y;
// Distancia del mouse a las particulas
sqrDist = Math.sqrt( dx * dx + dy * dy );
( isDrawing ) ? scale = Math.max( Math.min( 3 - ( sqrDist / 10 ), 10 ), 1 ) : scale = 1;
var width = density / scale - 4,
height = density,
x = p.x,
y = p.y;
context.fillStyle = p.colour;

Por encima, se calcula la distancia entre la partícula de corriente y el ratón. A continuación, se actualiza la escala variable a caer entre 1 (es decir, sin escala) y la distancia entre el ratón y la partícula (pero no mayor que 10). Todo lo que queda ahora, es decirle al canvas que dibuje a intervalos regulares, en lugar de una sola vez al comienzo. para no hacer esto demasiado complicado yo sólo voy a mantenerlo simple y uso setTimeouts cuando el usuario hace hover sobre el banner - pero si usted está interesado en buscar más en las animaciones del canvas, la función que se busca es requestAnimationFrame

Vamos a agregar algun color

Tenemos un banner limpio de trabajo, por qué no añadir un poco de color. Afortunadamente, ya hemos hecho la mayor parte del trabajo aquí, sólo tenemos que cambiar 2 líneas.
//Una variable para guardar cada uno de los colores que vamos a usar
var colors = ['#fff0a4', '#ffe98f', '#ffcf52', '#fbad1d', '#c48d1c'];
//Cuando estamos creando la particula, asignamos un color para esta lista
color: colors[Math.floor(Math.random() * colors.length)],

Y ahí lo tenemos! Una banner único, generativo y colorido, hecho especialmente para usted. Eche un vistazo a través de las versiones parciales del demo para ver algunos ejemplos de otros, que usted puede hacer.

Resultado: Ver                                     Archivos: Descargar