HTML5 [email protected] <shortbio> <name>Christian Cueni</name> <edu>FH Biel Elektrotechnik</edu> <working> Swisscom Eurospot / Swisscom Innovations / 89grad </working> <skills>Web / Mobile Web / iPhone</skills> </shortbio> Ziele ● ● Möglichkeiten von HTML5 Wie können Webseiten im mobilen Bereich eingesetzt werden Web 101 HTML CSS Javascript } Bausteine einer Webseite Web 101 - HTML HTML CSS Javascript HTML = Hypertext Markup Language } Inhalt Web 101 - HTML ...<body> } Beginn darstellbarer Inhalt <h1>I'm a heading</h1> } Überschrif <p>A paragraph</p> } Abschnit <ul> <li>item 1</li> <li>item 2</li> <li>item 3</li> </ul> } Ungeordnete Liste </body>... } Listen Element Web 101 - id und class ● ● Jedes Element einer Webseite kann ein id und/oder class-Atribut haben id-Atribute müssen einmalig sein <p id=“introduction“>...</p> ● class-Atribute können mehreren Elementen zugeordnet werden <li id=“home“ class=“nav_link“>...</li> <li id=“about“ class=“nav_link“>...</li> Web 101 - CSS HTML CSS Javascript CSS: Cascading Stylesheet } Design Web 101 - CSS ... h1 { font-size: 36px; } } Überschrif } Abschnit p { Background-color: #ddd; Border: 1px solid #000; } ul { margin: 10px 20px; } ... } Ungeordnete Liste Web 101 – CSS Selectors h1 {...} h1, p {...} #navigation {...} .nav_link {...} p.alert {...} p .alert {...} Alle h1-Elemente werden selektiert Alle h1- und p-Elemente werden selektiert Das Element mit id navigation wird selektiert Alle Elemente mit class nav_link werden selektiert Alle p-Elemente mit class alert werden selektiert Alle Elemente welche ein p-Element als Elternelement haben und von der class alert sind, werden selektiert htp://www.w3.org/TR/CSS2/selector.html Web 101 - Javascript HTML CSS Javascript CSS: Cascading Stylesheet } Funktionalität/ Interaktion Web 101 - Javascript HTML <input id=“answer“ class=“userinput “type=“text“ /> Javascript var input = document.getElementById('answer').value; if(!input) { alert(„Missing input“); } ... Web 101 – Javascript Einbindung ● Einbindung von Javascript-Dateien <script src="file.js"></script> ● Direkt im HTML <script> ... </script> Basic Demo htp://fh.trivialview.ch/basic/ htp://fh.trivialview.ch/basic/basic.zip Anatomie einer HTML5 Seite <!DOCTYPE html> <html> <head> <title>Page title</title> </head> <body> ...... </body> </html> Mehr Infos zu HTML5: htp://www.w3schools.com/html5/html5_reference.asp Validator:htp://validator.w3.org/ HTML5 & CSS3 HTML5 { } CSS3 Geschichte von HTML5 ● ● ● ● HTML wurde bisher vom W3C (World Wide Web Consortium) definiert. Die Spezifikation von XHTML 2 führte zu einem Bruch mit der Browser Industrie Apple, Mozilla und Opera formten die Web Hypertext Application Technology Working Group (WHATWG) und definierten nach Web Forms 2.0 Web Apps 1.0 den Standard HTML5 Das W3C hat den WHATWG HTML5 Standard als Basis für ihren eigenen HTML 5 Standard übernommen Geschichte von HTML5 - Versionen W3C HTML 2.0 HTML 3.2 HTML 4.0 XHTML 1.0 HTML 4.01 WHATWG Web Apps 1.0 Webforms 2.0 XHTML 2.0 XHTML 5 HTML 5 HTML5 Wann kommt HTML5? ● ● ● ● Das WHATWG erwartet, dass HTML5 den „recommendation“ Status 2014 erhalten wird Viel wichtiger ist, dass HTML5 2012 den „candidate recommendation“ Status erreicht (Das W3C rechnete mit 2010, ist aber im Verzug) HTML5 ist heute recht verbreitet Was man heute schon einsetzen kann: htp://caniuse.com/ HTML5 Quelle: Wikipedia Was kann HTML5? Semantik Multimedia Offline & Storage Grafik & 3D Geräte Zugrif Performance Kommunikation CSS3 http://www.w3.org/html/logo/ Semantik ● ● Maschinen können die Bedeutung einzelner Elemente besser verstehen ● Neue Tags (article, section, ...) ● Microdata Support für WAI-ARIA (Web Accessibility Initiative – Accessible Rich Internet Applications) Semantik - Tags HTML4.01 HTML5 <div id=“header“>..Header..</div> <header>...Header...</header> <div id=“nav“>. ...Seiten Navigation... </div> <nav> ...Seiten Navigation... </nav> <div class=“section“> <div class=“article“> <h1>Titel</h1> <p>Text</p> </div> </div> <div class=“section“> <div class=“article“> <h1>Titel</h1> <p>Text</p> </div> </div> <section> <article> <h1>Titel</h1> <p>Text</p> </article> </section> <section> <article> <h1>Titel</h1> <p>Text</p> </article> </section> <div id=“footer“>..Footer..</div> <footer>..Footer..</footer> Semantik - WAI-ARIA ● Hilfe für Screenreader etc. Ohne WAI-ARIA: Mit WAI-ARIA: <div id=“progress“> <div id=“display“>25%</div> <div style=“width:25%;“ id=“played“> </div> <div id=“progress“ role=“progressbar“ aria-valuemin=“0“ aria-valuemax=“100“ aria-valuenow=“25“> <div id=“display“>25%</div> <div style=“width:25%;“ id=“played“> </div> Semantik - Microdata <section itemscope itemtype="http://data-vocabulary.org/Person"> Hello, my name is <span itemprop="name">Christian Cueni</span>, I am a <span itemprop="title">developer</span> at <span itemprop="affiliation">89grad</span>. My friends call me <span itemprop="nickname">Chrigu</span>. You can visit my homepage at <a href="http://www.sample.com" itemprop="url">www.sample.com</a>. <section itemprop="address" itemscope itemtype="http://datavocabulary.org/Address"> I live at <span itemprop="street-address">Mottrastrasse 1</span> , <span itemprop="region">Bern</span>. </section> </section> Forms Forms – Input Typen < HTML5 <input type=“text“ name=“aName“ /> { button checkbox file hidden image password radio reset submit text Multimedia ● Audio und Video Support im Browser (ohne Flash) ● htp://html5demos.com/video-canvas Forms – Neue input Typen <input type=“text“ name=“aName“ /> { search tel url email datetime date month week time datetime-local number range color Unterstützung: http://www.miketaylr.com/code/input-type-attr.html Forms – input Demo htp://fh.trivialview.ch/forms.html Forms - Validierung ● ● Mit HTML5 können Forms ohne Javascript validiert werden Dazu können das required- und patern-Atribut verwendet werden <input required pattern=“<regex>“... ● Ersetzt nicht die Überprüfung auf Serverseite Cache & Storage ● ● ● ● Webseiten können mit Application Cache lokal gespeichert und somit offline verwendet werden Mit WebStorage können Daten wie bei Cookies lokal gespeichert werden Daten können in einer DB im Browser abgespeichert werden (Web SQL, Indexed DB) Webseiten können im Browser lokale Dateien auslesen (File API) Application Cache ● ● Ein Cache Manifest definiert welche Dateien lokal gespeichert (oder auch nicht) gespeichert werden sollen. Die Dateien werden in einem sogenannten Application Cache gespeichert. Dieser Cache hat nichts mit dem normalen Cache des Browsers zu tun Application Cache – Was es braucht ● ● Ein Cache Manifest: muss UTF-8 kodiert und vom MIME-Type her text/cache-manifest sein Im html-Element der Seite wird als manifestAtrribut die Datei angegeben <html manifest=“cache-manifest.appcache“> Für Apache: In der .htaccess Datei folgenden Eintrag machen AddType text/cache-manifest manifest <Files *.appcache> ExpiresActive On ExpiresDefault "access" </Files> Application Cache – Manifest File CACHE MANIFEST } Muss in der ersten Zeile stehen #VERSION 1 } Kommentar CACHE: important.html important.css important.js } Gibt an was gecached werden soll NETWORK: foo.html bar.html } Gibt an welche Ressourcen zwingend vom Netz geladen werden müssen FALLBACK: index.html offline.html } Definiert Ersatzinhalte Application Cache ● ● Damit der cache geupdated wird, muss der Inhalt vom Manifest-File ändern Resultate (vor allem für FALLBACK) können von Browser zu Browser varieren Application Cache Demo http://fh.trivialview.ch/calculator/calc.html htp://fh.trivialview.ch/calculator/calculator.zip WebStorage ● ● ● ● Wird in localStorage und sessionStorage unterteilt localStorage muss vom Benutzer gelöscht werden oder wird gelöscht wenn Sicherheitseinstellungen geändert werden sessionStorage wird nach jeder Browsersession gelöscht (Browser oder Tab wird geschlossen) Beide speichern Key/Value-Paare: Key = 'Some value' WebStorage localStorage oder sessionStorage Objekt: Option Return Beschreibung length Long Anzahl der gespeicherten Datensätze key(long index) String Name des Schlüssels an Position index getItem(string key) String Liest die Daten des Schlüssels key setItem(string key, string data) void Speichert die Daten data unter dem Schlüssel key removeItem(string key) void Löscht die Daten des Schlüssels key clear() void Löscht alle Daten Web SQL ● ● Web SQL wurde im November 2010 aus dem HTML5 Draf entfernt, es findet aber immer noch grosse Unterstützung unter den Webkit-Browsern Wie der Name vermuten lässt, ist es eine relationale Datenbank welche mit SQL-Queries (Sqlite) angesprochen werden kann Web SQL ● Erstellen/öfnen einer DB var db = openDatabase(<name>, <version>, <display name>, <estimated size in bytes>); ● Queries Ausführen db.transaction(function(tx) { tx.executeSql('some SQL query', arguments*, successCallback*, errorCallbac*); }); * = Optional Web SQL - Beispiel db.transaction(function(tx) { tx.executeSql('SELECT * FROM table WHERE column = ?', [value_for_questionmark], function(tx, results){ var len = results.rows.length, i; for (i = 0; i < len; i++) { console.log(results.rows.item(i).column); } }, function(tx, results{console.log('error')}); }); IndexedDB ● Speichert Key/Value-Paare ● Ist eine Objekt-orientiere Datenbank ● ● ● Im Gegensatz zu Webstorage können nicht nur Strings gespeichert werden (auch JSON Objekte) Die Objekte benötigen einen eindeutigen Key Es lassen sich Indexe erstellen um Objekte schneller zu finden. Dies können z.B. Eigenschafen von Objekten sein. IndexedDB - Daten CustomerData = [ { ahv: "111.111.111.111", name: "Bill", age: 35, email: "[email protected]" }, { ahv: "222.222.222.222", name: "Donna", age: 32, email: "[email protected]" } ]; ● Ahv ist in diesem Beispiel der key ● Für email und name können Indexe erstellt werden ● ● Indexe können auch Regeln für Eigenschafen bestimmen (z.B. uniqueness) Beispiel auf developer.mozilla.org Offline Detektion ● ● ● Es kann überprüf werden ob der Browser online ist Es gibt jedoch einen Unterschied bei Chrome, Safari und Firefox: Firefox meldet online wenn die Netzkarte abgeschaltet ist. Die anderen melden Offline htp://html5demos.com/nav-online Offline Detektion - Code ● Überprüfung: navigator.onLine ● Listener (alle ausser IE): window.addEventListener('offline', function(){...}, false); window.addEventListener('online', function(){...}, false); ● Listener (IE): document.body.attachEvent('onoffline', function(){...}); Geräte Zugrif ● Heute: ● ● Geolocation API Noch in Definitions/Entwicklungs-Phase ● Audio/Video Zugrif ● Zugrif auf Kontakte & Kalendereinträge ● Ausrichtung Gerät Kommunikation ● ● ● Web Sockets halten einen Kanal zwischen Client und Server ofen und bieten einen bi-direktionalen Kommunikationskanal z.B. für Chat Server-Sent Events ermöglicht ohne zu Pollen vom Server updates zu erhalten. htp://html5demos.com/web-socket Grafik & 3D ● 3D Grafiken mit WebGL ● ● ● ● htp://www.ro.me/ 3D Efekte in CSS SVG (Scalable Vector Graphics, Vektorgrafiken die mit XML beschrieben werden können) Support Canvas für 2D Grafiken ● htp://canvasrider.com/ ● htp://www.nihilogic.dk/labs/wolf/ Performance ● ● WebWorker erlauben es Skripte im Hintergrund laufen zu lassen. So können Skripte komplexe Berechnungen durchführen ohne das User Interface Skripte dabei zu stören. htp://juliamap.googlelabs.com CSS3 ● Abgerundete Ecken bei Elementen ● Transparente Elemente ● Schaten-Efekte ● Farbverläufe ● Media Queries ● htp://css3exp.com/moon/ ● htp://tympanus.net/Tutorials/AnimatedButons/index. HTML5 - Vorteile ● ● Gute Unterstützung bei iPhone und Android (beide Webkit) -> Cross-Platform Entwicklung Mit Hilfe von jQuery Mobile oder Sencha Touch können einfach nativ-ähnliche GUIs erstellt werden ● Webseiten bieten eine echte Alternative zu Apps ● Standard Tools & Sprachen ● Einfaches Deployment HTML5 - Nachteile ● ● ● ● ● Unterschiedliche Unterstützung bei Browsern Drag & Drop API und das Canvas-Element können leiden an Zugänglichkeitsproblemen. Einige Features funktionieren manchmal nicht immer wie man es erwartet Teilweise langsamer als native Apps Viele mobile Benutzer/firmen denken heute noch in Apps Übungen jQuery 101 jQuery kann heruntergeladen und über das <script>-Tag eingebunden werden. Alternativ kann es auch über ein CDN eingebunden werden z.B. von jQuery ( htp://code.jquery.com/jquery-1.8.3.min.js) htp://jquery.com/ JQuery Cheatsheet 1/2 $('#someid') Gibt das Element mit der id someid zurück document.getElementById('someid') $('.someclass') Gibt ein Array mit allen Elementen welche class = someclass haben zurück $('tagname') Gibt ein Array mit allen Elementen welche Tag = tagname haben zurück $(document).ready(function() { Führt JS-Code aus sobald das DOM geladen ist. Sicherer als window.onload = function() {} }) jQuery Tutorial JQuery Cheatsheet 2/2 $('someselector').atr('atrname') Gibt den Wert von Atribut atrname vom selektierten Element zurück $('someselector').atr('atrname', 'value') Setzt von selektierten Elementen das Atribut atrname auf Wert value $('someselector').removeAtr('atrname') Entfernt für die selektierten Elemente das Atribut atrname $('someselector').bind('action', function() { Fügt den selektierten Elementen einen Listener auf den action Event hinzu(ähnlich element.addEventListener('action', function(){}, false);) }) Javascript Cheatsheet 1/3 var a; Deklaration einer Variable a = Array(); Leeres Array erzeugen a.push(value); Wert zu ein Array hinzufügen a[0]; Auf das erste Element im Array zugreifen a.length; Länge von Array a document.getElementById('someid') Gibt das Element mit der id someid zurück document.getElementsByTagName('tagname') Gibt ein Array mit allen Elementen welche Tag = tagname haben zurück Javascript Cheatsheet 2/3 element.addEventListener('action', function() {}, false); Fügt dem Element einen Listener für die Aktion 'action' hinzu, welche dann Methode function aufruf If (typeof element.function !== 'undefined'){} Überprüf ob ein Element über die Methode function verfügt. So kann überprüf werden ob Funktionen von z.B HTML5 vorhanden sind for(var i=0;i<a.length;i++) { For-Loop um durch ein Array durchzugehen <loop code> } Javascript Cheatsheet 3/3 element.hasAtribute('key'); Überprüf ob ein Element das Atribut mit Namen key hat element.setAtribute('key','value') Setzt das für Atribute key den Wert value element.removeAtribute('key') Entfernt Atribut key für das Element Offline – Schrit 1 ● ● Erstelle eine einfache HTML-Seite welche ein pElement hat Erstelle ein Javascript-File und definiere darin eine $ (document).ready(function() {}); Funktion ● Rufe darin alert('test'); auf ● Lade jQuery (siehe basic.html) ● Lade das Javascript im HTML-File und überprüfe ob das JS-File geladen und ausgeführt wird Offline – Schrit 2 ● ● ● Erstelle 2 Listener für das offline- und online-Event Erstelle in der Funktion welche bei beiden Events aufgerufen wird und darin eine Variable welche das p-Element referenziert (siehe basic.js). Es gibt zwei Möglichkeiten (eine bedingt, dass das HTML angepasst werden muss) Überprüfe ob der Browser online ist oder nicht und gib dies im p-Elment aus (Tipp: jQuery Dok) WebStorage - Schrit 1 ● Erstelle eine HTML5-Seite mit: <div id="local_stuff"> <p>Local Value:</p> <p id="local_value"></p> </div> <div id="session_stuff"> <p>Session Value:</p> <p id="session_value"></p> </div> ● Füge darunter ein Text-Input Element ein ● Füge einen Buton zur Seite hinzu <button id=“save“ type=“button“>Add to storage</button> WebStorage - Schrit 2 ● ● ● Erstelle ein Javascript-File und definiere darin eine $ (document).ready(function() {}) Funktion Erstelle ein Variable welche den buton referenziert (siehe basic.js). Gib die Variable mitels console.log(variable); aus WebStorage - Schrit 3 ● ● ● ● Füge dem buton ein Listener auf das Click-Event hinzu (siehe basic.js) Speichere die Eingabe im localStorage und dem sessionStorage. Die Eingabe erhältst du, wenn du auf beim input-Element .val() aufrufst. Überprüfe zuerst aber, ob localStorage und sessionStorage vom Browser unterstützt werden. Gib diese Werte in den p-Elementen aus (Tipp: jQuery Dok) Schau mit dem Developer Tool, ob die Daten auch wirklich gespeichert werden (Webkit -> unter dem Tab Ressources) WebStorage - Schrit 4 ● ● ● Überprüfe nun in der ready-Funktion, ob die Keys gespeichert sind oder nicht. Falls ja, gib die Inhalte (localStorage und sessionStorage) in den pElementen aus („Saved value: <value>“) Gib „Empty“ aus falls keine Werte im Storage sind Lade die Seite neu und schau was passiert. Schliesse das Tab und öfne ein neues mit der Seite. Entspricht das Verhalten den Erwartungen? WebStorage - Schrit 5 ● Erstelle einen zweiten Buton, der so die gespeicherten Daten löscht Ideen für weitere Übungen ● ● ● Lade dir htp://fh.trivialview.ch/websql/websql.zip hinunter. Versuche den Code zu verstehen. Versuche die Storage Übung mit WebSQL zu realisieren. Speichere alle Eingaben in der DB ab und stelle die EingabeHistory dar Schau das CSS Cheatsheet an htp://www.addedbytes.com/cheat-sheets/css-cheat-sheet/ und versuche die Seiten zu stylen