HTML5:

empieza hoy

La presentación

* Ctrl o Shift en realidad. En Opera sólo funciona Shift.

¡Hola!

Javier Usobiaga y Marta Armada

Javier Usobiaga

Logotipo de Swwweet

Marta Armada

¿HTML5?

HTML5 is a vocabulary and set of application programming interfaces that make up a core declarative language for web sites and applications.”

WTF?

¿HTML5?

Diagrama sobre HTML5

Un poco de historia

así empezó todo

¿XHTML 2?

comienzan los problemas...

El WHATWG

whatwg - wtf?

Reconciliación

estado actual

¡Empezamos!

Comienza la diversión

Tu primera página

(chispas)

:-)

Tu primera página

(chispas)

<!DOCTYPE html>
<META charset=utf-8>
<title> Esto es HTML5 </title>
<p>¡Chispas!</p>

WTF?

¡Simplifiquemos!

HTML5 nos hace la vida más fácil

¿Sopa de tags?

Como a Mafalda, no nos gusta la sopa...

<META CHARSET=utf-8>
<META CHARSET=utf-8 />
<META CHARSET="utf-8">
<META CHARSET="utf-8" />
<meta charset=utf-8>
<meta charset=utf-8 />
<meta charset="utf-8">
<meta charset="utf-8" />
<MeTa ChArSeT=utf-8>

WTF?

¡Validación!

¿Validación?

Here’s the thing about validation: it’s a tool. Nothing more; nothing less; just a tool.”

¡No es el único que lo dice!

¿Se puede usar ya?

we have to wake up to the fact that full cross-browser support of new technologies is just not going to happen. Some users will still use older browsers and some users will still have browsers with deactivated JavaScript or images”

¿Se puede usar ya?

Hay partes de HTML5 que son:

  • Fiables desde ya
  • Apenas utilizables
  • Por desgracia, extrañas
  • Interesantes pero ignorables
  • Fundamentalmente para experimentar con aplicaciones web ”

Nuevos tags

Di adiós a la divitis

Nuevos tags

Captura de pantalla del blog de HTML5 doctor

<header>

La W3C define header como:

El elemento header representa un grupo de ayudas introductorias o de navegación.”

Suele incluir (aunque no es obligatorio):

  • Logo y título
  • Navegación
  • Uno o más encabezados

<header>

Captura de pantalla del blog de HTML5 doctor con el header destacado

<nav>

La W3C define nav como:

El elemento nav representa una sección de una página que enlaza a otras páginas o partes de una página: una sección con enlaces para navegar.”

<nav>

Captura de pantalla del blog de HTML5 doctor con el nav destacado

<footer>

La W3C define footer como:

El elemento footer representa un footer para el contenido de sección [...] más cercano que le anteceda. Suele contener información adicional sobre su sección [...].”

<footer>

Captura de pantalla del blog de HTML5 doctor con el footer destacado

<article>

La W3C define article como:

El elemento article representa una composición autocontenida en un documento, página [...] que es, en principio, distribuible o reutilizable independientemente, es decir, sindicable.”

<article>

Captura de pantalla del blog de HTML5 doctor con el article destacado

<section>

La W3C define section como:

El elemento section representa una sección genérica de un documento o aplicación. Una sección [...] es una agrupación temática de contenido, normalmente con un encabezado.”

<section>

Captura de pantalla del blog de HTML5 doctor con el section destacado

<aside>

La W3C define aside como:

El elemento aside representa una sección de una página consistente en contenido relacionado tangencialmente con el contenido que le rodea, y que se podría considerar separado de dicho contenido.”

<aside>

Captura de pantalla del blog de HTML5 doctor con el aside destacado

<hgroup>

La W3C define hgroup como:

El elemento hgroup representa el encabezado de una sección. [...] Se utiliza para agrupar una serie de h1-h6 cuando el encabezdo tiene múltiples niveles, como subtítulos, títulos alternativos, o slogans.”

<hgroup>

<header>
  <hgroup>
    <h1>Arcoiris</h1>
    <h2>Los 7 colores</h2>
  </hgroup>
</header>
Captura de pantalla del blog de HTML5 doctor con el hgroup destacado

<figure>

La W3C define figure como:

El elemento figure representa un contenido fluído, opcionalmente con una leyenda, autocontenido [...].”

Y figcaption como:

El elemento figcaption representa un una leyenda para el resto de contenidos de su elemento figure padre.”

<figure>

<figure>
  <img src=foto.jpg alt="">	
  <figcaption>
    Tortugas
  </figcaption>
</figure>
Tortugas

<time>

La W3C define time como:

El elemento time representa o una hora en un reloj de 24 horas, o una fecha precisa en el calendario gregoriano [...] ”

<mark>

La W3C define mark como:

El elemento mark representa una porción de texto [...] marcada o destacada con un propósito de referencia, debido a su relevancia en otro contexto.”

<mark>

Captura de pantalla del blog de HTML5 doctor con el mark destacado

Tags redefinidos

los tiempos cambian

Tags obsoletos

adiós con el corazón...

Sí, muy bien, pero...

1. HTML5 shiv

Creamos los elementos nuevos con Javascript:

document.CreateElement('nav');
document.CreateElement('header');
document.CreateElement('footer');
document.CreateElement('article');
document.CreateElement('section');

Y... ¡magia! Nuestra flamante página ya se puede ver en todos los navegadores :-)

No hace falta que los creemos cada vez, solo hay que cargar este script de Remy Sharp (o Modernizr)
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->

2. shiv mejorado

Método desarrollado por Nicolas Gallagher

<!--[if ! lt IE 9]><!-->
  <link rel="stylesheet" href="/css/default.css">
<!--<![endif]-->
<!--[if (IE 7)|(IE 8)]>
  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  <script>
    (function() {
      var link = document.createElement("link");
      link.rel = "stylesheet";
      link.href = "/css/default.css";
      document.getElementsByTagName("head")[0].appendChild(link);
   })();
  </script>
<![endif]-->
<!--[if lt IE 9]>
  <noscript>
    <link rel="stylesheet" href="/css/legacy.css">
  </noscript>
<![endif]-->

3. Bulletproof

Presentada por Tantek Çelik, consiste en añadir un div dentro o alrededor de cada elemento HTML5:

<article>
  <div class=article>
    [...]
  </div>
</article>
<div class=hgroup>
  <hgroup>
    [...]
  </hgroup>  
<div>
.article{
  background: #FF0000;
}
.hgroup{
  background: #FF0000;
}

Audio y vídeo

Rock'n'roll

La vieja usanza

¡el horror!

Este es el código que, hasta hace poco, nos daba Youtube para incrustar vídeos:

<object width="480" height="385">
  <param name="movie" value="http://www.youtube.com/v/w0ffwDYo00Q?fs=1&hl=es_ES"></param>
  <param name="allowFullScreen" value="true"></param>
  <param name="allowscriptaccess" value="always"></param>
  <embed src="http://www.youtube.com/v/w0ffwDYo00Q?fs=1&hl=es_ES" type="application/x-shockwave-flash" 
   allowscriptaccess="always" allowfullscreen="true" width="480" height="385">
  </embed>
</object>

:-(

<video>, <audio>

Una nueva forma de incrustar vídeos y audios de forma nativa:

<audio src="cancion.???" > </audio>
<video src="video.???" > </video>

:-)

Atributos

Guerra de formatos

no todo podía ser bueno :(

Existen multitud de codecs de vídeo, y no todos los navegadores soportan los mismos:

Guerra de formatos

estado actual

Theora + Ogg 3.5+ 5.0+ 10.5+
H264 + MP4 9.0+ 3.0+ 5.0+ 3.0+ 2.0+
WebM 9.0+ 4.0+ 5.0+ 10.6+ 2.3+

A prueba de balas

<video controls width="360" height="240" poster="caratula.jpg" >
  <source src="vid.mp4" type="video/mp4" >
  <source src="vid.ogv" type="video/ogg" >
  <p>
    Tu navegador no sorporta vídeo. Puedes descargar este vídeo en formato
    <a href="vid.mp4">mp4<a> o en formato <a href="vid.ogv">Ogg<a>.
  </p>
</video>

¡Todos contentos! :-)

A prueba de IE

peor que las balas

<video controls width="360" height="240" poster="caratula.jpg" >
  <source src="vid.mp4" type="video/mp4" >
  <source src="vid.ogv" type="video/ogg" >
  <object type="application/x-shockwave-flash" width="360" height="240" 
    data="player.swf?file=vid.mp4">
    <param name="vid" value="player.swf?file=vid.mp4">
    <a href="vid.mp4">Descargar vídeo</a>
  </object>  
</video>

¡Ta-da!

Video + CSS

el vídeo puede ser sexy

Formularios

Un poco de ♥

Nuevos input

Captura de pantalla de un input email en un iPhone Captura de pantalla de un input url en un iPhone Captura de pantalla de un input tel en un iPhone

Nuevos input

Nuevos input

controla el tiempo

Atributos

escoge el que quieras

Atributos

Atributos

Atributos

Required

Pseudoselectores

CSS love

HTML5 forms y IE

¡sorpresa!

Canvas/SVG

¡A dibujar!

Un lienzo en blanco

¡y se mueve!

Primeros pasos

<canvas id=miCanvas width=500 height=300>
  Oh, tu navegador no funciona con canvas. 
  Esto era un dibujo ridículo, 
  no te preocupes.
</canvas>

Primeros pasos

<script>
  // creamos una referencia para el elemento
  var elem = document.getElementById('miCanvas');

  // comprobamos el soporte del navegador
  if (elem && elem.getContext) {
    // inicializamos el contexto 2D (sólo un contexto por elemento)
    var context = elem.getContext('2d');
    if (context) {
      // ¡Podemos dibujar el primer rectángulo!
      // Hay que poner las coordenadas (x,y) seguido de width y height
      context.fillRect(0, 0, 400, 250);
    }
  }
</script>

En acción

Oh, tu navegador no funciona con canvas. Esto era un dibujo ridículo, no te preocupes.

¡Wow! Un rectángulo negro. Bravo, Da Vinci...

¡Más difícil!

// Cara amarilla
context.strokeStyle = "#000000";
context.fillStyle = "#FFFF00";
context.beginPath();
context.arc(250,150,100,0,Math.PI*2,true);
context.closePath();
context.stroke();
context.fill();

En acción

Oh, tu navegador no funciona con canvas. Esto era un dibujo ridículo, no te preocupes.

¡Más difícil!

// ojos					
context.strokeStyle = "#000000";
context.fillStyle = "#000000";
context.beginPath();
context.arc(200,120,15,0,Math.PI*2,true);
context.closePath();
context.fill();

context.strokeStyle = "#000000";
context.fillStyle = "#000000";
context.beginPath();
context.arc(300,120,15,0,Math.PI*2,true);
context.closePath();
context.fill();

En acción

Oh, tu navegador no funciona con canvas. Esto era un dibujo ridículo, no te preocupes.

¡Más difícil!

// Sonrisa					
context.strokeStyle = "#000000";
context.beginPath();
context.moveTo(190,190);
context.quadraticCurveTo(250,250,310,190);
context.quadraticCurveTo(250,230,190,190);				
context.closePath();
context.stroke();

En acción

Oh, tu navegador no funciona con canvas. Esto era un dibujo ridículo, no te preocupes.

¿Es el Louvre? ¡Tienen que ver esto!

Todo es posible

http://www.kevs3d.co.uk/dev/html5logo/

Las otras API

No se vayan todavía

Web Storage

cookies con esteroides

Web Storage

cookies con esteroides

IE8 :-)

Web SQL

almacena BBDD en tu navegador

Offline

Navega sin conexión

El Manifest

HTML:

<!DOCTYPE HTML> 
<html manifest=manifest.cache>

manifest.cache:

CACHE MANIFEST 
index.html 
stylesheet.css 
images/masthead.png 
scripts/misc.js 
	 
NETWORK: 
search.php 
login.php 
/api 
	 
FALLBACK: 
images/dynamic.php static_image.png

# Version 2

Drag and drop

arrastrar cosas y soltarlas, ¡vaya!

Ejemplo: http://html5demos.com/drag

Geolocalización

poniendo al usuario en el mapa

Geolocalización

poniendo al usuario en el mapa

navigator.geolocation.getCurrentPosition(
    function (position){
        var coords = position.coords;
        alert('Latitud: ' + coords.latitude 
          + 'Longitud:' + coords.longitude);
    }
);

Web Messages

Comunicación entre dominios

Web Workers

Duendes que trabajan por la noche

scripts.js
		
var worker = new Worker('mytask.js');
worker.onmessage = function (event) {
 alert('El worker dice: ' + event.data); 
};

worker.postMessage('task=job1');		
mytask.js

self.onmessage = function(event) {
 // Lanzamos una tarea
 self.postMessage("recibido:" + event.data);
};		

Web Sockets

El servidor llama a tu puerta

var socket = new WebSocket('ws://mipagina.com/updates');
socket.onopen = function(event) {
  socket.send('Toc toc, ¿se puede?');
};
socket.onmessage = function(event) { alert(event.data); }
socket.onclose = function(event) { alert('closed'); }

¿Quieres más?

Polyfills

rellena los huecos

Recursos

los expertos dicen...

Recursos

los expertos dicen...

¡Muchas gracias!

:-)

¿Quieres repetir?

¿Preguntas?

?