@-webkit-keyframes spin { from { -webkit-transform: rotateY(0); } to { -webkit-transform: rotateY(360deg); } }

=
HTML
+
CSS
+
JS
and it's OK
What HTML5 Can Do
Quotas, Databases, and Sandboxes
// use localStorage for persistent storage
// use sessionStorage for per tab storage
saveButton.addEventListener('click', function () {
window.localStorage.setItem('value', area.value);
window.localStorage.setItem('timestamp', (new Date()).getTime());
}, false);
textarea.value = window.localStorage.getItem('value');
Save text value on the client side (crash-safe)
// Request Status
webkitStorageInfo.queryUsageAndQuota(webkitStorageInfo.TEMPORARY, function(used, remaining) {
console.log("Used quota: " + used + ", remaining quota: " + remaining);
}
);
// Request Quota (only for File System API)
webkitStorageInfo.requestQuota(webkitStorageInfo.PERSISTENT, 10 * 1024 * 1024, function(used) {
console.log("Used quota: " + used + ", remaining quota: " + remaining);
}
);
| Default (Temporary) | Quota Requested (Persistent) | |
|---|---|---|
| Web Storage | 5Mb | N/A |
| App Cache | 10% of available disk in total Used: BytesRemaining: Bytes | |
| IndexedDB | ||
| WebSQL | ||
| File System API | Arbitrary in Bytes Used: Bytes |
<iframe src="demo_iframe_sandbox.htm" sandbox="allow-scripts"></iframe>
Web Workers and Notifications
var worker = new Worker('task.js');
worker.onmessage = function(event) { alert(event.data); };
worker.postMessage('data');
task.js:
self.onmessage = function(event) {
// Do some work.
self.postMessage("recv'd: " + event.data);
};
Loading Route...
if (window.webkitNotifications.checkPermission() == 0) {
// you can pass any url as a parameter
window.webkitNotifications.createNotification(tweet.picture, tweet.title,
tweet.text).show();
} else {
window.webkitNotifications.requestPermission();
}
Note: Use this button if you also want to reset the permissions
Enter your twitter user name to show your last tweet as a notification
File Manipulation and Geolocation
document.addEventListener('dragstart', function(event) {
event.dataTransfer.setData('text', 'Customized text');
event.dataTransfer.effectAllowed = 'copy';
}, false);

document.querySelector('#dropzone').addEventListener('drop', function(e) {
var reader = new FileReader();
reader.onload = function(evt) {
document.querySelector('img').src = evt.target.result;
};
reader.readAsDataURL(e.dataTransfer.files[0]);
}, false);
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
var latLng = new google.maps.LatLng(
position.coords.latitude, position.coords.longitude);
var marker = new google.maps.Marker({position: latLng, map: map});
map.setCenter(latLng);
}, errorHandler);
}
window.addEventListener('deviceorientation', function(event) {
var a = event.alpha;
var b = event.beta;
var g = event.gamma;
}, false);
This sample requires FF3.6+ or Google Chrome on a device with a built in accelerometer or iOS 4.2.




<input type="text" x-webkit-speech />
Speech input is not enabled in your browser.
Try running Google Chrome with the --enable-speech-input flag.
More meaningful elements
<body>
<header>
<hgroup>
<h1>Page title</h1>
<h2>Page subtitle</h2>
</hgroup>
</header>
<nav>
<ul>
Navigation...
</ul>
</nav>
<section>
<article>
<header>
<h1>Title</h1>
</header>
<section>
Content...
</section>
</article>
<article>
<header>
<h1>Title</h1>
</header>
<section>
Content...
</section>
</article>
</section>
<aside>
Top links...
</aside>
<figure>
<img src="..."/>
<figcaption>Chart 1.1</figcaption>
</figure>
<footer>
Copyright ©
<time datetime="2010-11-08">2010</time>.
</footer>
</body>
<input list="libraries"/> <datalist id="libraries"> <option value="Bruno"/> <option value="Gorgas"/> <option value="Hoole"/> <option value="McLure"/> <option value="Rodgers"/> </datalist> <menu> <command type="command" disabled label="Publish" /> </menu> <details> <summary>HTML 5</summary> This slide deck teaches you everything you need to know about HTML 5. </details>HTML 5
This slide deck teaches you everything you need to know about HTML 5.
<meter min="0" max="100" low="40" high="90" optimum="100" value="91">A+</meter> Your score is:A+
<progress>working...</progress> Download is:
<progress value="75" max="100">3/4 complete</progress> Goal is:
<style>
[required] {
border-color: #88a;
-webkit-box-shadow: 0 0 3px rgba(0, 0, 255, .5);
}
:invalid {
border-color: #e88;
-webkit-box-shadow: 0 0 5px rgba(255, 0, 0, .8);
}
</style>
<input type="text" required />
<input type="email" value="some@email.com" />
<input type="date" min="2010-08-14" max="2011-08-14" value="2010-08-14"/>
<input type="range" min="0" max="50" value="10" />
<input type="tel" placeholder="(555) 555-5555"
pattern="^\(?\d{3}\)?[-\s]\d{3}[-\s]\d{4}.*?$" />
<input type="color" placeholder="e.g. #bbbbbb" />
<input type="number" step="1" min="-5" max="10" value="0" />
HTML Form field types on mobile
type="text"
Android Device
type="number"
Android Device
type="email"
iPhone Device
type="tel"
iPhone Device
Graphics / Multimedia
2D & 3D
HTML Audio + Video
<audio id="audio" src="sound.mp3" controls></audio>
<video id="video" src="movie.webm" autoplay controls></video>
HTML JS Canvas 2D
HTML JS Canvas 3D (WebGL)
<canvas id="canvas" width="838" height="220"></canvas>
<script>
var gl = document.getElementById("canvas").getContext("experimental-webgl");
gl.viewport(0, 0, canvas.width, canvas.height);
...
</script>
CSS3
Presentation & Styling
CSS Columns
-webkit-column-count: 2;
-webkit-column-rule: 1px solid #bbb;
-webkit-column-gap: 2em;
In March 1936, an unusual confluence of forces occurred in
Santa Clara County.
A long cold winter delayed the blossoming of the millions of
cherry, apricot, peach, and prune plum trees covering hundreds
of square miles of the Valley floor. Then, unlike many years,
the rains that followed were light and too early to knock
the blossoms from their branches.
Instead, by the billions, they all burst open at once.
Seemingly overnight, the ocean of green that was the Valley
turned into a low, soft, dizzyingly perfumed cloud of pink
and white. Uncounted bees and yellow jackets, newly born,
raced out of their hives and holes, overwhelmed by this
impossible banquet.
Then came the wind.
It roared off the Pacific Ocean, through the nearly
uninhabited passes of the Santa Cruz Mountains and then,
flattening out, poured down into the great alluvial plains
of the Valley. A tidal bore of warm air, it tore along the
columns of trees, ripped the blossoms apart and carried them
off in a fluttering flood of petals like foam rolling up a
beach.
This perfumed blizzard hit Stevens Creek Boulevard, a two-lane
road with a streetcar line down its center, that was the main
road in the West Valley. It froze traffic, as drivers found
themselves lost in a soft, muted whiteout. Only the streetcar,
its path predetermined, passed on...
CSS Gradients
background-image: linear-gradient(top, #00abeb 0%, #fff 50%,
#66cc00 50%, #fff 100%);
background-image: radial-gradient(center, circle cover, red, #000 40%);
CSS Shadows
text-shadow:
rgba(64, 64, 64, 0.5)
0px
0px
0px;
box-shadow:
rgba(0, 0, 128, 0.25)
0px
0px
0px;
Internet Librarian
CSS Reflections
text-shadow: rgba(0, 0, 0, 0.5) 0 0px 0px;
background:
-webkit-gradient(linear, left top, left bottom,
from(rgba(200, 200, 240, 0)), to(rgba(255, 255, 255, 0)));
border-radius: 0px;
-webkit-box-reflect: below 10px
-webkit-gradient(linear, left top, left bottom,
from(transparent), to(rgba(255, 255, 255, 0)));
HTML5 is awesome!
CSS Transitions
#box.left {
margin-left: 0;
}
#box.right {
margin-left: 1000px;
}
document.getElementById('box').className = 'left';
document.getElementById('box').className = 'right';
#box {
-webkit-transition: margin-left 1s ease-in-out;
}
document.getElementById('box').className = 'left';
document.getElementById('box').className = 'right';
CSS Transforms
Hover over me:
-webkit-transform: rotateY(45deg);
-webkit-transform: scaleX(25deg);
-webkit-transform: translate3d(0, 0, 90deg);
-webkit-transform: perspective(500px)
#threed-example {
-webkit-transform: rotateZ(5deg);
-webkit-transition: -webkit-transform 2s ease-in-out;
}
#threed-example:hover {
-webkit-transform: rotateZ(-5deg);
}
Now press 3!
CSS Animations
@-webkit-keyframes spin {
from {
-webkit-transform: rotateY(0);
}
to {
-webkit-transform: rotateY(360deg);
}
}
div {
padding-right:50px;
-webkit-transform-style: preserve-3d;
-webkit-animation-name: spin;
-webkit-animation-duration: 10s;
-webkit-animation-iteration-count: infinite;
-webkit-animation-timing-function: linear;
}
Data Visualization
- Processingjs.org
- Companion project to Processing visual language
- Sigmajs.org
- Relies on HTML5 Canvas element
- Arborjs.org
- Uses web workers and jQuery
- Paperjs.org
- Vector graphics scripting framework running on Canvas
HTML5 in Our Library
- Simple Example: Podcasts
- Information literacy instructional series
- Uses HTML5 "audio" tag
- Not So Simple: Mobile Web Site
- University of Alabama Libraries
- Uses open source jQuery Mobile framework
- Key component in upcoming redesign
Promise
Evaluating HTML5's potential
The Possibilities
- Eliminates the need for native applications
- Reduces resource investment
- Speeds up mobile development
- Replicates desktop functionality in the browser
- File handling and database interaction
- Local data storage and offline capabilities
... And There's More!
- Powerful alternative to Flash
- "Flash is dead. Long live HTML5."
- ZDNet article on Adobe's move to HTML5 for mobile video
- Adobe's Edge tools for HTML5
- Edge Animate and Inspect
- Phone Gap and Web Fonts
- Flash vs. HTML5 - FIGHT!
Responsive Design
- What is responsive design?
- HTML5 is the cornerstone of many associated frameworks
- HTML5 Boilerplate
- Includes jQuery and Modernizr libraries
- Normalize.css
- Analytics support and Apache optimization
- Creating a Mobile-First Responsive Web Design
Pitfalls
There's always a downside
Browser Compatibility
- Desktop Browsers
- Limitations and Idiosyncracies
- Internet Explorer < 10 and pretty much everything
- Firefox and media files
- How to determine your browser's HTML5 support?
- Webkit Mobile Browsers
- Resolutions and Workarounds
Web Statistics
Chrome Frame
- Minimal effort for bringing IE7, 8 and 9 up to the latest HTML5 technologies
- Two ways to get your websites ready for Chrome Frame:
Client side:
<meta http-equiv="X-UA-Compatible" content="chrome=1">
Server side:
X-UA-Compatible: chrome=1
Accessibility
- New HTML5 semantics (article, aside, footer, etc.)
- Accessible Rich Internet Applications (ARIA) attributes still needed
- Browser support varies
Security
- "The Geography of HTML5 Security"
- Cross-Origin Resource Sharing (CORS)
- iFrame Sandboxing
- Browser-Based Storage
- HTML5 Security Cheatsheets
- html5sec.org
- html5security
- Open Web Application Security Project
Conclusion
All good things
Resources
- HTML5 Rocks
- Extensive HTML5 information
- Slides, articles, tips, etc.
- HTML5 Boilerplate
- W3 Schools
- Traditional, encyclopedic resource
- Code Academy
- Gamified approach to learning JavaScript