html 5 workshopwebdb/indexeddb webworkers websockets rgraph protovis tools to help fun introduction....

Post on 28-Sep-2020

6 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

BRIAN SLETTEN

HTML 5 WORKSHOPBRIAN@BOSATSU.NET

Speaker Qualifications18 Years Experience

Specialize in benefits and applicability of next-generation technologies

Author “Resource-Oriented Architectures : Building Webs of Data” Addison-Wesley 2011

Contributer to “Beautiful Architecture”

AgendaIntroduction

New Elements

EditableContent

Drag and Drop

Canvas

Video

Geolocation

Storage

Offline Handling

WebDB/IndexedDB

WebWorkers

WebSockets

RGraph

Protovis

Tools to Help

Fun

Introduction

HTML 4, XHTML, DOM Level 2

HTML 4 W3C Recommendation since 1997

XHTML1 Provides XML Serialization

DOM Level 2 JavaScript APIs

HTML and XHTML 2

W3C wanted to reboot around a new extensible language

XHTML 2 was not backward-compatible

WHAT WG

Apple, Opera and Mozilla started working on HTML 5

Demanded backward-compatibility

More details to reduce variability in implementation

W3C killed XHTML 2 and joined HTML 5 effort

HTML 5

A Single Language w/ Two Syntaxes

HTML

XHTML

Detailed processing model

Improved document markup

New support for Web applications

IS HTML5 READY YET?

http://ishtml5readyyet.com

HTML 5 Timeline

2007 2009 2011

2012

2015 2019

2020

2022

1ST

W3C

W

ORK

ING

DRA

FT

LAST

CAL

LW

ORK

ING

DRA

FT

CALL

FO

R CO

NTRI

BUTI

ONS

TO T

EST

SUIT

ECA

NDID

ATE

RECO

MM

ENDA

TIO

N1S

T TE

ST

SUIT

E DR

AFT

2ND

TEST

SU

ITE

DRAF

T

FINA

L TE

ST

SUIT

E DR

AFT

REIS

SUED

LAS

T CA

LLW

ORK

ING

DRA

FT

PRO

POSE

DRE

COM

MEN

DATI

ON

HTTP://9ELEMENTS.COM/IO/PROJECTS/HTML5/CANVAS/

Some demos...HTTP://WWW.APPLE.COM/HTML5/SHOWCASE/GALLERY/

HTTP://IE.MICROSOFT.COM/TESTDRIVE/

HTTP://HTML5.LABS.AP.ORG/

New Elements

Triggers “Standards Mode” in browsers

Not necessary for XHTML

<!doctype html>...

DocType

HTTP://WWW.ALISTAPART.COM/ARTICLES/PREVIEWOFHTML5

Moving Beyond <div><!doctype html><html lang="en"> <head> <title>NFJS Milwaukee</title> </head> <body> <section> <h1>Friday</h1> ... </section> <section> <h1>Saturday</h1> ... </section> <section> <h1>Sunday</h1> ... </section> </body></html>

<!doctype html><html lang="en"> <head> <title>My Blog</title> </head> <body>

<section><article>

<section> <h1>Paperclips</h1> </section> <section> <h1>Low-Talkers</h1> </section> <section> <h1>French Fries</h1> </section>

</article></section>

</body></html>

<header> ElementIntroductory portion of a section to include titles, table of contents, logos, etc.

<!doctype html><html lang="en"> <head> <title>NFJS Milwaukee</title> </head> <body> <section>

<header> <h1>Friday</h1>

</header> ... </section> </body></html>

<hgroup> ElementGroups of headers

<!doctype html><html lang="en"> <head> <title>Ted Neward</title> </head> <body> <section>

<header><hgroup>

<h1>Theodore J. Neward</h1><h2>The Dude</h2>

</hgroup></header>

... </section> </body></html>

<footer> ElementIndicates information related to surrounding section

<!doctype html><html lang="en"> <head> <title>NFJS Milwaukee</title> </head> <body> <section>

<header> <h1>Friday</h1>

</header> ...

<footer>© Copyright 2010 J. Zimmermann

</footer> </section> </body></html>

<nav> ElementSemantically-marked navigation section either in or outside of the document

<!doctype html><html lang="en"> <head> <title>NFJS Milwaukee</title> </head> <body>

<header><nav>

<ul><li><a href=”#Friday”>Friday</a></li><li><a href=”#Saturday”>Saturday</a></li><li><a href=”#Sunday”>Sunday</a></li>

</ul></nav>

</header>...

</body></html>

<aside> ElementTangential content that supports but is not required for the content

<!doctype html><html lang="en"> <head> <title>NFJS Milwaukee</title> </head> <body> <aside>

<header>“NFJS is the most fun since CS 101!”- John Q. Attendee

</header> </aside>

... </body></html>

<figure> and <figcaption> Elements

Essential content that can be moved around

Images

Videos

Graphs

Code Samples

HTTP://WWW.ALISTAPART.COM/ARTICLES/PREVIEWOFHTML5

Generate Outlines

HTTP://GSNEDDERS.HTML5.ORG/OUTLINER/

<progress> ElementIndicate the status of another task

<section> <h2>Task Progress</h2> <p>Progress: <progress id="p" max=100><span>0</span>%</progress></p> <script> var progressBar = document.getElementById('p'); function updateProgress(newValue) { progressBar.value = newValue; progressBar.getElementsByTagName('span')[0].textContent = newValue; } </script></section> HTTP://HTML5-NOW.APPSPOT.COM/PROGRESS.HTML

<meter> ElementRepresents a scalar measurement within a known range

<meter>32%</meter>

<meter>7/10</meter>

<meter value=”12” min=”0” max=”50” low=”15” high=”47” optimum=”30”/>

HTTP://HTML5-NOW.APPSPOT.COM/METER.HTML

Alternate Renderings

<p><meter value="0.5">Moderate activity,</meter> Usenet, 618 subscribers</p><p><meter value="0.25">Low activity,</meter> Usenet, 22 subscribers</p><p><meter value="0.25">Low activity,</meter> Usenet, 66 subscribers</p>

Alternate Renderings<dl>  <dt>Target</dt>  <dd><meter min="145" value="145" title="pounds">£145</meter></dd>  <dt>Amount raised so far</dt>  <dd><meter min="0" max="1000" low="50" high="125" value="145" optimum="145" title="pounds">£145</meter></dd></dl>

HTTP://HTML5DOCTOR.COM/MEASURE-UP-WITH-THE-METER-TAG/

<time> ElementSpecifies a specific 24-hour time or “a precise date in the proleptic Gregorian Calendar”

<p>Scott Davis asked me to meet him at <time>16:30</time>.</p>

Scott Davis asked me to meet him at 16:30.

Scott Davis asked me to meet him at 4:30PM.

<time> Element + date<p>I was married on <time datetime=”2003-06-14”> June 14, 2003<time>.</p>

time.valueAsDate

Date Time Interpretation

✓ Midnight UTC on date

✓ Time on 1970-01-01 UTC TZ

✓ ✓ Time/Date w/ TZ Offset

Null

<time> + pubdate

<!doctype html><html lang="en"> <head> <title>NFJS Milwaukee</title> </head> <body> <article>

<header> <h1>Friday</h1>

<p>Published on <time datetime=”2010-02-25” pubdate>Thursday</time></p>

</header> ... </article> </body></html>

<details> ElementAllow more details to be available on a topic

<details> <dt>This is what you see</dt> <dd>This is what you will see</dd></details>

<details open> <dt>This is what you see</dt> <dd>This is what you will see</dd></details>

HTTP://HTML5-NOW.APPSPOT.COM/DETAILS.HTML

HTTP://WWW.SMASHINGMAGAZINE.COM/2009/08/04/DESIGNING-A-HTML-5-LAYOUT-FROM-SCRATCH/

New <input> Element Attributes

tel

search

url

email

datetime

date

month

week

time

number

range

color

HTTP://HTML5-NOW.APPSPOT.COM/INPUT.HTML

<script src="http://html5-now.appspot.com/base2-legacy.js"></script> <script src="http://html5-now.appspot.com/html5-now.js"></script>

Input Elements

<input name="somename" type="sometype" value="">

Editable Content

<ul contenteditable="true"> <li>First</li> <li>Second</li> <li>Third</li></ul>

ContentEditable

Drag and Drop

<ul> <li draggable=”true”>First</li> <li draggable=”true”>Second</li> <li draggable=”true”>Third</li></ul>

Drag and Drop

// DragStartevent.dataTransfer.setData('Text', <value>);

// DragEndvar value = event.dataTransfer.getData('Text');

var dragItems = document.querySelectorAll('[draggable=true]');

for (var i = 0; i < dragItems.length; i++) { addEvent(dragItems[i], 'dragstart', function (event) { event.dataTransfer.setData('Text', <value>); return false; });}

Drag Start

addEvent(drop, 'drop', function (event) {// stops the browser from redirecting off to the text.

if (event.preventDefault) event.preventDefault();

var value = event.dataTransfer.getData('Text');

// Do something with the value

return false;});

Drop

function cancel(e) { if (e.preventDefault) { e.preventDefault(); } return false;}

addEvent(drop, 'dragover', cancel);addEvent(drop, 'dragenter', cancel);

Drag Events

More DnD Demos

http://html5demos.com/drag-anything

http://shapeshed.com/examples/drag-and-drop/

Canvas

<canvas> Element

Resolution-dependent bitmap drawing element

History in OS X Dashboard and Safari

Scripting interface

Currently supports 2D Rendering Context

HTTPS://DEVELOPER.MOZILLA.ORG/EN/CANVAS_TUTORIAL

Basic Usage

<canvas id=”drawing” width=”200” height=”200”/>

var canvas = document.getElementById("drawing"); var ctx = canvas.getContext("2d");

HTTP://DEV.W3.ORG/HTML5/CANVAS-API/CANVAS-2D-API.HTML

Coordinate System

<!doctype html><html> <!-- Taken from http://developer.mozilla.org/en/Drawing_Graphics_with_Canvas --> <head> <script type="application/javascript">function draw() { var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d");

ctx.fillStyle = "rgb(200,0,0)"; ctx.fillRect (10, 10, 55, 50);

ctx.fillStyle = "rgba(0, 0, 200, 0.5)"; ctx.fillRect (30, 30, 55, 50);} </script> </head> <body onload="draw()"> <canvas id="canvas" width="300" height="300"/> </body></html>

// Taken from: https://developer.mozilla.org/samples/canvas-tutorial/2_2_canvas_moveto.htmlfunction drawShape(){ // get the canvas element using the DOM var canvas = document.getElementById('tutorial');

// Make sure we don't execute when canvas isn't supported if (canvas.getContext){

// use getContext to use the canvas for drawing var ctx = canvas.getContext('2d');

// Draw shapes ctx.beginPath(); ctx.arc(75,75,50,0,Math.PI*2,true); // Outer circle ctx.moveTo(110,75); ctx.arc(75,75,35,0,Math.PI,false); // Mouth ctx.moveTo(65,65); ctx.arc(60,65,5,0,Math.PI*2,true); // Left eye ctx.moveTo(95,65); ctx.arc(90,65,5,0,Math.PI*2,true); // Right eye ctx.stroke();

} else { alert('You need Safari or Firefox 1.5+ to see this demo.'); }}

RADIANS, NOTDEGREES!

function drawShape(){ // get the canvas element using the DOM var canvas = document.getElementById('tutorial');

// Make sure we don't execute when canvas isn't supported if (canvas.getContext){

// use getContext to use the canvas for drawing var ctx = canvas.getContext('2d');

// Draw shapes

ctx.beginPath(); ctx.moveTo(75,40); ctx.bezierCurveTo(75,37,70,25,50,25); ctx.bezierCurveTo(20,25,20,62.5,20,62.5); ctx.bezierCurveTo(20,80,40,102,75,120); ctx.bezierCurveTo(110,102,130,80,130,62.5); ctx.bezierCurveTo(130,62.5,130,25,100,25); ctx.bezierCurveTo(85,25,75,37,75,40); ctx.fill();

} else { alert('You need Safari or Firefox 1.5+ to see this demo.'); }}

function draw() { var ctx = document.getElementById('canvas').getContext('2d'); var img = new Image(); img.src = 'images/backdrop.png'; img.onload = function(){ ctx.drawImage(img,0,0); ctx.beginPath(); ctx.moveTo(30,96); ctx.lineTo(70,66); ctx.lineTo(103,76); ctx.lineTo(170,15); ctx.stroke(); }}

function draw() { var ctx = document.getElementById('canvas').getContext('2d'); ctx.drawImage(document.getElementById('source'),33,71,104,124,21,20,87,104); ctx.drawImage(document.getElementById('frame'),0,0);}

HTTP://HTML5DEMOS.COM/CANVAS

HTTP://CODE.EDSPENCER.NET/BEAN/INDEX.HTML

HTTP://WWW.CHROMEEXPERIMENTS.COM/DETAIL/BALL-POOL/

HTTP://CANVASDEMOS.COM

HTTP://HTML5TUTORIAL.NET/EXAMPLES/HTML-5-CANVAS-CHEAT-SHEET.HTML

HTTP://WINDOWS7NEWS.COM/2010/06/24/MICROSOFT-CONFIRMS-FEATURES-FOR-IE9-CANVAS-AND-VIDEO-TAGS/

<body onload=”draw()”><canvas id="canvas" width="150" height="150"></canvas>...

</body>

Canvas

<script> function draw() { var ctx = document.getElementById('canvas').getContext('2d'); // Use ctx }</script>

var ctx = document.getElementById('canvas').getContext('2d');var img = new Image();img.src = 'file.png';img.onload = function(){ ctx.drawImage(img,0,0); // Use the ctx to draw *ON* the image

}

Drawing Images

// Create a circular clipping path ctx.beginPath();ctx.arc(0,0,60,0,Math.PI*2,true);ctx.clip();

Clipping Paths

ctx.globalCompositeOperation = <compositionop>;

Composition Operations

setInterval(function, duration);

Animation

Video

Apple does not support Flash because it is so buggy, he says. Whenever a Mac crashes more often than not it’s because of Flash. No one will be using Flash, he says. The world is moving to HTML5.

HTTP://SIMONWEBDESIGN.COM/STEVE-JOBS-HTML5-WILL-KILL-FLASH/

Codec HellThe current situation is as follows:

Apple refuses to implement Ogg Theora in Quicktime by default (as used by Safari), citing lack of hardware support and an uncertain patent landscape.

Google has implemented H.264 and Ogg Theora in Chrome, but cannot provide the H.264 codec license to third-party distributors of Chromium, and have indicated a belief that Ogg Theora's quality-per-bit is not yet suitable for the volume handled by YouTube.

Opera refuses to implement H.264, citing the obscene cost of the relevant patent licenses.

Mozilla refuses to implement H.264, as they would not be able to obtain a license that covers their downstream distributors.

Microsoft has not commented on their intent to support <video> at all.

HTTP://LISTS.WHATWG.ORG/PIPERMAIL/WHATWG-WHATWG.ORG/2009-JUNE/020620.HTML

HTTP://X264DEV.MULTIMEDIA.CX/?P=377

“Summary for the Lazy”

VP8

Spec

Encoding

Decoding

Patent-Free

TERRIBLE, CAN (NEEDS TO BE!) IMPROVED

~XVID AND VC-1

SLOWER THAN FFMPEG’S H.264

UHM....

<audio> Element

HTTP://HTML5DOCTOR.COM/NATIVE-AUDIO-IN-THE-BROWSER/

Browser Ogg MP3 WAV

FF 3.5 ✓ ✓Safari 4 ✓ ✓

Chrome 3 ✓ ✓Opera 10 ✓

Basic <audio> Usage

<audio src=”somefile.ogg” autobuffer controls/>

<audio src=”somefile.ogg” autoplay controls/>

<audio controls><source src=”somefile.ogg”/><source src=”somefile.mp3”/><!-- Fallback on Flash? -->

</audio>

<video> Element

Support from YouTube, Daily Motion and Vimeo

Sublime Video Player!

HTTP://JILION.COM/SUBLIME/VIDEO

Basic <video> Usage

<video src=”somemovie.ogg” controls/>

<video controls><source src=”somemovie.ogg” type=”video/ogg”/><source src=”somemovie.mp4”/> <object data="somemovie.swf"  type="application/x-shockwave-flash">        <param value="somemovie.swf" name="movie"/>      </object>  

</video>

HTTP://HTMLFIVE.APPSPOT.COM/STATIC/VIDEO.HTML

<video id="v1" src="../media/billyBrowsers.ogg" controls></video></div>"<div style="text-align: center;"> <button onclick="document.getElementById('v1').play()">Play</button> <button onclick="document.getElementById('v1').pause()">Pause</button> <button onclick="document.getElementById('v1').volume += 0.25">Volume Up</button> <button onclick="document.getElementById('v1').volume -= 0.25">Volume Down</button> <button onclick="document.getElementById('v1').muted = true;">Mute</button> <button onclick="document.getElementById('v1').muted = false">Unmute</button> <button onclick="rotateMePlease();">Start Rotate</button> <button onclick="int=window.clearInterval(int)">Stop Rotate</button></div>

HTTP://PEOPLE.MOZILLA.COM/~PROUGET/DEMOS/DYNAMICCONTENTINJECTION/

HTTP://WWW.CHROMEEXPERIMENTS.COM/DETAIL/DESTRUCTIVE-VIDEO/

Some video demos...HTTP://JILION.COM/SUBLIME/VIDEO

HTTP://WWW.CHROMEEXPERIMENTS.COM/DETAIL/DESTRUCTIVE-VIDEO/

HTTP://PEOPLE.MOZILLA.COM/~PROUGET/DEMOS/DYNAMICCONTENTINJECTION/

<video id="videoname"> <source src="file.mp4" /> <source src="file.ogv" /></video>

Video

Geolocation

Geolocation APIScripting API for retrieving WGS84 location information for the hosting device

From http://dev.w3.org/geo/api/spec-source.html:

“A conforming implementation of this specification must provide a mechanism that protects the user's privacy and this mechanism should ensure that no location information is made available through this API without the user's express permission.”

if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(success, error);} else { error('not supported');}

Geoposition

function success(position) {

// Use position.coords.latitude and // position.coords.longitude}

Storage

var storage = window[‘localStorage’];

var item = storage.getItem(‘value’);

storage.setItem(‘value’, newValue);

Storage

OfflineHandling

HTTP://HTMLFIVE.APPSPOT.COM/STATIC/STICKIES.HTML

Offline ApplicationsCreate an application cache manifest

<html manifest="http://htmlfive.appspot.com/cache.manifest">...</html>

CACHE MANIFEST/static/stickies.html/media/deleteButton.png/media/deleteButtonPressed.png/css/stickies.css/js/stickies.js

Offline Detection

function online(event) { status.className = navigator.onLine ? 'online' : 'offline'; status.innerHTML = navigator.onLine ? 'online' : 'offline'; state.innerHTML += '<li>New event: ' + event.type + '</li>';}

addEvent(window, 'online', online);addEvent(window, 'offline', online);online({ type: 'ready' });

WebWorkers

var w = new Worker(‘some.js’);

w.onmessage = function (event) { // Do something w/ the event}

WebWorker

// In some.js// Do stuffpostMessage(someValue);

WebSockets

WebSocket Events

Event Description

onopen Socket opened

onmessage Message received

onclose Socket closed

var socket = new WebSocket(“ws://server:8000/some/location”)

socket.onopen = function() { // Do something}

socket.onmessage = function(message) { // Do something with the message}

socket.onclose = function() { // Do something to clean up}

RGraph

RGraph

Cross browser support

Online/offline support

Several base graphs

Interactive

Protovis

Protovis

Non-<canvas> based

Uses JavaScript and SVG

Declarative and Data-Driven

Tools to Help

HTML Shiv

HTTP://REMYSHARP.COM/2009/01/07/HTML5-ENABLING-SCRIPT/

HTML5-now

HTTP://HTML5-NOW.APPSPOT.COM/

Modernizr

Cross-browser capability detection framework

Adds classes to HTML elements to target specific browser functionality

http://html5test.com

http://caniuse.com

Other LinksHTTP://HTML5GALLERY.COM/

HTTP://WOORKUP.COM/2009/12/16/HTML5-VISUAL-CHEAT-SHEET-RELOADED/

HTTP://SECLAB.STANFORD.EDU/WEBSEC/FRAMEBUSTING/FRAMEBUST.PDF

HTTP://WWW.BEAKKON.COM/TUTORIAL/HTML5/DESKTOP-NOTIFICATION

HTTP://WWW.HTML5SAMPLES.COM/

Fun

Arcade Fire: The Wilderness Downtown

HTTP://WWW.THEWILDERNESSDOWNTOWN.COM/

Juicy Drop

HTTP://WWW.NIHILOGIC.DK/LABS/JUICYDROP/

Torus

HTTP://WWW.BENJOFFE.COM/CODE/GAMES/TORUS/

Kaleidoscope

HTTP://WWW.CHIPTUNE.COM/KALEIDOSCOPE/

Mesmerizer

HTTP://DANFORYS.COM/MESMERIZER/

Spread

HTTP://TOMTHEISEN.COM/SPREAD/

Small Talk

HTTP://SMALLTALKAPP.COM

Resource Link

HTML 5 Logo http://www.w3.org/html/logo/

Daibatsu Picture http://www.flickr.com/photos/lightmatter/2315510261/

HTML 5 Spec http://dev.w3.org/html5/spec/Overview.html

HTML 4/5 Differences

http://dev.w3.org/html5/html4-differences/

HTML 5 Doctor http://html5doctor.com

HTML 5 Demos http://html5demos.com/

WebSockets http://dev.w3.org/html5/websockets/

WebWorkers http://www.whatwg.org/specs/web-workers/current-work/

WHAT WG Blog http://blog.whatwg.org

BRIAN@BOSATSU.NET

QUESTIONS?HTTP://TWITTER.COM/BSLETTEN

top related