Travailler en HTML5!!!
Le Remix - Unlimited
Commençons à travailler en HTML5 - Addenda: Table des matières
Liste de librairies et outils pour gérer les vidéos
- http://mediaelementjs.com/
- http://www.kaltura.org/project/HTML5_Video_Media_JavaScript_Library
- http://sublimevideo.net/
- http://videojs.com/
- http://camendesign.com/code/video_for_everybody
- http://www.longtailvideo.com/players/jw-flv-player/
- Convertisseur de vidéo libre
Source : http://www.templates.com/blog/10-html5-video-players/
WebIDL
- Interface definition language
- WebIDL au W3C
- Standard pour décrire les interfaces implémentés dans les navigateurs (ex: DOM)
- Comme le HTML5, il n'est pas encore une recommandation
- Modules, Interfaces, Constantes, Attributs, Operations, etc
interface HTMLMediaElement : HTMLElement {
// error state
readonly attribute MediaError error;
// network state
attribute DOMString src;
readonly attribute DOMString currentSrc;
const unsigned short NETWORK_EMPTY = 0;
const unsigned short NETWORK_IDLE = 1;
const unsigned short NETWORK_LOADING = 2;
const unsigned short NETWORK_NO_SOURCE = 3;
readonly attribute unsigned short networkState;
attribute DOMString preload;
readonly attribute TimeRanges buffered;
void load();
DOMString canPlayType(in DOMString type);
// ready state
const unsigned short HAVE_NOTHING = 0;
const unsigned short HAVE_METADATA = 1;
const unsigned short HAVE_CURRENT_DATA = 2;
const unsigned short HAVE_FUTURE_DATA = 3;
const unsigned short HAVE_ENOUGH_DATA = 4;
readonly attribute unsigned short readyState;
readonly attribute boolean seeking;
// playback state
attribute double currentTime;
readonly attribute double initialTime;
readonly attribute double duration;
readonly attribute Date startOffsetTime;
readonly attribute boolean paused;
attribute double defaultPlaybackRate;
attribute double playbackRate;
readonly attribute TimeRanges played;
readonly attribute TimeRanges seekable;
readonly attribute boolean ended;
attribute boolean autoplay;
attribute boolean loop;
void play();
void pause();
// controls
attribute boolean controls;
attribute double volume;
attribute boolean muted;
// text tracks
readonly attribute TextTrack[] tracks;
MutableTextTrack addTrack(in DOMString kind, in optional DOMString label, in optional DOMString language);
};
http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html
Un peu plus avec WAI-ARIA
- Équivalences HTML5 et rôles ARIA : http://dev.w3.org/html5/html-api-map/overview.html
- Article pour approfondir : http://dev.opera.com/articles/view/introduction-to-wai-aria/#landmarks [en]
Quelques exemples :
| Élément HTML | Rôle équivalent ARIA | Description du rôle (si pas déjà défini) | Peut prendre d'autre valeurs ? |
|---|---|---|---|
| a | link | Lien | Oui ? (Il y a plusieurs débats, button ?) |
| article | article | Contenu automone, réutilisable, indépendant | ? |
| aside | complementary | Contenu additinel relié au contenu principal, qui peut exister par lui-même | Non |
| section | region | Section de contenu structuré | Oui (ex: main) |
| ul | list | Liste | ? |
| output | status | Élément de suivi | Non |
Attribut hidden
- Attribut global
- Sert à rendre "invisibles" des éléments qui ne sont pas encore pertinents (ex: des
<div>vides qui seront remplis plus tard par du AJAX) - Les éléments avec cet attribut ne seront pas rendus par le navigateur
- Cet attribut ne doit pas être utilisé pour faire des effets visuels (ex: interface avec onglets)
- Ne peut être référencé par d'autres éléments actifs
L'élément <datalist>
- Sert à definir un ensemble d'éléments
<option>relié à un élément<input type="list"> - Peut inclure du contenu alternatif pour les navigateurs ne le prenant pas en charge
- Ressemble à un Google Suggest
- Opera et Firefox 4
<label for="pays">Choisissez votre pays</label>
<input list="pays" name="pays">
<datalist id="pays">
<option value="Canada"></option>
<option value="États-Unis"></option>
<option value="France"></option>
</datalist>
L'élément <output>
- Représente le résultats d'un calcul
- l'attribut for contient une liste d'identifiants des champs séparés par des espaces
- l'attribut for contient l'identifiant relié au formulaire associé
<script>
function concat() {
document.getElementById("concatenation").value = document.getElementById("el1").value + document.getElementById("el2").value
}
</script>
<form id="outputExemple">
<label for="el1">Premier élément</label>
<input type="text" id="el1">
<label for="el2">Deuxième élément</label>
<input type="text" id="el2">
<input type="submit" value="Calcule" onclick="concat();return false">
<label for="concatenation">Concaténation :</label>
<output id="concatenation" form="outputExemple" ></output>
</form>
API messagerie entre fenêtres
- Communication entre fenêtres (iframe par la méthode postMessage de l'objet window
- Attention au Cross Site Scripting!
- event.data (données du message), event.origin (domaine d'origine), event.source (window proxy de la source)
- Le fenêtre appelée doit avoir un événement onmessage sur l'objet window
Dans la fenêtre appelante :
window.name ="Moi";
function postMessageTest() {
var value = document.getElementById("messageAPoster").value;
var iframeWindow = document.getElementById("iframeToPostTo").contentWindow;
iframeWindow.postMessage(value, "http://localhost");
}
Dans la fenêtre appelée :
window.addEventListener("message", function(event) {
var divInfo = document.getElementById("test");
divInfo.hidden = false;
divInfo.innerHTML = '<dl><dt>Data :</dt><dd id="thedata"></dd>' +
'<dt>Origin :</dt><dd> ' + event.origin + '</dd>' +
'<dt>Source : </dt><dd>' + event.source.name + '</dd></dl>';
var ddInfo = document.getElementById("thedata");
ddInfo.textContent = event.data;
}, false);
API messagerie entre fenêtres (exemple)
API historique du navigateur
L'objectif est de pouvoir ajouter des éléments dans l'historique du navigateur pour respecter un identifiant unique (URL) par représentation (ressource) qui pourraient être modifié par l'addresse ou en AJAX.
history.pushState(state, title, url)- state : Peut être une structure JSON ou autre information
- title : titre de la page
- Événement popstate lorsque l'utilisateur appuie sur "Back"
- onpopstate event.state
L'outil actuel de présentation pourrait utiliser un code semblable pour gérer le changement des diapos:
history.pushState(currentPage, document.title, '#page=' + currentPage);
window.addEventListener("popstate", function(event) {
// remettre le document comme il était avec l'information dans event.state (qui est le numéro de la page)
}, false);
Un peu plus avec Canvas
- Tutorial chez Mozilla [en]:https://developer.mozilla.org/en/Canvas_tutorial
- Système de coordonnées x: 0 y: 0 en haut à gauche
- Contexte, garde les informations sur les transformations (rotation, translation, etc.)
- Couleur, transparence :
canvasCtx.fillStyle = "rgba('rouge','vert','bleu', 'tranparence 0 à 1')"; - Translation du contexte :
canvasCtx.translate(x, y); - Rotation du contexte (selon les aiguile d'une montre):
canvasCtx.rotate(angle en radians); - Mise à l'échelle:
canvasCtx.scale(x,y);(de 0 à 1) - Matrice de transformation :
canvasCtx.transform(m11,m12,m21,m22,dx,dy); - Sauvegarder et charger la dernière sauvegarde du contexte :
canvasCtx.save(); canvasCtx.restore();
Un peu plus avec Canvas (2)
if (Modernizr.canvas) {
var canvasCtx = document.getElementById("myCanvas").getContext("2d");
canvasCtx.save();
canvasCtx.fillStyle = "rgb(0,100,0)";
canvasCtx.translate(150, 25);
canvasCtx.rotate(45 * Math.PI / 180);
canvasCtx.fillRect(0,0,50,50);
canvasCtx.restore();
canvasCtx.fillStyle = "rgba(100,0,0, 0.5)";
canvasCtx.translate(125, 0);
canvasCtx.scale(0.75, 1);
canvasCtx.fillRect(0,0,50,50);
canvasCtx.save();
}
Un peu plus avec Canvas (3)
- Pour dessiner sur un chemin :
canvasCtx.beginPath();, canvasCtx.closePath();, canvasCtx.moveTo(x, y); canvasCtx.lineTo(); - Faire un trait ou remplir (et fermer la forme automatiquement) :
canvasCtx.stroke(), canvasCtx.fill(); - Rectangle (sans dessiner, trait, remplir, effacer):
canvasCtx.rect();, canvasCtx.strokeRect();, canvasCtx.fillRect();, canvasCtx.clearRect(); - Arc :
canvasCtx.arc(centre x, centre y, rayon, angle radian début, angle radian fin, est contre les aiguille d'une montre); - Courbe quadratique :
quadraticCurveTo(point de contrôle x, point de contrôle y, x, y);(Entrée wikipédia) - Courbe bézier :
bezierCurveTo(point de contrôle 1 x, point de contrôle 1 y, point de contrôle 2 x, point de contrôle 2 y, x, y);
Un peu plus avec Canvas (4)
if (Modernizr.canvas) {
var canvasCtx = document.getElementById("myCanvas3").getContext("2d");
canvasCtx.fillStyle = "rgb(0,100,0)";
canvasCtx.strokeStyle = "rgb(0,0,100)";
canvasCtx.beginPath();
canvasCtx.moveTo(150, 25);
canvasCtx.lineTo(200, 0);
canvasCtx.lineTo(250, 20);
canvasCtx.stroke();
canvasCtx.beginPath();
canvasCtx.moveTo(100, 25);
canvasCtx.lineTo(100, 100);
canvasCtx.lineTo(50, 100);
canvasCtx.fill();
canvasCtx.beginPath();
canvasCtx.arc(250,10,75, 0, 90/180*Math.PI, false);
canvasCtx.fill();
canvasCtx.beginPath();
canvasCtx.moveTo(350, 25);
canvasCtx.quadraticCurveTo(370, 5, 450, 100);
canvasCtx.bezierCurveTo(370, 150, 110, 110, 250, 160);
canvasCtx.stroke();
}
Un peu plus avec Canvas (5)
canvasCtx.globalCompositeOperation= : dans l'ordre : source-over (le défaut), destination-over, source-in, destination-in, source-out, destination-out- 2e ligne, dans l'ordre : source-atop, destination-atop, lighter, darker, xor, copy
- Attention : affecte tout le canvas
- Prise en charge des diverses valeures diffèrent selon les navigateurs.
Un peu plus avec Canvas (6)
- Ajouter une image et du texte :
canvasCtx.drawImage(objet image, x, y); canvasCtx.fillText("DU TEXTE", x, y); - Créer un espace pour rogner le canvas:
canvasCtx.clip();
var imageForCanvas = new Image();
imageForCanvas.src = "images/HTML5_Badge_128.png";
imageForCanvas.onload = function() {
if (Modernizr.canvas) {
var canvasCtx = document.getElementById("myCanvas5").getContext("2d");
canvasCtx.beginPath();
canvasCtx.arc(60,60,60,0,Math.PI*2,true);
canvasCtx.clip();
canvasCtx.drawImage(imageForCanvas, 10,10);
canvasCtx.font = "normal 14px sans-serif";
canvasCtx.fillStyle = "black";
canvasCtx.fillText("DU TEXTE", 60, 60);
}
};
XMLHTTPRequest 2
- À venir
WebSocket et NodeJS
- À venir
WebGL
- À venir
Extension Microsoft : Pinned Sites
- À venir
Extension Firefox : Audio API
- À venir
Détection avec Modernizr
- À venir
D'autres ressources
- À venir
