SlideShare ist ein Scribd-Unternehmen logo
1 von 38
Downloaden Sie, um offline zu lesen
WEB COMPONENTS
   ParisJS #16 — 29/02/12
Thomas Bassetto — @tbassetto
ATTENTION



Les exemples de cette présentation sont peut-être
                déjà obsolètes.
LES ORIGINES

• HTML5:beaucoup de #header, #footer, .article =>
 <header>, <footer>, <article>

• Nombreux composants (jQuery UI, Dojo, Ext JS,
 etc.) => Web Components

• Précédentes   tentatives : MSIE behaviors, XBL, XBL2

• http://www.w3.org/2008/webapps/wiki/
 Component_Model_Use_Cases
AUJOURDHUI


• Comment   bien séparer le code que l’on a écrit et
 celui qui va l’utiliser ?

• Le(quasi-)seul moyen est d’utiliser des iframes
 (ou svg:use)
YUI

<script src="http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js">
</script>

<script type="text/javascript">
YUI().use('calendar', 'datatype-date', function(Y) {
    var calendar = new Y.Calendar({
      contentBox: "#mycalendar",
      width:'340px',
      showPrevMonth: true,
      showNextMonth: true,
      date: new Date(2011, 07, 01)}).render();
});
</script>
DOJO
<script
 src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/
dojo.xd.js">
</script>
<script>
dojo.require("dijit.dijit");
dojo.require("dijit.Calendar");
dojo.ready(function() {
    var c = new dijit.Calendar({
        value: new Date(),
        isDisabledDate: function(d) {
          // ...
        }
    });
    document.body.appendChild(c.domNode);
});
</script>
DOJO


<div dojoType="dijit.Calendar"
        value="2009-08-07"
        isDisabledDate="dojo.date.locale.isWeekend"
        onChange="...">
</div>
WEB COMPONENTS


• templates

• decorators

• custom   elements

• shadow   DOM
<TEMPLATE>
<TEMPLATE>


• Contient   du code qui sera utile plus tard

• Codeparsé, mais inerte: scripts non exécutés,
 images non téléchargées, HTML non “rendu”
<TEMPLATE>

  <template id="commentTemplate">
    <div>
        <img src="">
        <div class="comment"></div>
        …
    </div>
</template>

var t = document.querySelector("#commentTemplate");
// Populate content and img[src] values in the
template.
someElement.appendChild(t.content.cloneNode());
<DECORATOR>
<DECORATOR>

• Permetd’améliorer ou de remplacer la
 présentation d’éléments existants

• S’utilise
         via CSS, comme tout élement de
 présentation

• Permetd’utiliser du code HTML pour enrichir la
 présentation !
<DECORATOR>
   <decorator id="fade-to-white">
    <template>
        <div style="position: relative;">
             <style scoped>
                 #fog {
                      position: absolute;
                      left: 0;
                      bottom: 0;
                      right: 0;
                      height: 5em;
                      background: linear-gradient(
                      bottom, white 0%, rgba(255, 255, 255, 0) 100%);
                 }
             </style>
             <content></content>
             <div id="fog"></div>
        </div>
    </template>
</decorator>
<DECORATOR>
<decorator id="fade-to-white">
    <template>
        <div style="position: relative;">
             <style scoped>
                 #fog {
                      position: absolute;
                      left: 0;
                      bottom: 0;
                      right: 0;
                      height: 5em;
                      background: linear-gradient(
                      bottom, white 0%, rgba(255, 255, 255, 0) 100%);
                 }
             </style>
             <content></content>
             <div id="fog"></div>
        </div>
    </template>
</decorator>
<DECORATOR>
<decorator id="fade-to-white">
    <template>
        <div style="position: relative;">
             <style scoped>
                 #fog {
                      position: absolute;
                      left: 0;
                      bottom: 0;
                      right: 0;
                      height: 5em;
                      background: linear-gradient(
                      bottom, white 0%, rgba(255, 255, 255, 0) 100%);
                 }
             </style>
             <content></content>
             <div id="fog"></div>
        </div>
    </template>
</decorator>
<DECORATOR>
<decorator id="fade-to-white">
    <template>
        <div style="position: relative;">
             <style scoped>
                 #fog {
                      position: absolute;
                      left: 0;
                      bottom: 0;
                      right: 0;
                      height: 5em;
                      background: linear-gradient(
                      bottom, white 0%, rgba(255, 255, 255, 0) 100%);
                 }
             </style>
             <content></content>
             <div id="fog"></div>
        </div>
    </template>
</decorator>
<DECORATOR>
<decorator id="fade-to-white">
    <template>
        <div style="position: relative;">
             <style scoped>
                 #fog {
                      position: absolute;
                      left: 0;
                      bottom: 0;
                      right: 0;
                      height: 5em;
                      background: linear-gradient(
                      bottom, white 0%, rgba(255, 255, 255, 0) 100%);
                 }
             </style>
             <content></content>
             <div id="fog"></div>
        </div>
    </template>
</decorator>
<DECORATOR>
<decorator id="fade-to-white">
    <template>
        <div style="position: relative;">
             <style scoped>
                 #fog {
                      position: absolute;
                      left: 0;
                      bottom: 0;
                      right: 0;
                      height: 5em;
                      background: linear-gradient(
                      bottom, white 0%, rgba(255, 255, 255, 0) 100%);
                 }
             </style>
             <content></content>
             <div id="fog"></div>
        </div>
    </template>
</decorator>
<DECORATOR>


• L’élement<content> est l’endroit ou le contenu
 de l’élement “décoré” (ses enfants) sera inséré

• Onapplique le décorateur avec la propriété
 decorator et un ID
<DECORATOR>


.poem {
    decorator: url(#fade-to-white);
    font-variant: small-caps;
}
<DECORATOR>


<div class="poem">
    Two roads diverged in a yellow wood,<br>
    …
</div>
<DECORATOR>


<div class="poem" style="font-variant: small-caps;">
    <div style="position: relative;">
        Two roads diverged in a yellow wood,<br>
        …
        <div style="position: absolute; left: 0; …"></div>
    </div>
</div>
<ELEMENT>
<ELEMENT>


<element extends="button" name="x-fancybutton">

    …

</element>
<ELEMENT>
  <element extends="button" name="x-fancybutton">
    <template>
        <style scoped>
            div.fancy {
                 …
            }
        </style>
        <div class="fancy">
            <content></content>
            <div id="t"></div>
            <div id="l"></div>
            <div id="b"></div>
            <div id="r"></div>
        </div>
    </template>
</element>
<ELEMENT>

<!-- definition -->
<element extends="button" name="x-fancybutton">
    …
</element>

<!-- use -->
<button is="x-fancybutton">
    Show time
</button>
<ELEMENT>



var b = document.createElement("x-fancybutton");
// will display '<button is="x-fancybutton"></button>'
alert(b.outerHTML);
<ELEMENT>

• Uncustom element peut optionnellement écouter
 quatre “lifecycle” callbacks:

• created
       : appelé par le constructeur, avec une instace
 ShadowRoot, créé depuis <template> s’il existe

• attributeChanged    : quand un de ses attributs change

• inserted   : quand il est inséré dans le document

• removed    : une fois enlevé du document
SHADOW DOM
SHADOW DOM


        <input id="foo" type="range">



var slider = document.getElementsById("foo");
 console.log(slider.firstChild); // returns null
SHADOW DOM

<audio src="/test/audio.ogg"></audio>




      audio * {
        border: 3px solid red;
      }
SHADOW DOM



<div>
    <div class="stuff">
        <content><!-- all children will appear here --></content>
    </div>
</div>
SHADOW DOM

<div>
    <!-- all h1.cool children here -->
    <content select="h1.cool"></content>
    <div class="cool">
        <!-- all .cool children (except the ones that are h1.cool) -->
        <content select=".cool"></content>
    </div>
    <div class="stuff">
        <!-- all remaining children here -->
        <content></content>
    </div>
</div>
SHADOW DOM



Exemple : http://dvcs.w3.org/hg/
webcomponents/raw-file/tip/spec/shadow/
index.html#shadow-dom-example
CONCLUSION


• <style
       scoped> et Shadow DOM déjà disponible
 dans Chromium (désactivés par défaut)

• Spécification   qui évolue très fréquement

• Mozilla
        préfère attendre avant d’implémenter,
 aucune idée pour les autres navigateurs
QUESTIONS ?
ONE MORE THING




         On recrute :)

Weitere ähnliche Inhalte

Was ist angesagt?

Présentation complète de l'HTML5
Présentation complète de l'HTML5Présentation complète de l'HTML5
Présentation complète de l'HTML5jverrecchia
 
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)Rémi Prévost
 
HTML 5, CSS 3 au service du web | Semaine du web Alger (Algérie)
HTML 5, CSS 3 au service du web | Semaine du web Alger (Algérie)HTML 5, CSS 3 au service du web | Semaine du web Alger (Algérie)
HTML 5, CSS 3 au service du web | Semaine du web Alger (Algérie)Khaled Djebloun
 

Was ist angesagt? (7)

Initiation à Bootstrap
Initiation à BootstrapInitiation à Bootstrap
Initiation à Bootstrap
 
Présentation complète de l'HTML5
Présentation complète de l'HTML5Présentation complète de l'HTML5
Présentation complète de l'HTML5
 
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
 
Html 5(1)
Html 5(1)Html 5(1)
Html 5(1)
 
HTML5, le nouveau buzzword
HTML5, le nouveau buzzwordHTML5, le nouveau buzzword
HTML5, le nouveau buzzword
 
Introduction à HTML 5
Introduction à HTML 5Introduction à HTML 5
Introduction à HTML 5
 
HTML 5, CSS 3 au service du web | Semaine du web Alger (Algérie)
HTML 5, CSS 3 au service du web | Semaine du web Alger (Algérie)HTML 5, CSS 3 au service du web | Semaine du web Alger (Algérie)
HTML 5, CSS 3 au service du web | Semaine du web Alger (Algérie)
 

Andere mochten auch

Refactoring vers les design patterns pyxis v2
Refactoring vers les design patterns   pyxis v2Refactoring vers les design patterns   pyxis v2
Refactoring vers les design patterns pyxis v2Eric De Carufel
 
Running .NET on Docker
Running .NET on DockerRunning .NET on Docker
Running .NET on DockerBen Hall
 
Martin Naumann "Life of a pixel: Web rendering performance"
Martin Naumann "Life of a pixel: Web rendering performance"Martin Naumann "Life of a pixel: Web rendering performance"
Martin Naumann "Life of a pixel: Web rendering performance"Fwdays
 
JavaScript Speech Recognition
JavaScript Speech RecognitionJavaScript Speech Recognition
JavaScript Speech RecognitionFITC
 
Deploying applications to Windows Server 2016 and Windows Containers
Deploying applications to Windows Server 2016 and Windows ContainersDeploying applications to Windows Server 2016 and Windows Containers
Deploying applications to Windows Server 2016 and Windows ContainersBen Hall
 
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with KubernetesTips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with KubernetesBen Hall
 
Real World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS ApplicationReal World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS ApplicationBen Hall
 

Andere mochten auch (9)

Leaderpalooza Feb2010
Leaderpalooza Feb2010Leaderpalooza Feb2010
Leaderpalooza Feb2010
 
Influence With Peers
Influence With PeersInfluence With Peers
Influence With Peers
 
Refactoring vers les design patterns pyxis v2
Refactoring vers les design patterns   pyxis v2Refactoring vers les design patterns   pyxis v2
Refactoring vers les design patterns pyxis v2
 
Running .NET on Docker
Running .NET on DockerRunning .NET on Docker
Running .NET on Docker
 
Martin Naumann "Life of a pixel: Web rendering performance"
Martin Naumann "Life of a pixel: Web rendering performance"Martin Naumann "Life of a pixel: Web rendering performance"
Martin Naumann "Life of a pixel: Web rendering performance"
 
JavaScript Speech Recognition
JavaScript Speech RecognitionJavaScript Speech Recognition
JavaScript Speech Recognition
 
Deploying applications to Windows Server 2016 and Windows Containers
Deploying applications to Windows Server 2016 and Windows ContainersDeploying applications to Windows Server 2016 and Windows Containers
Deploying applications to Windows Server 2016 and Windows Containers
 
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with KubernetesTips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
 
Real World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS ApplicationReal World Lessons on the Pain Points of Node.JS Application
Real World Lessons on the Pain Points of Node.JS Application
 

Ähnlich wie Web Components & Shadow DOM

technologie web - part2
technologie web - part2technologie web - part2
technologie web - part2Benoît Simard
 
LESS : moins de CSS, plus de fun ! (KiwiParty 2011)
LESS : moins de CSS, plus de fun ! (KiwiParty 2011)LESS : moins de CSS, plus de fun ! (KiwiParty 2011)
LESS : moins de CSS, plus de fun ! (KiwiParty 2011)Corinne Schillinger
 
WebMardi [2020.10.08] - Efficient JavaScript development with Tailwind
WebMardi [2020.10.08] - Efficient JavaScript development with TailwindWebMardi [2020.10.08] - Efficient JavaScript development with Tailwind
WebMardi [2020.10.08] - Efficient JavaScript development with TailwindYann Gouffon
 
vue j'avais pas vu !!
vue j'avais pas vu !!vue j'avais pas vu !!
vue j'avais pas vu !!Manuel Adele
 
Vue, j’avais pas vu !
Vue, j’avais pas vu !Vue, j’avais pas vu !
Vue, j’avais pas vu !Bruno Bonnin
 
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2Horacio Gonzalez
 
Introduction à Sinatra
Introduction à SinatraIntroduction à Sinatra
Introduction à SinatraRémi Prévost
 
CSS Facile : organiser ses feuilles de style
CSS Facile : organiser ses feuilles de styleCSS Facile : organiser ses feuilles de style
CSS Facile : organiser ses feuilles de styleKaelig Deloumeau-Prigent
 
Comment évaluer la qualité d'un site web selon les techniques d'intégration w...
Comment évaluer la qualité d'un site web selon les techniques d'intégration w...Comment évaluer la qualité d'un site web selon les techniques d'intégration w...
Comment évaluer la qualité d'un site web selon les techniques d'intégration w...Renoir Boulanger
 
Cours code n°1 • MSIE
Cours code n°1 • MSIECours code n°1 • MSIE
Cours code n°1 • MSIEDorian Dawance
 
Intégrer correctement un e-mail, c'est possible ! Démonstration en 1h30
Intégrer correctement un e-mail, c'est possible ! Démonstration en 1h30Intégrer correctement un e-mail, c'est possible ! Démonstration en 1h30
Intégrer correctement un e-mail, c'est possible ! Démonstration en 1h30Sébastien Lejeune
 
Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Netvibes
 
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !Bruno Bonnin
 
initiation-dvptWEB-ericacademy.pdf
initiation-dvptWEB-ericacademy.pdfinitiation-dvptWEB-ericacademy.pdf
initiation-dvptWEB-ericacademy.pdfEricKeita
 
Création de Thème WordPress - Ghilas BELHADJ - Semaine du Web 2013
Création de Thème WordPress - Ghilas BELHADJ - Semaine du Web 2013Création de Thème WordPress - Ghilas BELHADJ - Semaine du Web 2013
Création de Thème WordPress - Ghilas BELHADJ - Semaine du Web 2013Ghilas BELHADJ
 

Ähnlich wie Web Components & Shadow DOM (20)

technologie web - part2
technologie web - part2technologie web - part2
technologie web - part2
 
LESS : moins de CSS, plus de fun ! (KiwiParty 2011)
LESS : moins de CSS, plus de fun ! (KiwiParty 2011)LESS : moins de CSS, plus de fun ! (KiwiParty 2011)
LESS : moins de CSS, plus de fun ! (KiwiParty 2011)
 
WebMardi [2020.10.08] - Efficient JavaScript development with Tailwind
WebMardi [2020.10.08] - Efficient JavaScript development with TailwindWebMardi [2020.10.08] - Efficient JavaScript development with Tailwind
WebMardi [2020.10.08] - Efficient JavaScript development with Tailwind
 
vue j'avais pas vu !!
vue j'avais pas vu !!vue j'avais pas vu !!
vue j'avais pas vu !!
 
Vue, j’avais pas vu !
Vue, j’avais pas vu !Vue, j’avais pas vu !
Vue, j’avais pas vu !
 
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2
 
Introduction à Sinatra
Introduction à SinatraIntroduction à Sinatra
Introduction à Sinatra
 
Html
HtmlHtml
Html
 
html-css-casuhal.pdf
html-css-casuhal.pdfhtml-css-casuhal.pdf
html-css-casuhal.pdf
 
CSS Facile : organiser ses feuilles de style
CSS Facile : organiser ses feuilles de styleCSS Facile : organiser ses feuilles de style
CSS Facile : organiser ses feuilles de style
 
Comment évaluer la qualité d'un site web selon les techniques d'intégration w...
Comment évaluer la qualité d'un site web selon les techniques d'intégration w...Comment évaluer la qualité d'un site web selon les techniques d'intégration w...
Comment évaluer la qualité d'un site web selon les techniques d'intégration w...
 
Cours code n°1 • MSIE
Cours code n°1 • MSIECours code n°1 • MSIE
Cours code n°1 • MSIE
 
Intégrer correctement un e-mail, c'est possible ! Démonstration en 1h30
Intégrer correctement un e-mail, c'est possible ! Démonstration en 1h30Intégrer correctement un e-mail, c'est possible ! Démonstration en 1h30
Intégrer correctement un e-mail, c'est possible ! Démonstration en 1h30
 
Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007Atelier autour de UWA à ParisWeb 2007
Atelier autour de UWA à ParisWeb 2007
 
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
 
Apprenez le jQuery
Apprenez le jQueryApprenez le jQuery
Apprenez le jQuery
 
initiation-dvptWEB-ericacademy.pdf
initiation-dvptWEB-ericacademy.pdfinitiation-dvptWEB-ericacademy.pdf
initiation-dvptWEB-ericacademy.pdf
 
CSS 3
CSS 3CSS 3
CSS 3
 
Cours Code Part 2
Cours Code Part 2Cours Code Part 2
Cours Code Part 2
 
Création de Thème WordPress - Ghilas BELHADJ - Semaine du Web 2013
Création de Thème WordPress - Ghilas BELHADJ - Semaine du Web 2013Création de Thème WordPress - Ghilas BELHADJ - Semaine du Web 2013
Création de Thème WordPress - Ghilas BELHADJ - Semaine du Web 2013
 

Mehr von Thomas Bassetto

L'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objetsL'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objetsThomas Bassetto
 
[FR] Présentation de PhoneGap
[FR] Présentation de PhoneGap[FR] Présentation de PhoneGap
[FR] Présentation de PhoneGapThomas Bassetto
 
[FR] Ancienne présentation de PhoneGap
[FR] Ancienne présentation de PhoneGap[FR] Ancienne présentation de PhoneGap
[FR] Ancienne présentation de PhoneGapThomas Bassetto
 
[FR] ParisJS en 2 minutes
[FR] ParisJS en 2 minutes[FR] ParisJS en 2 minutes
[FR] ParisJS en 2 minutesThomas Bassetto
 
[FR] Capture vidéo avec HTML5
[FR] Capture vidéo avec HTML5[FR] Capture vidéo avec HTML5
[FR] Capture vidéo avec HTML5Thomas Bassetto
 
Porting Flashblock to Jetpack Platform (draft)
Porting Flashblock to Jetpack Platform (draft)Porting Flashblock to Jetpack Platform (draft)
Porting Flashblock to Jetpack Platform (draft)Thomas Bassetto
 
Firefox 3.1 in 3.1 minutes
Firefox 3.1 in 3.1 minutesFirefox 3.1 in 3.1 minutes
Firefox 3.1 in 3.1 minutesThomas Bassetto
 
Les nouveautés de Firefox 3
Les nouveautés de Firefox 3Les nouveautés de Firefox 3
Les nouveautés de Firefox 3Thomas Bassetto
 

Mehr von Thomas Bassetto (8)

L'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objetsL'Open Web en tant que pierre angulaire du développement multi-objets
L'Open Web en tant que pierre angulaire du développement multi-objets
 
[FR] Présentation de PhoneGap
[FR] Présentation de PhoneGap[FR] Présentation de PhoneGap
[FR] Présentation de PhoneGap
 
[FR] Ancienne présentation de PhoneGap
[FR] Ancienne présentation de PhoneGap[FR] Ancienne présentation de PhoneGap
[FR] Ancienne présentation de PhoneGap
 
[FR] ParisJS en 2 minutes
[FR] ParisJS en 2 minutes[FR] ParisJS en 2 minutes
[FR] ParisJS en 2 minutes
 
[FR] Capture vidéo avec HTML5
[FR] Capture vidéo avec HTML5[FR] Capture vidéo avec HTML5
[FR] Capture vidéo avec HTML5
 
Porting Flashblock to Jetpack Platform (draft)
Porting Flashblock to Jetpack Platform (draft)Porting Flashblock to Jetpack Platform (draft)
Porting Flashblock to Jetpack Platform (draft)
 
Firefox 3.1 in 3.1 minutes
Firefox 3.1 in 3.1 minutesFirefox 3.1 in 3.1 minutes
Firefox 3.1 in 3.1 minutes
 
Les nouveautés de Firefox 3
Les nouveautés de Firefox 3Les nouveautés de Firefox 3
Les nouveautés de Firefox 3
 

Web Components & Shadow DOM

  • 1. WEB COMPONENTS ParisJS #16 — 29/02/12 Thomas Bassetto — @tbassetto
  • 2. ATTENTION Les exemples de cette présentation sont peut-être déjà obsolètes.
  • 3. LES ORIGINES • HTML5:beaucoup de #header, #footer, .article => <header>, <footer>, <article> • Nombreux composants (jQuery UI, Dojo, Ext JS, etc.) => Web Components • Précédentes tentatives : MSIE behaviors, XBL, XBL2 • http://www.w3.org/2008/webapps/wiki/ Component_Model_Use_Cases
  • 4. AUJOURDHUI • Comment bien séparer le code que l’on a écrit et celui qui va l’utiliser ? • Le(quasi-)seul moyen est d’utiliser des iframes (ou svg:use)
  • 5. YUI <script src="http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js"> </script> <script type="text/javascript"> YUI().use('calendar', 'datatype-date', function(Y) { var calendar = new Y.Calendar({ contentBox: "#mycalendar", width:'340px', showPrevMonth: true, showNextMonth: true, date: new Date(2011, 07, 01)}).render(); }); </script>
  • 6. DOJO <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/ dojo.xd.js"> </script> <script> dojo.require("dijit.dijit"); dojo.require("dijit.Calendar"); dojo.ready(function() { var c = new dijit.Calendar({ value: new Date(), isDisabledDate: function(d) { // ... } }); document.body.appendChild(c.domNode); }); </script>
  • 7. DOJO <div dojoType="dijit.Calendar" value="2009-08-07" isDisabledDate="dojo.date.locale.isWeekend" onChange="..."> </div>
  • 8. WEB COMPONENTS • templates • decorators • custom elements • shadow DOM
  • 10. <TEMPLATE> • Contient du code qui sera utile plus tard • Codeparsé, mais inerte: scripts non exécutés, images non téléchargées, HTML non “rendu”
  • 11. <TEMPLATE> <template id="commentTemplate"> <div> <img src=""> <div class="comment"></div> … </div> </template> var t = document.querySelector("#commentTemplate"); // Populate content and img[src] values in the template. someElement.appendChild(t.content.cloneNode());
  • 13. <DECORATOR> • Permetd’améliorer ou de remplacer la présentation d’éléments existants • S’utilise via CSS, comme tout élement de présentation • Permetd’utiliser du code HTML pour enrichir la présentation !
  • 14. <DECORATOR> <decorator id="fade-to-white"> <template> <div style="position: relative;"> <style scoped> #fog { position: absolute; left: 0; bottom: 0; right: 0; height: 5em; background: linear-gradient( bottom, white 0%, rgba(255, 255, 255, 0) 100%); } </style> <content></content> <div id="fog"></div> </div> </template> </decorator>
  • 15. <DECORATOR> <decorator id="fade-to-white"> <template> <div style="position: relative;"> <style scoped> #fog { position: absolute; left: 0; bottom: 0; right: 0; height: 5em; background: linear-gradient( bottom, white 0%, rgba(255, 255, 255, 0) 100%); } </style> <content></content> <div id="fog"></div> </div> </template> </decorator>
  • 16. <DECORATOR> <decorator id="fade-to-white"> <template> <div style="position: relative;"> <style scoped> #fog { position: absolute; left: 0; bottom: 0; right: 0; height: 5em; background: linear-gradient( bottom, white 0%, rgba(255, 255, 255, 0) 100%); } </style> <content></content> <div id="fog"></div> </div> </template> </decorator>
  • 17. <DECORATOR> <decorator id="fade-to-white"> <template> <div style="position: relative;"> <style scoped> #fog { position: absolute; left: 0; bottom: 0; right: 0; height: 5em; background: linear-gradient( bottom, white 0%, rgba(255, 255, 255, 0) 100%); } </style> <content></content> <div id="fog"></div> </div> </template> </decorator>
  • 18. <DECORATOR> <decorator id="fade-to-white"> <template> <div style="position: relative;"> <style scoped> #fog { position: absolute; left: 0; bottom: 0; right: 0; height: 5em; background: linear-gradient( bottom, white 0%, rgba(255, 255, 255, 0) 100%); } </style> <content></content> <div id="fog"></div> </div> </template> </decorator>
  • 19. <DECORATOR> <decorator id="fade-to-white"> <template> <div style="position: relative;"> <style scoped> #fog { position: absolute; left: 0; bottom: 0; right: 0; height: 5em; background: linear-gradient( bottom, white 0%, rgba(255, 255, 255, 0) 100%); } </style> <content></content> <div id="fog"></div> </div> </template> </decorator>
  • 20. <DECORATOR> • L’élement<content> est l’endroit ou le contenu de l’élement “décoré” (ses enfants) sera inséré • Onapplique le décorateur avec la propriété decorator et un ID
  • 21. <DECORATOR> .poem { decorator: url(#fade-to-white); font-variant: small-caps; }
  • 22. <DECORATOR> <div class="poem"> Two roads diverged in a yellow wood,<br> … </div>
  • 23. <DECORATOR> <div class="poem" style="font-variant: small-caps;"> <div style="position: relative;"> Two roads diverged in a yellow wood,<br> … <div style="position: absolute; left: 0; …"></div> </div> </div>
  • 26. <ELEMENT> <element extends="button" name="x-fancybutton"> <template> <style scoped> div.fancy { … } </style> <div class="fancy"> <content></content> <div id="t"></div> <div id="l"></div> <div id="b"></div> <div id="r"></div> </div> </template> </element>
  • 27. <ELEMENT> <!-- definition --> <element extends="button" name="x-fancybutton"> … </element> <!-- use --> <button is="x-fancybutton"> Show time </button>
  • 28. <ELEMENT> var b = document.createElement("x-fancybutton"); // will display '<button is="x-fancybutton"></button>' alert(b.outerHTML);
  • 29. <ELEMENT> • Uncustom element peut optionnellement écouter quatre “lifecycle” callbacks: • created : appelé par le constructeur, avec une instace ShadowRoot, créé depuis <template> s’il existe • attributeChanged : quand un de ses attributs change • inserted : quand il est inséré dans le document • removed : une fois enlevé du document
  • 31. SHADOW DOM <input id="foo" type="range"> var slider = document.getElementsById("foo"); console.log(slider.firstChild); // returns null
  • 32. SHADOW DOM <audio src="/test/audio.ogg"></audio> audio * { border: 3px solid red; }
  • 33. SHADOW DOM <div> <div class="stuff"> <content><!-- all children will appear here --></content> </div> </div>
  • 34. SHADOW DOM <div> <!-- all h1.cool children here --> <content select="h1.cool"></content> <div class="cool"> <!-- all .cool children (except the ones that are h1.cool) --> <content select=".cool"></content> </div> <div class="stuff"> <!-- all remaining children here --> <content></content> </div> </div>
  • 35. SHADOW DOM Exemple : http://dvcs.w3.org/hg/ webcomponents/raw-file/tip/spec/shadow/ index.html#shadow-dom-example
  • 36. CONCLUSION • <style scoped> et Shadow DOM déjà disponible dans Chromium (désactivés par défaut) • Spécification qui évolue très fréquement • Mozilla préfère attendre avant d’implémenter, aucune idée pour les autres navigateurs
  • 38. ONE MORE THING On recrute :)