38
WEB COMPONENTS ParisJS #16 — 29/02/12 Thomas Bassetto — @tbassetto

Web Components & Shadow DOM

Embed Size (px)

DESCRIPTION

Présentation sur la spéc. Web Components & Shadow DOM lors du meetup ParisJS de février 2012.

Citation preview

Page 1: Web Components & Shadow DOM

WEB COMPONENTSParisJS #16 — 29/02/12

Thomas Bassetto — @tbassetto

Page 2: Web Components & Shadow DOM

ATTENTION

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

Page 3: Web Components & Shadow DOM

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

Page 4: Web Components & Shadow DOM

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)

Page 5: Web Components & Shadow DOM

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>

Page 6: Web Components & Shadow DOM

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>

Page 7: Web Components & Shadow DOM

DOJO

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

Page 8: Web Components & Shadow DOM

WEB COMPONENTS

• templates

• decorators

• custom elements

• shadow DOM

Page 9: Web Components & Shadow DOM

<TEMPLATE>

Page 10: Web Components & Shadow DOM

<TEMPLATE>

• Contient du code qui sera utile plus tard

• Code parsé, mais inerte: scripts non exécutés, images non téléchargées, HTML non “rendu”

Page 11: Web Components & Shadow DOM

<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());

Page 12: Web Components & Shadow DOM

<DECORATOR>

Page 13: Web Components & Shadow DOM

<DECORATOR>

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

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

• Permet d’utiliser du code HTML pour enrichir la présentation !

Page 14: Web Components & Shadow DOM

<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>

Page 15: Web Components & Shadow DOM

<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>

Page 16: Web Components & Shadow DOM

<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>

Page 17: Web Components & Shadow DOM

<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>

Page 18: Web Components & Shadow DOM

<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>

Page 19: Web Components & Shadow DOM

<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>

Page 20: Web Components & Shadow DOM

<DECORATOR>

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

• On applique le décorateur avec la propriété decorator et un ID

Page 21: Web Components & Shadow DOM

<DECORATOR>

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

Page 22: Web Components & Shadow DOM

<DECORATOR>

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

Page 23: Web Components & Shadow DOM

<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>

Page 24: Web Components & Shadow DOM

<ELEMENT>

Page 25: Web Components & Shadow DOM

<ELEMENT>

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

</element>

Page 26: Web Components & Shadow DOM

<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>

Page 27: Web Components & Shadow DOM

<ELEMENT>

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

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

Page 28: Web Components & Shadow DOM

<ELEMENT>

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

Page 29: Web Components & Shadow DOM

<ELEMENT>

• Un custom 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

Page 30: Web Components & Shadow DOM

SHADOW DOM

Page 31: Web Components & Shadow DOM

SHADOW DOM

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

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

Page 32: Web Components & Shadow DOM

SHADOW DOM

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

audio * { border: 3px solid red;}

Page 33: Web Components & Shadow DOM

SHADOW DOM

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

Page 34: Web Components & Shadow DOM

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>

Page 36: Web Components & Shadow DOM

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

Page 37: Web Components & Shadow DOM

QUESTIONS ?

Page 38: Web Components & Shadow DOM

ONE MORE THING

On recrute :)