SlideShare a Scribd company logo
Web Components概要
2013/4/20
html5j主催
株式会社オープンウェブ・テクノロジー代表取締役
白石俊平(@Shumpei)
自己紹介
白石俊平と申します。
コミュニティhtml5j管理人(会員数5000名超)
HTML5とか勉強会主催(毎月一回、100名を動員)
Google API Expert (HTML5)
Microsoft Most Valuable Professional (IE9)
Twitter: @Shumpei
おあそび
スマホから:
http://bit.ly/efstatoka
PCの方:
http://bit.ly/efstatoka1
今日のアジェンダ
Web Componentsとは何か?
Web Componentsの構成要素
テンプレート
デコレータ
カスタム要素
Shadow DOM
Web ComponentsはWebをどう変えるか?
Web Componentsとは何か?
→WebのUIを「コンポーネント
化」するための仕様群である。
Webには、
コンポーネント
化が必要だ。
Webには、
コンポーネント
化が必要だ。
メンテナンス性
再利用性
開発効率
Web Components概要
Googleによって仕様提案
2013/4現在、Google Chromeが一部を実装済み
(Firefoxもdocument.registerのみ実装)
一部の仕様が公式のドラフトとして公開
→一般的に使えるようになるにはまだ時間がかか
りそう
Web Componentsの構成要素
Web Componentsを構成する4つの要素
テンプレート デコレータ
カスタム要素 Shadow DOM
HTMLテンプレート
HTMLテンプレート
現在、JavaScriptでテンプレートを実現する方法
は2つある。
文字列テンプレート
オフスクリーンDOM
HTMLテンプレート
現在、JavaScriptでテンプレートを実現する方法
は2つある。
文字列テンプレート
テンプレートの使用前に、<img>などが評価・実行
されることはない
DOMを考慮しない=innerHTMLを使用することに
なる
オフスクリーンDOM
<script id="tmpl1"
type="text/x-handlebars-template">
<img src="...">
<script src="..."></script>
</script>
HTMLテンプレート
現在、JavaScriptでテンプレートを実現する方法
は2つある。
文字列テンプレート
オフスクリーンDOM
DOMを持つ
テンプレートの使用前であっても、<img>などが評
価・実行されてしまう
<div id="tmpl" style="display:none;" hidden>
<img src="...">
<script src="..."></script>
</div>
HTMLテンプレート
現在、JavaScriptでテンプレートを実現する方法
は2つある。
文字列テンプレート
XSSの危険性
DOM操作
コードが書きにくい
結果が予想しづらい
HTMLテンプレートで
解決!
HTMLテンプレートの定義方法
<template>要素を使用する。
<template>内に、通常通りHTMLを記述する
<template>はレンダリングされない
<body>, <head>に定義
<html>
<head>
<template id="t">
<div id="message"></div>
</template>
</head>
<body></body>
</html>
HTMLテンプレートを使用する
contentプロパティから、内部のDOMを取得する。
<template id="t">
<div id="message"></div>
</template>
var tmplElem = document.getElementById('t');
var tmpl = tmplElem.content.cloneNode();
…
elem.appendChild(tmpl);
HTMLテンプレート
テンプレートの使用前に、<img>などが評価・実
行されることはない
DOMを持つ。
「テンプレートである」というセマンティック
を与えることができるのも良い。
デコレータ、カスタム要素で使用される汎用要
素でもある。
デコレータ
CSSの限界を超える
CSSの限界とは?
DOMを操作することは
できない
<ul>
<li>
<i>アイコン</i>
<span>自由人会議</span>
<span>5</span>
</li>
…
</ul>
くらいで済みそうなものだけれ
ど・・
デコレータ
要素を「デコレーション」するための仕組み
HTML内で定義し、CSS内で使用する
デコレータの定義
<decorator>要素と<template>要素を使用して定
義する。
<decorator id="labelDecorator">
<template>
ラベル:
</template>
</decorator>
デコレータの使用
CSS内で、decoratorプロパティを使って要素に
指定する。
/* 全てのlabel要素が「ラベル:」となる */
label {
decorator: url(#labelDecorator);
}
<label for="name">
お名前
</label>
<input id="name">
デコレータの使用
テンプレート内で<content>要素を使用して、要
素内容を挿入する箇所を指定できる。
<decorator id="labelDecorator">
<template>
<!-- ここに、要素内容が挿入される -->
<content></content>:
</template>
</decorator>
<label for="name">
お名前
</label>
<input id="name">
複数の<content>要素を指定する
<content>は複数指定できる。
select属性を用いて、要素内容の一部を抜きだし
て挿入できる。
<decorator id="fieldRowDecorator">
<template>
<div>
<!-- ここに、要素内容が挿入される -->
<content select="label"></content>:
</div>
<!-- 残りの要素はここに挿入される -->
<div id="field"><content></content></div>
</template>
</decorator>
複数の<content>要素を指定する
/* ラベルとフィールドの組み合わせ */
.fieldRow {
decorator: url(#fieldDecorator);
}
<div class="fieldRow">
<label for="name">
お名前
</label>
<input id="name">
</div>
Advanced:
デコレータのスタイリング
スコープ付きのstyle要素を使用する。
<decorator id="fieldRowDecorator">
<template>
<style scoped>...</style>
…
</template>
</decorator>
Advanced:
デコレータ内のイベント処理
デコレータは、listen()というメソッドを使用してイベント
ハンドラを登録する
デコレータのコードが実行されるのは、ロード時に一度き
り
<decorator id="decorator-event-demo">
<script>
function h(event) {
alert(event.target);
}
this.listen(
{selector: "#b", type: "click", handler: h});
</script>
<template>
<content></content>
<button id="b">Bar</button>
</template>
</decorator>
デコレータ
あくまで表示目的の機能である。
Shadow DOM(後述)は持たない
デコレータで定義されたDOMには、アクセスす
る手段がない
スタイリング目的の余計なマークアップを劇的
に減らすことができるため、非常に強力
カスタム要素
カスタム要素とは?
要素を自作できる!!!!
カスタム要素の定義
<element>要素を使用する
name属性に要素名を指定する
自作要素には「x-」という接頭辞をつけなくては
ならない
extends属性に、継承元の要素を指定する
<element name="x-fancybutton"
extends="button">
<template>
<!-- デコレータと同様 -->
…
</template>
</element>
カスタム要素の使用
要素にis属性を指定して、カスタム要素の名称を
指定する。
対象となる要素は、カスタム要素のextendsと一
致している必要がある
<button is="x-fancybutton">
<span>ボタン</span>
</button>
Advanced:
カスタム要素のインスタンス化
カスタム要素は通常の要素と同じく、
document.createElement()でインスタンス化でき
る
constructor属性で、コンストラクタを生成させ
ることも可能
var e = document.createElement('x-fancybutton');
<element name="x-fancybutton" extends="button"
constructor="FancyButton">...</element>
var fancyButton = new FancyButton();
Advanced:
カスタム要素のクラス定義
コンストラクタのプロトタイプを変更して、要
素独自の振る舞いを追加する。
<element ... constructor="FancyButton">
<script>
FancyButton.prototype.razzle = ...
// constructor属性を使用しない場合は
// 以下のコードでコンストラクタにアクセス
// var FancyButton =
this.generatedConstructor;
</script>
...
</element>
Advanced:
カスタム要素のライフサイクル
カスタム要素は、以下の様なライフサイクルイベントを捕
捉して処理を行える。
created
attributeChanged
inserted
removed
<element extends="time" name="x-clock">
<script>
this.lifecycle({
inserted: function(){ this.startUpdatingClock(); },
removed: function() { this.stopUpdatingClock(); }
});
</script>
</element>
Advanced:
document.register API
カスタム要素を作成するためのAPI。
バージョン22以降のFirefoxが実装している。
// x-foo要素を作成
document.register('x-foo', {
prototype: Object.create(
HTMLParagraphElement.prototype, {
firstMember: {
get: function() { return foo; } },
}
});
Shadow DOM
Shadow DOMとは?
開発者の目から隠されたDOMツリー
複雑な内部構造を隠蔽し、シンプルなDOMに見
せかけることができる(=カプセル化)。
Shadow DOMの実装状況
Google ChromeにはShadow DOMが実装されて
いる。
標準的な要素の多くが、Shadow DOMで実装さ
れている。
video/audio/textarea/details/input...
Shadow DOMを見る
標準的な要素が、Shadow DOMによって構築さ
れていることを確認する。
Advanced:
Shadow DOMの動作を理解する
Shadow DOMを使用した要素(Shadow Host)
の「内側」には、2つのDOMツリーがある。
<element name="x-fancybutton"
extends="button">
<template>
<content></content>
<div>...</div>
</template>
</element>
<button is="x-fancybutton">
<span>ボタン</span>
</button>
カスタム要素の定義
に含まれるDOMツ
リー。
こちらのツリーは開
発者の目に見えない。
(Shadow DOM)
カスタム要素内に入
れ子にしたDOMツ
リー。
こちらのツリーは、
Shadow DOMに取っ
て代わられる
Advanced:
Shadow DOMの動作を理解する
二種類のDOMツリー
Advanced:
Shadow DOMの動作を理解する
Shadow DOMに差し替えられる
Advanced:
Shadow DOMの動作を理解する
元のDOMツリーは、<content>要素の位置に挿入
される
<element name="x-fancybutton"
extends="button">
<template>
<content></content>
<div>...</div>
</template>
</element>
<button is="x-fancybutton">
<span>ボタン</span>
</button>
<button is="x-fancybutton">
<span>ボタン</span>
<div>...</div>
</button>
Advanced:
Shadow DOMを使う
Chrome上では既に、Shadow DOMのAPIが利用
可能となっている。
element.webkitCreateShadowRoot()を用いて、
任意の要素をShadow Hostにすることができ
る。
Advanced:
Shadow DOMを使う
以下のコードを、Shadow DOM APIを使用して
整形する。
<!DOCTYPE html>
<div id="shadowHost">
もともとあったDOMツリー
</div>
<div id="shadowSubtree">
<style scoped>
#origTree { color: red; }
</style>
<h1>Shadow DOM Subtree</h1>
<div id="origTree">
<content></content>
</div>
</div>
Advanced:
Shadow DOMを使う
// Shadow Hostとなる要素を取得
var shadowHost = document.getElementById('shadowHost');
// Shadow Hostに変換
// この時点で、元のDOMツリーは一旦非表示に
var shadowRoot = shadowHost.webkitCreateShadowRoot();
// Shadow DOM サブツリーになる要素
var shadowSubtree = document.getElementById('shadowSubtree');
// Shadow DOM サブツリーとして指定
// 表示されるのはこちらの要素になる。
// <content>要素の部分に、もとのDOMツリーが表示される
shadowRoot.appendChild(shadowSubtree);
Web Componentsは
Webをどう変えるか?
UIフレームワークの
利用方法が統一
$('#list').somelist();
<ul data-role="listview">
</ul>
<ul dojoType="x.y.SomeList">
</ul>
<ul is="x-somelist">
</ul>
外部コンポーネントの
読み込み
link要素を用いて、外部コンポーネントを読み込
むことができる。
<link rel="components" href="URL">
CDNによるコンポーネント配信な
どが期待できる!
Web UI開発の分業が可能に
コンポーネント開発者
(ハイスキル)
HTML/CSS/JSを駆使したコンポーネント開発
開発標準策定
サードパーティコンポーネントの選定など
コンポーネント利用者
(ロースキル)
HTMLマークアップ
CSSスタイリング
よりセマンティックな
マークアップに
複雑なマークアップをカプセル化することで、
よりシンプルでセマンティックなマークアップ
に。
<textarea
is="x-tweetbox"
placeholder="ツイートする">
</textarea>
WebComponentsには注目!
数年後のHTMLマークアップは、今とは全く違う
ものになっているかも?
いつまでも泥臭かったHTMLフロントエンド開発
を、洗練されたものに。
ご清聴ありがとうございました。
Follow me @Shumpei

More Related Content

PDF
SPAに必要なJavaScriptFrameWork
PDF
Yeomanではじめる爆速webアプリ開発
PDF
Spa のための web サーバ構築ノウハウ
PDF
フロントエンド初学者がSPAに手を出してみた
PDF
業務アプリケーションにおけるモダンWeb開発の現状ーHTML5開発って簡単なの?
PDF
モダンWeb開発ワークショップ
PDF
次世代Web業務アプリケーション
PDF
WordPressのオススメスライドとか記事とか集めました。(2012.10.13 WordBench神戸)
SPAに必要なJavaScriptFrameWork
Yeomanではじめる爆速webアプリ開発
Spa のための web サーバ構築ノウハウ
フロントエンド初学者がSPAに手を出してみた
業務アプリケーションにおけるモダンWeb開発の現状ーHTML5開発って簡単なの?
モダンWeb開発ワークショップ
次世代Web業務アプリケーション
WordPressのオススメスライドとか記事とか集めました。(2012.10.13 WordBench神戸)

What's hot (19)

PDF
Web勉強会(HTML+CSS+JS入門の入門)
PDF
Office 365 勉強会「いまさらきけない? SharePoint の基礎のキソ」
PDF
HTML5開発最前線
PDF
SharePoint 2013 流リスト ビュー カスタマイズ
PDF
SharePoint と Yammer
PDF
第13回 JPSPS in 大阪_失敗しないSharePointプロジェクト 案件
PDF
WordPress APIで作るモバイルアプリ
PDF
Mojolicious+redisでチャットを作った
PDF
20150531 phpcon kansai
PPTX
Share point 小ネタ集
PPTX
[社内勉強会]SPAのすすめ
PPTX
PHPとフロントのイイ関係・動くスタイルガイドをつくろう
ODP
HTML5 のお話
PPTX
20151207 shibuya handson
PDF
マークアップエンジニアと情報アーキテクチャ
PDF
デザインが統一されているShare point サイトを作成しよう
PDF
HTML5 入門
PDF
GDG Women DevfestW
PDF
SharePoint 2013/Office365の「ソーシャル」でできること。SharePointは社内Facebookになれるのか?
Web勉強会(HTML+CSS+JS入門の入門)
Office 365 勉強会「いまさらきけない? SharePoint の基礎のキソ」
HTML5開発最前線
SharePoint 2013 流リスト ビュー カスタマイズ
SharePoint と Yammer
第13回 JPSPS in 大阪_失敗しないSharePointプロジェクト 案件
WordPress APIで作るモバイルアプリ
Mojolicious+redisでチャットを作った
20150531 phpcon kansai
Share point 小ネタ集
[社内勉強会]SPAのすすめ
PHPとフロントのイイ関係・動くスタイルガイドをつくろう
HTML5 のお話
20151207 shibuya handson
マークアップエンジニアと情報アーキテクチャ
デザインが統一されているShare point サイトを作成しよう
HTML5 入門
GDG Women DevfestW
SharePoint 2013/Office365の「ソーシャル」でできること。SharePointは社内Facebookになれるのか?

Similar to Web Components概要 2013/4/20 エフスタ!版 (16)

PDF
Polymerで先取り☆Web Components
PPTX
Web Components
PPTX
Web Component概要
PDF
WebComponentsとPolymer
PPTX
Material DesignをPolymerで表現しよう(神戸ITフェスティバル × HTML5fun@神戸)
PPTX
Webコンポーネントの話
PDF
エンタープライヤーのためのWeb Componentsハンズオン
PPTX
React meetup 3_eight
PDF
マークアップ講座 01b HTML
PDF
Polymerで作る次世代ウェブサイト
PDF
Web Standards 2018
PDF
HTML5, きちんと。
PDF
Componentization for Reality
PPTX
Web Componentsのアクセシビリティ
PPTX
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
PDF
今日からはじめるHTML5 ver.2012
Polymerで先取り☆Web Components
Web Components
Web Component概要
WebComponentsとPolymer
Material DesignをPolymerで表現しよう(神戸ITフェスティバル × HTML5fun@神戸)
Webコンポーネントの話
エンタープライヤーのためのWeb Componentsハンズオン
React meetup 3_eight
マークアップ講座 01b HTML
Polymerで作る次世代ウェブサイト
Web Standards 2018
HTML5, きちんと。
Componentization for Reality
Web Componentsのアクセシビリティ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
今日からはじめるHTML5 ver.2012

More from Shumpei Shiraishi (20)

PDF
俺的GEB概論(前半)
PPTX
コンセプトのつくりかた - アイデアをかたちにする技術
PPTX
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
PPTX
JavaScript使いのためのTypeScript実践入門
PPTX
「それでも人生にイエスと言う」を読んで
PPTX
「それでも人生にイエスと言う」を読んで
PPTX
Angular2実践入門
PDF
WebRTCがビデオ会議市場に与えるインパクトを探る
PDF
変身×フランツ・カフカ
PPTX
イラスト日用服飾辞典/三面記事の歴史/健康男 を読んで
PPTX
「1秒でわかる!アパレル業界ハンドブック」を読んで
PPTX
漫☆画太郎論
PPTX
HTML5時代のフロントエンド開発入門
PPTX
6,000人のWeb技術者コミュニティを5年間やってみて学んだこと
PPTX
はじめにことばありき
PPTX
秒速一億円
PPTX
HTML5がもたらすアプリ開発へのインパクト
PPTX
この人と結婚していいの?を読んで
PPT
20130921レジュメ2
PPTX
第62回 読書するエンジニアの会(テーマ:メカ) 「Prototyping lab」
俺的GEB概論(前半)
コンセプトのつくりかた - アイデアをかたちにする技術
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
JavaScript使いのためのTypeScript実践入門
「それでも人生にイエスと言う」を読んで
「それでも人生にイエスと言う」を読んで
Angular2実践入門
WebRTCがビデオ会議市場に与えるインパクトを探る
変身×フランツ・カフカ
イラスト日用服飾辞典/三面記事の歴史/健康男 を読んで
「1秒でわかる!アパレル業界ハンドブック」を読んで
漫☆画太郎論
HTML5時代のフロントエンド開発入門
6,000人のWeb技術者コミュニティを5年間やってみて学んだこと
はじめにことばありき
秒速一億円
HTML5がもたらすアプリ開発へのインパクト
この人と結婚していいの?を読んで
20130921レジュメ2
第62回 読書するエンジニアの会(テーマ:メカ) 「Prototyping lab」

Web Components概要 2013/4/20 エフスタ!版