On Github serbanghita / HTML5-presentation
De la site-uri mai performante la jocuri web multiplayer
Senior Software Engineer
Senior Software Engineer
In Avangate lucrez in prezent la:
Stategie de web design prin care toti vizitatorii site-ului pot experimenta cel putin o versiune de baza functionala. Cei ce au browsere sau conexiuni mult mai capabile vor beneficia de o experienta de navigare imbunatatita.
Alternativa la stategia "Graceful degradation".
Ex: CSS3 border-radius, box-shadow, gradients, etc.
Strategie de web design prin care este conceput un site destinat dispozitivelor clasice si mobile.
De citit: Desktop-first to Mobile-first with Bootstrap - Mark Otto
Un cod (de regula JavaScript) ce suplineste o functionalitate indisponibila in browser-ul vizitatorului.
A nu se confunda cu widgets, care de fapt adauga functionalitati noi.
Exemple polyfills: Modernizr Wiki Exemplu widget: <input type="range"> - implementare jQuery Mobile
Un software ce a fost facut acum cativa ani si care este utilizat de clienti in mod activ nu poate fi rescris peste noapte si nici nu poate fi intrerupt pentru un upgrade major.
Un milestone reprezinta un capitol nou in viata unui software ce poate functiona in mod diferit fata de cele anterioare, care devin automat legacy.
Exemplu: Avangate Template Editor
Abilitatea unui browser de a recunoaste o functionalitate noua.
O seara minunata in continuare!
De retinut: Elementele si atributele noi simuleaza comportamentul unor widget-uri JavaScript populare.
Credits: Sergey Mavrody
Reguli de parsare a paginilor mult mai relaxate.
Atat <img src="test.jpg" /> cat si <img src="test.jpg"> sunt acceptate.
<article> <aside> <header> <nav> <footer> <section> <main> <summary> <details> <figure> <figcaption> <time> <datalist>
<canvas> <audio> <track> <video> <embed> <source>
<menu> <menuitem> <keygen> <mark> <meter> <progress> <rp> <rt> <ruby> <wbr> <bdi> <command> <output> <data>
email, number, search, url, range, date, time, tel, color
De retinut: Influenteaza comportamentul browserelor de pe dispozitivele mobile.
placeholder, pattern, required, autofocus, list, min, max, step
Urmeaza exemple de cod HTML5.
HTML4 / XHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
HTML5
<!DOCTYPE html>
<!DOCTYPE html> <html> <head> <title>Şerban Ghiţă</title> </head> <body> <p>HTML5 presentation</p> </body> </html>
<!DOCTYPE html> <html> <head> <!-- simple markup --> <meta charset="UTF-8" /> <title>Şerban Ghiţă</title> </head> <body> <p>HTML5 presentation</p> </body> </html>
<!-- Old markup for meta charset --> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Dispozitivele mobile sunt limitate de marimea fizica a ecranului, de marimea mainii utilizatorului si nu de rezolutie.
Proprietatea viewport a fost introdusa de Apple pentru iPhone, iPod si iPad. Chiar daca aceasta nu a fost inca standardizata de catre W3C, majoritatea producatorilor de browsere au adoptat-o.
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
De parcurs: Lista cu marimea viewport-ului pe diferite dispozitive mobile
Exemplu de pagina web cu si fara viewport.
<!-- Header-ul unei sectiuni de tip 'page', 'section', 'article' etc. --> <header> <!-- Meniul principal de navigare prin site. De obicei continut de 'header'. --> <nav> <!-- Continutul principal al paginii. --> <main> <!-- Delimiteaza un continut generic. --> <section> <!-- Contine un articol, blog post, stire, comentarii. --> <!-- Motoarele de cautare si parserele vor folosi continutul din interior independent de restul site-ului. --> <article> <!-- Structura ce are legatura cu tot ce se afla in vecinatatea ei. --> <aside> <!-- Footer-ul unei sectiuni de tip 'page', 'section', 'article' etc. --> <footer>
<body> <header><nav></nav></header> <main> <aside></aside> <article> <header></header> <p></p> <footer></footer> <article> </main> </footer></footer> </body>
<body> <!-- page header --> <header> <h1>My Blog</h1> <p>Last Modified: <span>2013-10-24</span></p> <!-- main nav --> <nav> <h1>Navigation</h1> <ul> <li><a href="index.html">Home</a></li> <li><a href="about.html">About me</a></li> <li><a href="projects.html">My projects</a></li> </ul> </nav> </header> <!-- page main content --> <main> <!-- aside related to articles --> <aside> <nav> <h1>My blogroll</h1> <ul> <li><a href="http://blog.first.com/">First Blog</a> <li><a href="http://blog.second.com/">Second Blog</a> </ul> </nav> </aside> <!-- featured article(s) --> <article> <!-- article's own header --> <header> <h1>My First Blog Post</h1> </header> <div> <p>Today I went to the beach and had a lot of fun.</p> <!-- aside related to the current article body. Eg: quote --> <aside> <h1>It was warm</h1> <p>The weather was exceptional that day!</p> </aside> ...more content... </div> <!-- article's own footer --> <footer> <p>Posted <time datetime="2013-10-23">Thursday</time>.</p> </footer> </article> ...more blog posts... </main> <!-- page footer --> <footer> <p>Copyright © <span>2013</span> <span>Serban Ghita</span></p> <p><a href="cookies.html">About cookies</a> <a href="policy.html">Privacy Policy</a> <a href="contact.html">Contact Us</a></p> </footer> </body>
<!--[if lte IE 8]> <script type="text/javascript"> var newTags = ['header', 'section', 'footer']; for(var i=0;i<newTags.length;i++){ document.createElement(newTags[i]); } </script> <style type="text/css"> header, section, footer { display:block; } </style> <![endif]-->
Este un set de atribute HTML ce se aplica peste elementele HTML existente in pagina pentru a da textului un inteles semantic specific. (ex. eveniment, review, produs, etc)
Este folosit de motoarele de cautare in afisarea rezultatelor dar si de parserele diverselor servicii social media.
Exista 3 scheme microdata, insa cel mai popular este schema.org.
schema.org reprezinta o colaborare dintre Google, Microsoft, and Yahoo! prin care se urmareste crearea unui vocabular comun pentru descrierea datelor dintr-o pagina web.
<div class="prezentare"> <span itemscope itemtype="http://schema.org/Event"> <img itemprop="image" src="/docs/en/events/techhub-logo-h70px.png" /> <p> <meta itemprop="startDate" content="2013-10-29T16:00">In data de Marti 2013-10-29 ora 16:00 o sa am la <span itemprop="location" itemscope itemtype="http://schema.org/Place"> <span itemprop="name">TechHub Bucuresti</span> </span>o prezentare numita " <span itemprop="name">HTML5 - De la site-uri mai performante la jocuri web multiplayer</span>". </p>
Testare microdata: Google Structured Data Testing Tool
Exemplu: Implementare microdata
Cum este aplicat la Google
Permite stocarea permanenta in browser a unor informatii de tip cheie:valoare sub forma de string.
Spatiu stocare: Chrome, Firefox, Opera - 5mb; IE - 10mb, BlackBerry 10 - 25mb
Spatiu stocare cookie: 4kb
window.localStorage // Set localStorage.setItem('name', 'Serban Ghita'); localStorage.setItem('position', JSON.stringify({x: 10, y: 10})); // Get localStorage.getItem('name'); JSON.parse(window.localStorage.getItem('position')); // Delete localStorage.removeItem('name');
Demo: live in browser
Compatibilitate: caniuse.com/localstorage
Modalitate de a stoca local, pe dispozitivul clasic sau mobil, fisiere necesare aplicatiei web (JavaScript, CSS, imagini, etc).
<html manifest="cache.appcache">
window.applicationCache
CACHE MANIFEST CACHE: # Desktop Version: 1.0.0.10 javascript/app.min.js css/app.min.css images/sprite.png NETWORK: *
Demo Offline Web App: Chess Web Application
Compatibilitate: caniuse.com/appcache
Sunt un fel de cronuri in browser. Rezolva task-uri in background fara sa blocheze interfata. Task-urile nu au acces la DOM si ruleaza "sandboxed".
var worker = new Worker('task.js'); worker.onmessage = function(e) { console.log(e.data); }; worker.postMessage('data');
De retinut: in JavaScript obiectele se paseaza prin referinta dar in interiorul unui worker obiectele sunt copiate. Este important ca dupa ce worker-ul isi termina treaba sa goliti datele din memorie.
Demo: live
Compatibilitate: caniuse.com/webworkers
Modalitate de a creea comunicatii persistente, in ambele sensuri intre aplicatia web si server.
Trebuie un server ce foloseste protocolul ws://. Ex.: node.js
var conn = new WebSocket("ws://server.com/chat"); conn.onmessage = function(msg) { msg = JSON.parse(msg); // decode JSON into object } conn.onclose = function() { } conn.send('Ce mai faci?');
Recomandare: folositi la inceput libraria Socket.io si servicii externe de server cu suport pentru Websockets.
Demo: Joc multiplayer
Compatibilitate: caniuse.com/websockets
Ofera posibilitatea de a gasi locatia corespunzatoare dispozitivului conectat (clasic sau mobil).
navigator.geolocation navigator.geolocation.getCurrentPosition() navigator.geolocation.watchPosition()
navigator.geolocation.getCurrentPosition(function(pos){ console.log(pos); });
Demo: implementare geolocatie cu Google Static Maps
Compatibilitate: caniuse.com/geolocation
window.addEventListener('deviceorientation', function(e) { console.log('deviceorientation', e.alpha, e.beta, e.gamma); }, false);
window.addEventListener('devicemotion', function(e){ console.log('devicemotion', e.acceleration, e.accelerationIncludingGravity); }, false);
window.addEventListener('orientationchange', function() { console.log('orientationchange', window.orientation); }, false);
window.addEventListener("resize", function() { console.log('resize: ', window.outerWidth, window.outerHeight); }, false);
Demo: local Chrome, remote iPad
Demo: HTML5Rocks.com
Evenimente JavaScript utile pentru interactiunea cu dispozitivele mobile.
var elem = document.getElementById('myPage'); elem.addEventListener("touchstart", handleStart, false); elem.addEventListener("touchend", handleEnd, false); elem.addEventListener("touchcancel", handleCancel, false); elem.addEventListener("touchleave", handleEnd, false); elem.addEventListener("touchmove", handleMove, false);
Demo: local Chrome, remote iPad
<audio src="audio.mp3" preload="auto" controls></audio>
<video src="movie.ogg" autoplay controls></video>
Folositi servicii externe de upload ca YouTube, SoundCloud, etc.
Recomandare: VideoJS
Demo: cum sa modificam elementele native din <audio> si <video>.
Demo remote
Powered by Google servers. Momentan API-ul este disponibil numai celor din Canada si USA.
Serviciul este gratis, il puteti activa din Google API Console.
<input type="text" x-webkit-speech />
Demo: local field test
Demo: Google Web Speech API
<canvas id="canvas"></canvas>
var layer = document.getElementById('canvas'), ctx = layer.getContext('2d');
Demos: Mozilla Demos
Referinta rapida: HTML5 Canvas Cheat Sheet
Specificatii complete cu poze: Dive Into HTML5 - Canvas
window.requestAnimationFrame
Alternativa pentru animatii la
window.setInterval window.setTimeout
Cum sa faci captura ecranului direct din browser.
Google+ foloseste o *tehnica similara pentru debugging si feedback.
Cum sa folosesti acest feature in productie? Iata o idee.
Creeaza capturi ale ecranului bazate pe informatia din pagina: HTML2Canvas
"Using HTML5 canvas Javascript to take screenshots": *StackOverflow
Cum sa faci capturi ale ecranului si sa le salvezi.
var imgString = canvas.toDataURL(); $.post("http://test.com/save/screenshot", {data: imgString});
Scallable Vector Graphics: Indiferent de rezolutie, imaginea este la fel de clara pentru ca este copusa din vectori.
Recomandare: folositi SVG in functie de context.
Sprite clasic:
background-image: url('sprite.png');
Sprite cu SVG:
background-image: url('sprite.svg');
Referinta: Resolution Independence With SVG
Deprecated, un fel de MySQL sau SQLlite in browser.
// Init the db. var db = openDatabase('mydb', '1.0', 'Serban Ghita database', 1024);
Demo WebSQL: Live
Compatibilitate: caniuse.com/websql, caniuse.com/indexeddb
Alternativa la WebSQL, un fel de NoSQL database in browser.
var db, request = window.indexedDB.open("mydb", 1);
Demo IndexedDB: Live
Compatibilitate: caniuse.com/websql, caniuse.com/indexeddb
20 min
Demo: live test
A trebuit sa alegem o solutie care sa fie disponibila implicit pentru vizitatori. Solutia trebuia sa fie usor de intretinut si compatibila cu iOS, Android OS si Windows Phone OS.
.v.2.0 - http://getbootstrap.com/2.3.2/
v.3.0 - http://getbootstrap.com
Beta, acum se numeste jQT - http://jqtjs.com
Castigatorul a fost jQuery Mobile - http://jquerymobile.com
Demo: remote
Jocul vine sub forma de aplicatie nativa pentru iOS si Android OS. Pentru dispozitivele clasice s-a folosit HTML5 canvas.