<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>佐藤歩 &#8211; HTML5Experts.jp</title>
	<atom:link href="/ahomu/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>古くて新しいリアクティブプログラミングのすすめ-Frontrend Conference</title>
		<link>/ahomu/13333/</link>
		<pubDate>Tue, 07 Apr 2015 00:00:18 +0000</pubDate>
		<dc:creator><![CDATA[佐藤歩]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[RxJS]]></category>
		<category><![CDATA[リアクティブプログラミング]]></category>

		<guid isPermaLink="false">/?p=13333</guid>
		<description><![CDATA[連載： Frontrend Conference 特集 (9)本記事では、2015/2/21に行われた「Frontrend Conference」のJSトラックセッション「Reactive Programming in ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/frontrend/" class="series-251" title="Frontrend Conference 特集" data-wpel-link="internal">Frontrend Conference 特集</a> (9)</div><p>本記事では、2015/2/21に行われた「<a href="http://frontrend.github.io/conference/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Frontrend Conference</a>」のJSトラックセッション「Reactive Programming in JavaScript」から抜粋した内容を紹介します。</p>

<p>「リアクティブプログラミング」（以下、RP）という言葉を、みなさんはご存じでしょうか。RPは、オブジェクト指向プログラミングや関数型プログラミングと同様に、プログラミングパラダイムのひとつです。このRPというパラダイムを、近年のWebフロントエンドの風潮になぞらえて見ていきます。</p>

<h2>リアクティブプログラミングという考え方</h2>

<p>RPは「イベントや変化する値の関係性」に注目し、これを簡潔に記述することで相互作用を上手に扱おうとするプログラミングパラダイムです。</p>

<p>これはオブジェクト指向プログラミングが「オブジェクトと相互のメッセージング」に注目したり、関数型プログラミングが「関数の作用」に注目したりするように、プログラミングを捉えるときの着眼点、切り口のひとつであるとも言えます。</p>

<h3>GUIにとってReactiveは身近な概念</h3>

<p>GUIプログラミングにおいて、データ（一般的には、Model）に変化があったときや何らかの非同期処理が終わったときなど、表示（一般的にはView）の更新につながる処理が頻繁に実行されます。</p>

<p>RPでは<strong>「イベントや変化する値の関係性 = データフロー」</strong>に注目した上で、特に「データフローの宣言によって、片方の変化を他方に自動で伝播させる」ことが重要です。これによって、しばしば複雑になりがちなデータの相互作用を容易に管理できるようにします。</p>

<p>GUIで発生する同期/非同期を問わずに発生する何らかのイベントと、それに伴う画面の更新は「片方の変化を他方に自動で伝播させる」仕組み作りが有効に作用する分野です。</p>

<h3>Reactiveなアプローチはフロントエンドでも試みられてきた</h3>

<p>Webフロントエンドでは、これまでどのようにReactiveなアプローチが試みられてきたのでしょうか？RPの主題とも言える「データフローの宣言によって、片方の変化を他方に自動で伝播させる」という振る舞いの成り立ちは、作ろうとしているプロダクトの種類や開発言語、使用するライブラリによって異なります。</p>

<p>たとえばMVVM(Model View ViewModel)に代表されるようなデータバインディングの仕組みは、データ（Model）と表示（View）を宣言的に結びつけるReactiveな仕組みと言えます。</p>

<p>今年から特に話題にのぼることが多くなったReactについても、Fluxというアーキテクチャモデルが加わることで、データの変更を表示に伝播させるReactiveなデータフローを実現しようとしています。</p>

<h2>Functional Reactive Programming</h2>

<p>Functional Reactive Programming（以下FRP）とは、RPのモデルに関数型プログラミング（Functional Programming）の要素を加えたものです。</p>

<p>本セッションではデータバインディングや Fluxに続く（正確にはそれらよりもずっと前からあるものなのですが&#8230;）Reactiveなアプローチとして、FRPにという考え方に基づいた Reactive Extensionsと呼ばれるライブラリを紹介していきます。</p>

<h3>Reactive Extensions と非同期データストリーム</h3>

<p>FRPを基にした<a href="https://msdn.microsoft.com/en-us/data/gg577609.aspx" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Reactive Extensions</a> というライブラリでは、すべての値を<strong>「時間軸に沿って値が流れるリスト = 非同期データストリーム」</strong>というモデルに落とし込みます。これだけだと、少し分かりづらい概念かもしれません。</p>

<p><a href="https://speakerdeck.com/ahomu/reactive-programming-in-javascript?slide=39" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/03/preview_slide_38.jpg" alt="preview_slide_38" width="640" height="450" class="aligncenter size-full wp-image-14152" srcset="/wp-content/uploads/2015/03/preview_slide_38.jpg 640w, /wp-content/uploads/2015/03/preview_slide_38-300x211.jpg 300w, /wp-content/uploads/2015/03/preview_slide_38-207x146.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>参考: <a href="http://www.slideshare.net/stefanmayer13/functional-reactive-programming-with-rxjs/18" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Functional Reactive Programming with RxJS</a></p>

<p>少々強引ですが、今風に喩えて言えば、イベントが起こる度に何度も値を流してくるPromiseと捉えることもできます。それをリストとして捉えることで、<code>map</code>や<code>filter</code>といった高階関数を活かした、関数型のイディオムを適用できるようになります。</p>

<p>非同期データストリームのモデルが優れているところは、Promiseのような非同期であっても、散発的に発生する click のような非同期イベント、通常の値であっても、すべて同じモデルに落とし込んでRPを実践できるように抽象化されているところです。</p>

<h3>RxJS を利用してみる</h3>

<p>ここでは <a href="https://msdn.microsoft.com/en-us/data/gg577609.aspx" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Reactive Extensions</a> の JavaScript実装である<a href="http://reactive-extensions.github.io/RxJS/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">RxJS</a>を取り上げて、一つの例を紹介します。次に示すリンクは、+（プラス）または-（マイナス）をクリックすると、中央の数字が更新されるサンプルです。この中にRxJSで使われる基本的なメソッドが詰まっています。</p>

<ul>
<li><a href="http://codepen.io/ahomu/pen/wBEKPe/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">RxJSのSample(CodePen)</a></li>
</ul>

<p>上記サンプルのJavaScript部分を抜粋してコメントをつけると次のようになります。サンプルの動作自体は簡単なので、らくに読めると思います。中でもストリームやオブザーバを宣言している部分と、それらをどのようにつなぎ合わせているかに注目するとよいでしょう。</p>

<p></p><pre class="crayon-plain-tag">document.addEventListener('DOMContentLoaded', function() {

  // 要素のセットアップ
  var plusEl    = document.getElementById('plus');
  var minusEl   = document.getElementById('minus');
  var counterEl = document.getElementById('counter');
  
  // &lt;span id="plus"&gt;+&lt;/span&gt; を click すると 1 が流れるストリーム
  var plus    = Rx.Observable.fromEvent(plusEl, 'click').map(1);
  // &lt;span id="minus"&gt;-&lt;/span&gt; を click すると -1 が流れるストリーム
  var minus   = Rx.Observable.fromEvent(minusEl, 'click').map(-1);

  // plusとminusをひとつにマージする
  var both = plus.merge(minus);

  // scanは第一引数に初期値、第二引数にアキュムレータを受け取る
  // curtValueは現在値を示し、bothから1/-1が流れてくるたびに加算する
  var curtValue = both.scan(0, function(acc, v) {
    return acc + v;
  });

  // 流れてきた値を処理するオブザーバを定義する
  var setHtml = Rx.Observer.create(function(v) {
    counterEl.innerHTML = v;
  });

  // curtValue (現在値) に更新があると、オブザーバが動作する
  var subscription = curtValue.subscribe(setHtml);
});</pre><p></p>

<p>非同期データストリームにほとんどについて、<code>Rx.Observable</code>のインターフェースに集約されており、全て取り上げると莫大な数（150超）のメソッドが実装されています。（<a href="https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">APIドキュメント</a>）</p>

<p>いきなり全てのメソッドを把握しようとすると、あまりにも大変ですが、まずは今回のサンプルで登場したような限られたメソッドを把握するだけでも、簡単な動きを作ることはできるでしょう。</p>

<ul>
<li><a href="https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromevent.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rx.Observable.fromEvent(element, eventType)</a></li>
<li><a href="https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/merge.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rx.Observable#merge(otherObservable)</a></li>
<li><a href="https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/scan.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rx.Observable#scan(seedValue, accumlator)</a></li>
<li><a href="https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/subscribe.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rx.Observable#subscribe(observer)</a></li>
</ul>

<p>本編セッションでは、より多くのサンプルを紹介しているので動画やスライド資料も参考にしてみてください。</p>

<h3>RxJS に影響を受けたその他のライブラリ</h3>

<p>Webフロントエンドで利用できるFRPライブラリは、RxJSだけではありません。Reactive Extensions、あるいは RxJSそのものに影響を受けて作られたライブラリが他にあります。</p>

<p><a href="https://baconjs.github.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Bacon.js</a>は<code>Rx.Observable</code>相当の概念を、EventStreamというProperty に整理しています。これはReactive ExtensionのObservableにおけるHot/Coldという、やや複雑な概念をシンプルに整理し直したものです。</p>

<p><a href="https://pozadi.github.io/kefir/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Kefir.js</a> はBacon.jsと同じ概念を踏襲しつつ、コード実装を最適化して、より優れたパフォーマンスを得ることを目的としたライブラリです。</p>

<h2>Reactive Programmingを学ぶ意義</h2>

<p>FRPの考え方を忠実に再現しようとすること自体は、現在のフロントエンドにおけるJavaScriptの設計パターンと必ずしもマッチするものではないかもしれません。</p>

<p>しかし、オブジェクト指向言語に関数型のエッセンスが徐々に取り入れられているのと同じように、RPも少量のエッセンスを取り入れることには十分な価値があることでしょう。</p>

<div class="aligncenter">
<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/nOzq0cpLXlM" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>
</div>

<p>本記事では限られた範囲での紹介でしたが、セッションの動画も公開されていますので、もっと知りたい方はそちらもご覧いただけると幸いです。2015年に入ってからReactive ExtensionsまたはRxJS関係の情報も増えてきていますので、今後より一層注目されるようになるかもしれません。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Frontrend Conference 特集]]></series:name>
	</item>
		<item>
		<title>話題のMaterial DesignをWebで実現！Polymerで「Paper Elements」を試そう</title>
		<link>/ahomu/9307/</link>
		<pubDate>Tue, 05 Aug 2014 00:00:12 +0000</pubDate>
		<dc:creator><![CDATA[佐藤歩]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Google I/O 2014]]></category>
		<category><![CDATA[Material Design]]></category>
		<category><![CDATA[Paper Elements]]></category>
		<category><![CDATA[Polymer]]></category>

		<guid isPermaLink="false">/?p=9307</guid>
		<description><![CDATA[連載： Google I/O 2014 特集 (9)この記事では2014年7月にGoogle I/Oで発表されたMaterial Designについて、どのようなコンセプトなのか、これまでのデザインガイドラインと何が違う...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/google-io-2014-2/" class="series-191" title="Google I/O 2014 特集" data-wpel-link="internal">Google I/O 2014 特集</a> (9)</div><p>この記事では2014年7月にGoogle I/Oで発表されたMaterial Designについて、どのようなコンセプトなのか、これまでのデザインガイドラインと何が違うのか、ポイントをおさえて紹介します。記事の後半では、Material DesignをWebで実現するためのPolymerとPaper Elementsに関しても説明します。</p>

<h2>Material Designという視覚的言語</h2>

<p><a href="http://www.google.com/design/spec/material-design/introduction.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Material Design</a>の目的は、ひとつの視覚的な言語（Visual Language）によって、あらゆるプラットフォーム、あらゆるスクリーンサイズのデバイスで、一貫性のある体験を提供することです。</p>

<p>それを実現するため、伝統的なグラフィックデザインとテクノロジーによる可能性を引き出して開発に取り組み、ガイドラインは生きたドキュメントとして更新され続けるとしています。</p>

<h3>フラットな中に、自然な影や動きを取り入れた</h3>

<p>Material Designは、フラットデザインを取り入れた他のデザインガイドラインと同様に、伝統的なグラフィックデザイン、たとえばタイポグラフィーやレイアウトの原則を取り込んでいます。文字やグラフィックを中心に構成された現在のアプリやWebに、はるか昔から積み重ねられてきたノウハウを融和させることで、優れたビジュアルが得られます。</p>

<p>しかし、単なるビジュアルのルールだけでは、スクリーンサイズの多様性の中で、UIや体験の一貫性を保つのはどこかで限界があるのかもしれません。そこでMaterial Designは、「Material is the Metaphor」というコンセプトを取り込んでいます。</p>

<div id="attachment_9352" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/layering.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/layering.png" alt="Layering" width="640" height="360" class="size-full wp-image-9352" srcset="/wp-content/uploads/2014/07/layering.png 640w, /wp-content/uploads/2014/07/layering-300x168.png 300w, /wp-content/uploads/2014/07/layering-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">http://googledevelopers.blogspot.jp/2014/06/this-is-material-design.html</p></div>

<p>規則性のある影や、連続性のあるモーションなどを、現実世界のメタファとして細部に取り込むことで、深いレベルで一貫性をもった世界を構築しようとしています。これらの表現に、現実の物質世界と同じ物理的性質をもたせることで、認知的な負担を少なくし、より自然にアフォーダンスを受け取れるようにしています。</p>

<p>例えば、フラットな面に影の表現を加えることで、オブジェクトの重なりやヒエラルキーが表現できます。強く影をつけた大きなボタンは、ユーザーの目にひときわ浮き立つプライマリなアクションとして認識されます。</p>

<p>このような影について、Android Lではリアルタイムソフトシャドウとして、現実世界のメタファを通して、より自然な振る舞いになるようエンジニアリングが発揮されています。モーションについても、直線的な動きではなく、現実世界の慣性に従った動きになるようにガイドラインで定められています。</p>

<div id="attachment_9356" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/14803538523_b7b20a90bd_z.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/14803538523_b7b20a90bd_z.jpg" alt="Material Design Paper" width="640" height="360" class="size-full wp-image-9356" srcset="/wp-content/uploads/2014/07/14803538523_b7b20a90bd_z.jpg 640w, /wp-content/uploads/2014/07/14803538523_b7b20a90bd_z-300x168.jpg 300w, /wp-content/uploads/2014/07/14803538523_b7b20a90bd_z-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Material Design Paper</p></div>

<p>Material Designのコンセプトについて詳しくは、<a href="https://www.google.com/design/material-design.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PDF</a>で9つの特徴にまとまっています。Google I/Oのデザインブースでは、このPDFの図画が、実際の紙にインクで印刷されたものが頒布されていました。</p>

<h3>「具体的な」デザインガイドライン</h3>

<p>Material Designの<a href="http://www.google.com/design/spec/animation/authentic-motion.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ガイドライン</a>として、具体的にどのようなデザインを実現すれば良いかのドキュメントは、プレビュー版としてすでに公開されています。</p>

<p>以前の<a href="https://developer.android.com/design/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Android Design</a>においても詳細な項目が用意されていましたが、今回のガイドラインでは、そこにアニメーションや陰影の深度に関する項目をはじめとして、多岐にわたり詳細な情報が掲載されています。特徴的なのは、文字のレイアウト、アニメーション、陰影の表現、画像のフェード効果など細部に至るまで、具体的な数値とサンプルをもって表現していることです。</p>

<div id="attachment_9350" style="width: 1290px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/Authentic-Motion-Animation-Google-design-guidelines.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/Authentic-Motion-Animation-Google-design-guidelines.png" alt="ガイドラインの一例" width="1280" height="728" class="size-full wp-image-9350" srcset="/wp-content/uploads/2014/07/Authentic-Motion-Animation-Google-design-guidelines.png 640w, /wp-content/uploads/2014/07/Authentic-Motion-Animation-Google-design-guidelines-300x170.png 300w, /wp-content/uploads/2014/07/Authentic-Motion-Animation-Google-design-guidelines-1024x582.png 1024w, /wp-content/uploads/2014/07/Authentic-Motion-Animation-Google-design-guidelines-207x117.png 207w" sizes="(max-width: 1280px) 100vw, 1280px" /></a><p class="wp-caption-text">ガイドラインの一例</p></div>

<p>さらにAndroidの開発ライブラリはもちろん、後半で紹介するPaper Elementsが、ガイドラインを体現した実装として存在しています。具体的なガイドラインと、それを反映した実装の2つが揃うことによって、Material Designのガイドラインは、他のデザインガイドラインよりも確かで、強固なものになっています。</p>

<h3>Google I/O でのセッション</h3>

<ul>
<li><a href="https://www.youtube.com/watch?v=isYZXwaP3Q4" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google I/O 2014 &#8211; Material design principles &#8211; YouTube</a></li>
<li><a href="https://www.youtube.com/watch?v=dZqzz5lZFvo" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google I/O 2014 &#8211; Material design: Structure and components &#8211; YouTube</a></li>
<li><a href="https://www.youtube.com/watch?v=ctzWKRlTYHQ" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google I/O 2014 &#8211; Material design: Visual style and imagery &#8211; YouTube</a></li>
<li><a href="https://www.youtube.com/watch?v=FBD0VlcVS1E" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google I/O 2014 &#8211; Material design: Motion &#8211; YouTube</a></li>
</ul>

<p>キーノートの中で紹介されたMaterial Designですが、その後のセッションでもテーマごとに、詳細な内容の紹介がありました。より深く理解したい方は、これらの動画もチェックしてみると面白い話が聞けるはずです。（YouTubeでは英語字幕が表示されるので、聞きやすいです）</p>

<h2>Webで実現するためのPolymerとPaper Elements</h2>

<p>ここまでMaterial Designについて紹介しましたが、いよいよこのデザイン原則をWebの世界に取り込むため、PolymerとPaper Elementsについて説明します。</p>

<p>はじめに<a href="http://www.polymer-project.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Polymer</a>とは、<a href="https://html5experts.jp/1000ch/8906/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Componentsが変えるWeb開発の未来</a>で説明されたWeb Componentsをより強力に、より柔軟に使えるようにGoogleで開発されているラッパーライブラリです。Web Componentsが注目を集め始めたのと同時に、Polymerの話題も多く目にするようになっています。</p>

<p>Polymerには、そのラッパーとしての機能を活かして作成された、汎用コンポーネント群があります。それが<a href="http://www.polymer-project.org/docs/elements/core-elements.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Core Elements</a>と<a href="http://www.polymer-project.org/docs/elements/paper-elements.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Paper Elements</a>です。このうち、Paper ElementsがMaterial DesignをWebで表現するための鍵になりますが、実際に開発するにはPolymer本体に、これらCore ElementsとPaper Elementsを組み合わせて利用します。</p>

<p>ここでは、Rob Dodsonによる<a href="https://www.youtube.com/watch?v=HKrYfrAzqFA" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Unlock the next era of UI development with Polymer</a>というセッション（<a href="http://www.slideshare.net/rob_dodson/unlock-the-next-era-of-ui-design-with-polymer" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SlideShare</a>）の内容を参考に紹介していきます。</p>

<h3>レイアウトを構築する</h3>

<p>はじめにCore Elementsを使ったアプリケーションのレイアウトについて紹介します。Core Elementsには、一般的なナビゲーションパターンのレイアウトを、手軽に制御できるコンポーネントが用意されています。</p>

<p>たとえば<a href="http://www.polymer-project.org/docs/elements/core-elements.html#core-header-panel" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>core-header-panel</code></a>を利用すると、よくある固定ヘッダーとコンテンツ部分の管理ができます。これまで、普通にHTMLとCSSでレイアウトして、インナースクロール用のJavaScriptライブラリを組み込んで実現していたUIが、ひとつのコンポーネントをHTML内に取り込むだけで作れるようになります。</p>

<div id="attachment_9347" style="width: 648px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-27-638.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-27-638.jpg" alt="core-drawer-panel (参考スライドP27から引用)" width="638" height="359" class="size-full wp-image-9347" srcset="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-27-638.jpg 638w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-27-638-300x168.jpg 300w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-27-638-207x116.jpg 207w" sizes="(max-width: 638px) 100vw, 638px" /></a><p class="wp-caption-text">core-drawer-panel (参考スライドP27から引用)</p></div>

<p>上図のようなドロワーメニューを内包したレスポンシブなレイアウトも、<a href="http://www.polymer-project.org/docs/elements/core-elements.html#core-drawer-panel" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>core-drawer-panel</code></a>を利用すると、<code>drawer</code>と<code>main</code>という属性をそれぞれ持った要素を、子要素として追加すれば容易に制御できます。</p>

<p>もうひとつレイアウトするための強力な機能が存在します。それが<a href="http://www.polymer-project.org/docs/polymer/layout-attrs.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Layout attributes</a>です。これはPolymer本体に備えられた機能です。</p>

<div id="attachment_9348" style="width: 648px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-35-638.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-35-638.jpg" alt="layout属性 (参考スライドP35から引用)" width="638" height="359" class="size-full wp-image-9348" srcset="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-35-638.jpg 638w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-35-638-300x168.jpg 300w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-35-638-207x116.jpg 207w" sizes="(max-width: 638px) 100vw, 638px" /></a><p class="wp-caption-text">layout属性 (参考スライドP35から引用)</p></div>

<p>このように、<code>layout</code>属性を付与して、要素を並べる方向（<code>vertical</code>, <code>horizontal</code>）や、子要素に<code>flex</code>などの指定を行うことで、CSSを使わずにHTML側で基本的なレイアウトを制御できます。ここでは一例を紹介しましたが、詳細はPolymerのドキュメントを確認してみてください。</p>

<h3>Material Designを使う</h3>

<p>いよいよPaper Elementsが登場します。Core Elementsが基本的な機能と素朴な見た目しか持たない汎用コンポーネント群であるのに対して、Paper Elementsは<a href="http://www.google.com/design/spec/components/bottom-sheets.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Material Designのガイドライン</a>におけるUIコンポーネントを、ビジュアルとインタラクションの両面において実装しています。</p>

<p>たとえば<code>paper-tabs</code>は、次の画像のようなマークアップでMaterial Designで表現されたタブのUIを組み込むことができます。</p>

<div id="attachment_9346" style="width: 648px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-44-638.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-44-638.jpg" alt="paper-tabs (参考スライドP44から引用)" width="638" height="359" class="size-full wp-image-9346" srcset="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-44-638.jpg 638w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-44-638-300x168.jpg 300w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-44-638-207x116.jpg 207w" sizes="(max-width: 638px) 100vw, 638px" /></a><p class="wp-caption-text">paper-tabs (参考スライドP44から引用)</p></div>

<p>このようなPaper ElementsのUIコンポーネントは<a href="http://www.polymer-project.org/components/paper-elements/demo.html#paper-checkbox" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Paper Elements Sampler</a>で動作デモを確認できます。</p>

<p>Material Designは影や波紋のようなエフェクトといったインタラクションも重要です。Paper Elementsの中にはそのような、特定のUIを表現するものではなく、エフェクトを適用するための要素も用意されています。</p>

<div id="attachment_9345" style="width: 648px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-47-638.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-47-638.jpg" alt="paper-shadow (参考スライドP47から引用)" width="638" height="359" class="size-full wp-image-9345" srcset="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-47-638.jpg 638w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-47-638-300x168.jpg 300w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-47-638-207x116.jpg 207w" sizes="(max-width: 638px) 100vw, 638px" /></a><p class="wp-caption-text">paper-shadow (参考スライドP47から引用)</p></div>

<p><a href="http://www.polymer-project.org/docs/elements/paper-elements.html#paper-shadow" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>paper-shadow</code></a>は親要素に、<code>z</code>属性で指定されたコンテンツの深度に応じて、適切な影の表現をつけられます。Material Designでは、影を表現するために、深さを表現するKey Shadowと、オブジェクトの形態を示すAmbient Shadowの2つが使われています。この<code>paper-shadow</code>もCSSの<code>box-shadow</code>で2種類の影をかさねて表現しています。</p>

<p>前半で説明したとおり、Material Designにおける影は、ただの装飾ではなく、オブジェクトの階層やユーザーのフォーカスを得るための、意図的な表現です。多くのオブジェクトに、このようなエフェクトを積極的に使っていくことになります。</p>

<div id="attachment_9344" style="width: 648px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-46-638.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-46-638.jpg" alt="paper-ripple (参考スライドP46から引用)" width="638" height="359" class="size-full wp-image-9344" srcset="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-46-638.jpg 638w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-46-638-300x168.jpg 300w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-46-638-207x116.jpg 207w" sizes="(max-width: 638px) 100vw, 638px" /></a><p class="wp-caption-text">paper-ripple (参考スライドP46から引用)</p></div>

<p><a href="http://www.polymer-project.org/docs/elements/paper-elements.html#paper-ripple" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>paper-ripple</code></a>は親要素に、clickやtouchしたときのエフェクトを適用できます。<a href="http://www.polymer-project.org/components/paper-ripple/demo.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">デモ</a>を見ると、それがどのような効果か分かりやすいはずです。このエフェクトは、親の要素と同じサイズの<code>canvas</code>を展開して、その上で波紋のようなエフェクトを表現しています。</p>

<h3>スタイルを適用する</h3>

<p>Polymerの要素は、Shadow DOMが使われているため、従来どおりのCSSセレクタでは、内側の要素にスタイルを適用できません。ここでは<a href="http://dev.w3.org/csswg/css-scoping/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Scoping Module</a>として定義されている、<code>::shadow</code>と<code>/deep/</code>セレクタを紹介します。</p>

<p><code>::shadow</code>は、疑似要素としてShadow DOMのルートにアクセスできます。次の例では、Polymerで作られた<code>x-foo</code>が持つShadow DOM内の<code>span</code>にアクセスして、<code>color: red</code>を指定しています。</p>

<p></p><pre class="crayon-plain-tag">&lt;style&gt;
x-foo::shadow span {
  color: red;
}
&lt;/style&gt;

&lt;polymer-element name="x-foo" noscript&gt;
  &lt;template&gt;
    &lt;span&gt;Hi!&lt;/span&gt; &lt;!-- color: red --&gt;
  &lt;/template&gt;
&lt;/polymer-element&gt;

&lt;x-foo&gt;&lt;/x-foo&gt;</pre><p></p>

<p><code>/deep/</code>は、<code>::shadow</code>と同じくShadow DOM内へのアクセスを可能にしますが、より強力にネストしたShadow DOMの奥深くまで適用できます。次の例では、<code>x-hello</code>の中にあるすべての<code>span</code>に<code>color:blue</code>を適用しています。<code>::shadow</code>の場合だと、<code>x-world</code>の中の<code>span</code>にはネストしたShadow DOMの境界を越えられず適用されません。</p>

<p></p><pre class="crayon-plain-tag">&lt;style&gt;
x-hello /deep/ span {
  color: blue;
}
&lt;/style&gt;

&lt;polymer-element name="x-hello" noscript&gt;
  &lt;template&gt;
    &lt;span&gt;Hello&lt;/span&gt; &lt;!-- color: blue --&gt;
    &lt;x-world&gt;&lt;/x-world&gt;
  &lt;/template&gt;
&lt;/polymer-element&gt;

&lt;polymer-element name="x-world" noscript&gt;
  &lt;template&gt;
    &lt;span&gt;World&lt;/span&gt;  &lt;!-- color:blue --&gt;
  &lt;/template&gt;
&lt;/polymer-element&gt;

&lt;x-hello&gt;&lt;/x-hello&gt;</pre><p></p>

<p>一方、Core ElementsにはPolymerの要素間でスタイルを共有するために、<a href="http://www.polymer-project.org/docs/elements/core-elements.html#core-style" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>core-style</code></a>というコンポーネントが用意されています。</p>

<div id="attachment_9341" style="width: 648px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-58-638.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-58-638.jpg" alt="core-style (参考スライドP58から引用)" width="638" height="359" class="size-full wp-image-9341" srcset="/wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-58-638.jpg 638w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-58-638-300x168.jpg 300w, /wp-content/uploads/2014/07/unlock-the-next-era-of-ui-design-with-polymer-58-638-207x116.jpg 207w" sizes="(max-width: 638px) 100vw, 638px" /></a><p class="wp-caption-text">core-style (参考スライドP58から引用)</p></div>

<p><code>core-style</code>を使って<code>id</code>属性が指定されたStyle Producerで定義されたスタイルを、<code>ref</code>属性を指定してStyle Consumerから参照することで、コンポーネントをまたいで特定のスタイルを共有できます。</p>

<h3>トランジションを利用する</h3>

<p><a href="http://www.polymer-project.org/docs/elements/core-elements.html#core-animated-pages" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>core-animated-pages</code></a>を利用すると、Single Page Applicationのように、ひとつのHTMLで複数のコンテンツを切り替えて表示するときに、トランジションを適用できます。<code>core-animated-pages</code>も、対象の要素に属性を付与するだけで、トランジション効果を得られます。</p>

<p></p><pre class="crayon-plain-tag">&lt;polymer-element name="animated-sample" noscript&gt;
  &lt;template&gt;
    &lt;style&gt;
      section &gt; div { color:white; height: 500px; }
    &lt;/style&gt;

    &lt;!-- コンテンツ切り替え用のタブ --&gt;
    &lt;paper-tabs id="tabs" selected="0"&gt;
      &lt;paper-tab&gt;ONE&lt;/paper-tab&gt;
      &lt;paper-tab&gt;TWO&lt;/paper-tab&gt;
      &lt;paper-tab&gt;THREE&lt;/paper-tab&gt;
    &lt;/paper-tabs&gt;

    &lt;!-- コンテンツとトランジション付与 --&gt;
    &lt;core-animated-pages
      selected="{{$.tabs.selected}}"
      transitions="cross-fade-all"&gt;
      &lt;section&gt;
        &lt;div style="background:red"&gt;
          &lt;h1&gt;ONE&lt;/h1&gt;
        &lt;/div&gt;
      &lt;/section&gt;
      &lt;section&gt;
        &lt;div style="background:blue"&gt;
          &lt;h1&gt;TWO&lt;/h1&gt;
        &lt;/div&gt;
      &lt;/section&gt;
      &lt;section&gt;
        &lt;div style="background:orange"&gt;
          &lt;h1&gt;THREE&lt;/h1&gt;
        &lt;/div&gt;
      &lt;/section&gt;
    &lt;/core-animated-pages&gt;
  &lt;/template&gt;
&lt;/polymer-element&gt;

&lt;animated-sample&gt;&lt;/animated-sample&gt;</pre><p></p>

<p><code>core-aniamted-pages</code>の<code>transitions</code>属性で、使いたいトランジションの種類を宣言すると、中のコンテンツが切り替わるときにトランジションが適用されます。</p>

<h3>Paper Elementsのサンプルアプリ</h3>

<p>Paper Elementsを駆使することで、Material DesignがWebでどのように表現されるのかは、<a href="http://www.polymer-project.org/apps/topeka/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Topeka</a>というサンプルのクイズアプリが用意されています。スマートフォンにも対応しているので、モバイルデバイスでどの程度動いてくれるのかも、自分でさわって確かめてみると面白いはずです。</p>

<div id="attachment_9363" style="width: 1290px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/Quiz-App.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/Quiz-App.png" alt="http://www.polymer-project.org/apps/topeka/" width="1280" height="728" class="size-full wp-image-9363" srcset="/wp-content/uploads/2014/07/Quiz-App.png 640w, /wp-content/uploads/2014/07/Quiz-App-300x170.png 300w, /wp-content/uploads/2014/07/Quiz-App-1024x582.png 1024w, /wp-content/uploads/2014/07/Quiz-App-207x117.png 207w" sizes="(max-width: 1280px) 100vw, 1280px" /></a><p class="wp-caption-text">http://www.polymer-project.org/apps/topeka/</p></div>

<h2>さいごに</h2>

<p>今回はMaterial Designとそれを実現するPolymerとPaper Elementsについて、Google I/O 2014での情報をもとにご紹介しました。Material DesignもPolymerも、Preview版というステータスであり、まだ始まったばかりのプロジェクトです。これらが、今後どのように普及し、Webの世界にも影響を与えていくのか楽しみに思います。</p>

<p>先日開催された第49回HTML5とか勉強会でも「Material Design with Polymer」と題して、同じようなテーマについてご紹介しました。<a href="http://youtu.be/G7hIDm4aK5g?t=1h25m43s" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">YouTube</a>と<a href="https://speakerdeck.com/ahomu/material-design-with-polymer" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SpeakerDeck</a>でそれぞれ当日の録画とスライドが公開されているので、こちらも合わせてご覧いただけると理解が深まるはずです。Material Designについて詳しく説明していたり、Paper Elementsを利用したオリジナルのデモを行っていたりもしますので、ぜひご覧ください。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Google I/O 2014 特集]]></series:name>
	</item>
	</channel>
</rss>
