HTML5 danes

prihodnost spletnih aplikacij

O meni
  • (spletni) programer
  • lastnik podjetja Vizius (vizius.si)
  • delam za podjetje Xlab d.o.o.
  • www.php-si.com - masticore
  • mitja@vizius.si
O predstavitvi
  • code.google.com/p/html5-slides
  • slides.html5rocks.com
  • nudi "framework"
  • omogoča interaktivnost
Agenda
  • Zgodovina
  • HTML
  • CSS
  • JS APIs
  • Danes
  • Prihodnost
  • Viri

Zgodovina

Mejniki
  • 1991 HTML
  • 1996 CSS 1 + JavaScript (Netscape)
  • 1997 HTML4
  • 1998 CSS2
  • 1999 XMLHTTP (Microsoft)
  • 2000 XHTML1
  • 2004 Gmail
  • 2005 Ajax povsod (Google Maps)
  • 2009 HTML 5
Pregled
  • Predlog se je razdelil na več manjših
    (WebSocket, Geolocation, ...)
  • V industriji "HTML5" opisuje skupek vseh
  • 300% pohitritev JavaScript-a
    (V8, TraceMonkey, Carakan)
  • Vedno večja moč brskalnika
  • Trenutno prehodno obdobje
  • Google Chrome Frame
HTML + CSS + JS APIs

HTML

HTML
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>HTML 5</title>
    <link rel="stylesheet" href="html5.css" />
  </head>
...
  • Risanje (Canvas, SVG, WebGL)
  • Multimedija (Audio, Video)
  • Semantic tags
  • Obrazci
  • Microdata
HTML

Canvas

var context = $("#canvas")[0].getContext("2d");
function onMouseDown(evt) {
  var offset = $("#canvas").offset();  
  var x = Math.floor(evt.pageX - offset.left); 
  var y = Math.floor(evt.pageY - offset.top)

  if (!draw) {
    context.beginPath();
    context.moveTo(x, y);
    draw = true;
  } else {
    context.lineTo(x, y);
    context.stroke();
  }
}
HTML

SVG

Raphaël—JavaScript Library "vector graphics on the web"


window.onload = function () {
    var r = Raphael("svg-holder");
    var pie = r.g.piechart(320, 240, 100, [55, 20, 13, 32, 5, 1, 2, 10],
        {legend: ["%%.%% – Enterprise Users", "IE Users"], legendpos: "west"});
};
HTML

Video

<video id="clip" src='movie.mp4' autoplay controls></video>
document.getElementById("clip").play();
document.getElementById("clip").volume = 0;

HTML

Semantic tags

<header>
    <hgroup>
        <h2>Just a test </h2>
    </hgroup>
</header>

<nav>
    <ul>
        <li><a href="/">Home</a></li>
        <li><a href="/PHP">PHP</a></li>
    </ul>
</nav>

<article>
    <header>
        <h1>
            <a href="/article/html5" title="HTML5 danes" 
              rel="bookmark">HTML5 danes</a>
        </h1>
    </header>
    <p>Vsebina</p>
</article>

<footer>
    <p>mitja@vizius.si</p>
</footer>
HTML

Obrazci

Vmesnik

<input type='range' min='0' max='50' value='0' /> 
<input results='10' type='search' /> 
<input type='text' placeholder='Uporabniško ime' /> 

Validacija

<style> :invalid { background-color: red; } </style>
<input type='date' />  (samo v Operi)
<input type='color' /> 
<input type='number' /> 
<input type='email' /> 

CSS

CSS
  • Selectors
  • Rounded corners
  • Font support
  • Text wrapping
  • Opacity
  • Shadows
  • Transitions
  • Transforms
  • Animations
CSS

Selectors

Selectors

.row:nth-child(even) {
  background: #dde;
}
.row:nth-child(odd) {
  background: white;
}
Row 1
Row 2
Row 3
Row 4

Negation

:not(.box) {
  color: #00c; 
}            
:not(span) {
  display: block; 
}

More specific targetting

h2:first-child { ... }
                    
div.text > div { ... } 
h2 + header { ... }
CSS

Animations

@-webkit-keyframes fading {
  from {
    opacity: 0.0;
    font-size: 100%;
  }
  to {
    opacity: 1.0;
    font-size: 200%;
  }
}

div {
  -webkit-animation-name: fading;
  -webkit-animation-duration: 2s;
  -webkit-animation-iteration-count: infinite;
}
PHP
CSS

Rounded corners

border-radius: 0px; 
PHP

JS APIs

JS APIs
  • Selectors
  • Cache Api
  • File Api
  • Geolocation
  • Notification
  • Web Sockets
  • Web Workers
  • Web Storage
JS APIs

Web Sockets

Na odjemalcu

var socket = new WebSocket(location);
  socket.onopen = function(event) {
  socket.postMessage("Hello, WebSocket");
}

socket.onmessage = function(event) { alert(event.data); }
socket.onclose = function(event) { alert("closed");}

Na strežniku

  • Nodejs (V8 - JavaScript)
  • eventlet (python)
  • Jetty (Java)
  • WaterSpout (PHP5) - www.spoutserver.com
JS APIs

Web Workers

var worker = new Worker('js/prime.js');
                    
worker.onmessage = function (event) {
    document.getElementById('result').textContent = event.data;
};
var n = 1;
                    
search: while (true) {
  n += 1;
  for (var i = 2; i <= Math.sqrt(n); i += 1)
    if (n % i == 0)
     continue search;
     
  // found a prime!
  postMessage(n);
}
JS APIs

Web Storage

Key - Value

// use localStorage for persistent storage
// use sessionStorage for per tab storage

textarea.addEventListener('keyup', function () {
  window.localStorage['value'] = area.value;
  window.localStorage['timestamp'] = (new Date()).getTime();
}, false);

textarea.value = window.localStorage['value'];
  • Persisten data (uporabno za nastavitve)
  • Ni poslano nazaj na server (kot cookie)

SQL

var db = window.openDatabase("Database", "Version");

db.transaction(function(tx) {
  tx.executeSql("SELECT * FROM test", [], successCallback, errorCallback);
});
JS APIs

Geolocation

if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition(function(position) {
    var lat = position.coords.latitude;
    var lng = position.coords.longitude;
    var marker = new google.maps.Marker(
      { position: new google.maps.LatLng(lat, lng) }
    );
    marker.setMap(map);
  });
}
JS APIs

Cache Api

<!DOCTYPE HTML>
<html manifest="site.manifest">
</html>
AddType text/cache-manifest manifest
CACHE MANIFEST
# v2

CACHE:
index.html
images/logo.png

NETWORK:
login.php

FALLBACK:
/login.php /offline.html
var appCache = window.applicationCache;
appCache.update();

if (appCache.status == window.applicationCache.UPDATEREADY) appCache.swapCache();
JS APIs

File Api

handleFileSelect = function(event) {
    var files = event.target.files;
    
    for (var i = 0, f; f = files[i]; i++) {
        var reader = new FileReader();
        reader.onload = (function(theFile) {
            return function(e) {
                $('#thumbnails').append(
                    ['<img width="100" height="100" class="thumb" src="', 
                        e.target.result, '" title="', theFile.name, '"/>']
                    .join(''));
            };
        })(f);
    
        reader.readAsDataURL(f);
    }
}

JS APIs

Notifications

if (window.webkitNotifications.checkPermission() != 0) {
  window.webkitNotifications.requestPermission();                            
}

if (window.webkitNotifications.checkPermission() == 0) {
  window.webkitNotifications.createNotification(
    '', 'Obvestilo', $('#notification_text').val()
  ).show();
};


Danes

Modernizr
  • Omogoči zaznavanje podprtih funkcionalnostih
  • Majhen (5.0 kb gziped)
  • Odličen API
if (Modernizr.canvas) {
  var c = document.createElement('canvas');
  var context = c.getContext('2d');
  // do something
}
.no-audio #audio {
   display: none; /* Don't show Audio options */
}
.audio #audio button {
   /* Style the Play and Pause buttons nicely */
}
Google Chrome Frame
  • Browser Plug-in
  • HTML5 v IE :)
  • Uporabi Google Chrome rendering engine
  • Ne podpira Windows 2000, Me, 98
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<html>
<body>
  <script type="text/javascript" 
   src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js">
   </script>   
  <script>
   CFInstall.check({ mode: "inline", node: "prompt" });
  </script>
</body>
</html>
Gordon

An open source Flash™ runtime written in pure JavaScript

  • Full control
  • Workers
  • SVG

Prihodnost

Prihodnost
  • Drag-out (DownloadURL format in DataTransfer object)
  • File API (application local file storage)
  • Grafična orodja (Adobe)
  • Voice Recognition / TTS
  • Webcam / Microphone
  • WebGL

Viri

Viri
  • www.html5demos.com
  • www.html5rocks.com
  • www.html5test.com
  • www.modernizr.com
  • raphaeljs.com
  • code.google.com/chrome/chromeframe
  • dev.w3.org/html5/spec-author-view
  • code.google.com/p/html5shiv
  • diveintohtml5.org

Vprašanja?

mitja@vizius.si