<?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>jQuery &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/jquery/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>【エキスパートガチトーク】Web技術の未来を「Extensible Web」から探る！ (前編)─HTML5は問題だらけ？</title>
		<link>/shumpei-shiraishi/16597/</link>
		<pubDate>Thu, 03 Sep 2015 01:00:26 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Application Cache]]></category>
		<category><![CDATA[Extensible Web]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">/?p=16597</guid>
		<description><![CDATA[読者の皆様は、「Extensible Web」というキーワードについてご存知でしょうか。 Extensible Webは、現在のWebが抱える大きな問題点を解決しようとする考え方であり、ムーブメントです。 その問題点とは...]]></description>
				<content:encoded><![CDATA[<p><style>
.post-detail-contents p {
  text-indent: 0;
  clear: left;
}
b.speaker.komatsu {
  background: url('/wp-content/uploads/2015/08/komatsu.png') no-repeat;
  background-size: 48px;
}
b.speaker.shiraishi {
  background: url('/wp-content/uploads/2015/08/shiraishi.png') no-repeat;
  background-size: 48px;
}
b.speaker.saito {
  background: url('/wp-content/uploads/2015/08/saito.png') no-repeat;
  background-size: 48px;
}
b.speaker.daniel {
  background: url('/wp-content/uploads/2015/08/daniel.png') no-repeat;
  background-size: 48px;
}
b.speaker.asai {
  background: url('/wp-content/uploads/2015/08/asai.png') no-repeat;
  background-size: 48px;
}
b.speaker {
  display: inline-block;
  width: 48px;
  height: 18px;
  float: left;
  padding-right: 8px;
  padding-top: 48px;
  text-align: center;
  font-size: 12px;
  margin-bottom: 4px;
  font-weight: normal;
  clear: left;
}
p {
  overflow: hidden;
}
</style></p>

<p>読者の皆様は、「<strong>Extensible Web</strong>」というキーワードについてご存知でしょうか。</p>

<p>Extensible Webは、現在のWebが抱える大きな問題点を解決しようとする考え方であり、ムーブメントです。
その問題点とは、誤解を恐れず言うなら、「HTML5の流れで生み出された様々なAPIが実際にはあまり使われておらず、役に立っていない」という点に尽きると思います。</p>

<p>Extensible Webはそうした問題を解決するために、「開発者によって拡張可能なWebを目指そう」と呼びかけます。そのために必要なのは、特定のユースケースを想定した粒度の粗いAPIではなく、粒度が細かく、より基本的な機能を提供する低レベルなAPIを提供することで、開発者が様々なライブラリを作りやすくすることです。詳しくは<a href="https://html5experts.jp/iwase/10825/" data-wpel-link="internal">こちらの記事</a>も参考にしてください。</p>

<p><img src="/wp-content/uploads/2015/08/DSC_0199.png" alt="" width="640" height="415" class="aligncenter size-full wp-image-16713" srcset="/wp-content/uploads/2015/08/DSC_0199.png 640w, /wp-content/uploads/2015/08/DSC_0199-300x195.png 300w, /wp-content/uploads/2015/08/DSC_0199-207x134.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>Extensible Webは、「<a href="https://extensiblewebmanifesto.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Extensible Web Manifesto</a>」というマニフェストが公開されてから広く世に知られるようになりました。<a href="https://github.com/extensibleweb/manifesto/blob/master/README.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Extensible Web Manifestoの文書がGitHub上で公開されたのが2013年6月9日</a>ですので、既に2年以上が経過していることになります。本対談では、Extensible Webが誕生してから2年で何が変わったのか、そしてこれからWebはどうなっていくのかを、有識者の方々にそれぞれの立場から語っていただこうという発想で企画しました。</p>

<p>標準化団体のスタッフがどんな目線でWebを見ているのか、ブラウザベンダが開発者に求めているものは何か、Web標準にも詳しいエキスパートが現在のWebをどう捉えているかなど、普段聞けない話がいっぱいです！前後編でお届けしますので、どうかお楽しみくださいませ。</p>

<p>ちなみに、前編は全体的に、HTML5や関連（あまり知られていないかもしれない）APIを広範に<s>disる</s>批評するという流れになってしまったので、ちょっとマニアックかもしれません…あしからず。</p>

<h2>自己紹介</h2>

<p><b class="speaker shiraishi">白石</b> 皆さん、本日はお集まりいただき、ありがとうございます。非常に豪華なメンバーにお集まりいただき、誠に光栄です。今日は脱線大歓迎というノリで、自由闊達にExtensible Web、そしてWeb全体について語っていただきたいと思います。ではまずは、自己紹介からお願いできますでしょうか。</p>

<p><b class="speaker komatsu">小松</b> 小松と申します。通信会社（NTTコミュニケーションズ）でWebに関する研究開発をしておりまして、最近ではWebRTCやIoT/WoTに関する開発、標準化活動をやっています。</p>

<p><b class="speaker asai">浅井</b> Mozilla Japanの浅井です。最近はエヴァンジェリストとしてWeb技術に関して開発者の皆さんの前でお話したり、モバイル＆エコシステムマネージャーとして、パートナーさんとの協業を促進しています。<a href="http://au-fx.kddi.com/products/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Fx0</a>というスマートフォンの開発や、FirefoxOSを搭載した<a href="http://panasonic.jp/viera/firefox/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ビエラ</a>の開発をお手伝いしたりなど、パートナーさんと「Webを使ったものづくり」を広げていく仕事をしています。</p>

<p><b class="speaker shiraishi">白石</b> ビエラって、FirefoxOS積んでるんですか。知らなかった…。</p>

<p><b class="speaker saito">斉藤</b> 株式会社<a href="http://www.rich.co.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">リッチメディア</a>で、主にメディア事業に携わりながら、対外的にはUXエンジニアとして活動しています。ここにいる皆さんは、標準化に近いところで働いていらっしゃる方が多いと思いますが、僕は一番現場に近いところで実装寄りの仕事をしているんじゃないかな。</p>

<p><b class="speaker daniel">ダニエル</b> W3Cのダニエル・デイビスと申します。半分はTV・ビデオ関係の仕事を、もう半分はマーケティングやコミュニケーション、特に開発者向けに標準をどう伝えていくかといったことを担当しています。特に最近注目しているのはセキュリティです。今セキュリティに関する仕様書がたくさん増えているので、そうした情報を開発者に伝えるにはどうしたらいいかを考えています。</p>

<h2>Extensible Web以前 &#8211; Application Cacheの失敗</h2>

<p><b class="speaker shiraishi">白石</b> では、Extensible Webが出てもう2年が過ぎたわけですが、そもそもExtensible Web以前は何が問題だったのでしょうか？例えば、標準化の失敗例としては <strong>Application Cache</strong> (※) がよく引き合いに出されますね。AppCacheの何がいけなかったのでしょう？</p>

<p><b class="speaker komatsu">小松</b> 使えるシーンが限られていたのが一番の問題じゃないかと思います。数ページ程度の静的なWebサイトならいいんだけど、ページ数が増えたり、ちょっと複雑になるととたんに使えなくなっちゃう。あと、キャッシュのバージョン管理が面倒臭かったですね。</p>

<p><b class="speaker saito">斉藤</b> アプリケーションキャッシュのファイルのバージョンを書き換えるGruntタスク、なんてのもあったりしますが、「勘弁してくれよ」って感じですね(笑)
キャッシュが更新されるタイミングもブラウザによってまちまちですし。</p>

<p><b class="speaker shiraishi">白石</b> 実務だと、キャッシュの最大容量とかもよく問題になりましたね。巨大な動画ファイルとかはキャッシュされなかったり、キャッシュの最大容量を知ろうと思っても知る手段すらない、とか。</p>

<p><b class="speaker daniel">ダニエル</b> 「オフラインの場合はキャッシュを、オンラインの場合はWeb上にある最新のリソースを使う」といったユースケースにも対応できていませんでしたね。</p>

<p><b class="speaker saito">斉藤</b> 仕様としても、結構珍しいかなと思いますね。長くWeb屋をやっていますが、1ファイル（マニフェストファイル）だけ用意すれば、あとはブラウザがうまくやってくれる…という仕様は他に見たことがありません。
<br><br>
JavaScriptのAPIは、だいたいにおいてPolyfill (※)を用意できるように作られていて、レガシーなブラウザの上でも動作をエミュレートできるようにしてあるものが多い。でもアプリケーションキャッシュの場合は、使うか使わないかの「ゼロイチ」を要求される。APIではなく、いきなりプラットフォームを作りにいったという感じがありますね。</p>

<p><b class="speaker shiraishi">白石</b> 僕、Google Gears（※）っていう技術の本を書いたことがあって、そういうのだけよく知ってるんですが、Gearsの仕様を参考に作られたからこんなことになったんだと思ってます…どうでもいい話ですが。。</p>

<p><small>
※ Application Cache…Webサイトをオフラインでも利用できるようにする仕組み。マニフェストファイルというファイルを一枚用意するだけで、キャッシュの管理はすべてブラウザが行ってくれるというのがウリの一つ。</p>

<p>※ Polyfill…新しいAPIをJavaScriptで実装し、非対応ブラウザでもそのAPIを使えるようにするもの。有名なところでは、Web Componentsを古いブラウザでも利用可能にする「Polymer」などがある。</p>

<p>※ Google Gears…Googleが昔開発していた、オフラインWebアプリを実現するブラウザプラグイン技術。Application CacheやWebSQL Database、Web Workersなど、HTML5関連APIの仕様策定に参照され、HTML5がメジャーになると開発が終了された。
</small></p>

<p><img src="/wp-content/uploads/2015/08/DSC_0059.png" alt="" width="640" height="413" class="aligncenter size-full wp-image-16723" srcset="/wp-content/uploads/2015/08/DSC_0059.png 640w, /wp-content/uploads/2015/08/DSC_0059-300x194.png 300w, /wp-content/uploads/2015/08/DSC_0059-207x134.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>Webはアプリケーションプラットフォームになった</h2>

<p><b class="speaker shiraishi">白石</b> 他に、問題だったAPIとかありますか？</p>

<p><b class="speaker komatsu">小松</b> よく言われるのは <strong>contentEditable</strong> (※)ですね。</p>

<p><b class="speaker asai">浅井</b> ああ…死んでましたね。実装する側が(笑) 。「誰だ、こんな、実際には誰も使わないAPI作ったの」って開発者が文句言ってました(笑)。</p>

<p><b class="speaker shiraishi">白石</b> 確かそれって、IEかなんかで実装されていたのを仕様に起こしたって感じじゃありませんでしたっけ。</p>

<p><b class="speaker asai">浅井</b> そうかもしれませんね。「Webはみんなで作るもの」ってなる前の時代に作られた仕様という気がします。</p>

<p><b class="speaker saito">斉藤</b> ちょっと全般的な話になってしまうのですが、かつて単なる「ドキュメントレンダラー」だったWebブラウザが、HTML5のブームの中で、アプリケーションのランタイムへと変化していったという流れがあると思うんですよね。</p>

<p><b class="speaker shiraishi">白石</b> かつてはHTML5の仕様書の先頭の方にも、「アプリケーションプラットフォームを目指します」と書いてありましたしね。</p>

<p><b class="speaker daniel">ダニエル</b> それは今も変わっていませんね。W3CとしてはWebのことをオープン・ウェブ・プラットフォームと呼び表しつつ、プラットフォームがあまりに広くなりすぎているので、<a href="http://www.w3.org/blog/2014/10/application-foundations-for-the-open-web-platform/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Application Foundation（アプリケーション基盤）として8つのカテゴリに集中する</a>という動きをしています。</p>

<p><b class="speaker asai">浅井</b> ブラウザベンダ側からすると、JavaScriptを生み出した時点で「僕らはアプリケーションプラットフォームです」と言い続けていたんですよ。機能不足で、そうは見えなかったんでしょうが…ただ、それを目指していたというのはNetscapeの時代からありました（若い人向けの注: Netscape NavigatorというブラウザがFirefoxの前身）。
<br><br>
NetscapeがJavaScriptを動的な、拡張可能な言語として設計した時点から、Webはずっと拡張可能なプラットフォームです。なので、Extensible Webというキーワードには、<strong>（Webは拡張可能であるという）ブラウザベンダの思いを、Web開発者に伝わりやすいように言い直したという一面があるんじゃないか</strong>な、と思っています。</p>

<p><small>
※ contentEditable…任意の要素を、ユーザが編集可能な領域にすることのできる属性。<code>&lt;div contentEditable&gt;</code>とするだけで、簡単なWYSIWYGエディタを作成可能
</small></p>

<h2>disってない。disってないですよ</h2>

<p><b class="speaker shiraishi">白石</b> イマイチという評価のAPIとしては、他にもそういえば<strong>Web Storage</strong>（※）もありますね。同期型のAPIなので、ループの中とかで使っちゃうとUIスレッドがビジーになっちゃって、UIがもたついちゃったりフリーズしちゃったり、という。</p>

<p><b class="speaker komatsu">小松</b> 僕は割と好きなんですけどね。</p>

<p><b class="speaker saito">斉藤</b> ハードに使っちゃダメなんですよ。ちょっとした優しさのために使うべき(笑) 。例えばフォームの入力内容を入れておいて、ネットワークが切れた時でも失われないようにするとか、その程度。</p>

<p><b class="speaker daniel">ダニエル</b> 問題のあるAPIというと、<code>&lt;input type="date"&gt;</code>とかもそう。昔私はOperaにいたんですが、そこらへん（inputの様々なtype）をいち早く実装したのが自慢でした。でも開発者からのフィードバックとしては褒められるどころか、「（<code>&lt;input type="date"&gt;</code>使った時に）自動的に表示されるカレンダーのデザイン変えさせろ」でした(笑)。</p>

<p><b class="speaker saito">斉藤</b> Operaかわいそう(笑)。</p>

<p><b class="speaker asai">浅井</b> HTML5の発端（の一つ）だったのにね(笑) 。※</p>

<p><b class="speaker saito">斉藤</b> 僕は結局使ったことないですね(笑) 。デザインが合わないと、結局使いものにならないので。フォーム関係の仕様で言えば、<code>required</code>属性とか、<code>&lt;input type="email"&gt;</code>とか<code>&lt;input type="number"&gt;</code>とかはすごく助かりますよね。</p>

<p><b class="speaker komatsu">小松</b> モバイルで、タイプに合わせた最適なキーボードが出てきてくれるのが嬉しいですよね。</p>

<p><b class="speaker shiraishi">白石</b> ほかには、存在はするけどあんまり使われてない、ってAPIも多そうですよね。例えば<strong>Web Workers</strong>（※）とか。<strong>Shared Worker</strong>（※)なんてのもあったなあ…。</p>

<p><b class="speaker asai">浅井</b> いや、（Mozillaは）使ってますよ！</p>

<p><b class="speaker shiraishi">白石</b> いやまあ、一般のWeb技術者が使っているかというと、あんまり…という気がしますよね。他には…えーと…名前が出てこない。EventSourceとかいうAPI使うやつ。</p>

<p><b class="speaker komatsu">小松</b> <strong>Server Sent Events</strong>（※）だ。</p>

<p><br>
一同: ああーー</p>

<p><b class="speaker komatsu">小松</b> テキストしか扱えないし、サーバプッシュの用途だったら、他にWebSocketがあるから。HTTPサーバで事足りるっていうのはいいんですけどね。</p>

<p><b class="speaker daniel">ダニエル</b> WebSocketを使えないホスティングサービスの上で、「しょうがないから」Server Sent Events使ったということはありましたね(笑)。</p>

<p><b class="speaker shiraishi">白石</b> まあ、こういう風に、「あるけど使われてない」とか「あるけどイケてない」という仕様がいっぱいあって。</p>

<p><b class="speaker daniel">ダニエル</b> 他にももう一つ思い出しました。<strong>Network Service Discovery API</strong>（※）。W3Cスタッフとして言っていいかどうかわからないけど、あれはセキュリティの問題もあって、ちょっと残念な感じでした(笑)。</p>

<p><b class="speaker shiraishi">白石</b> でもこの対談、<strong>HTML5のAPIをdisる流れになってて、こんなの初めてで面白いなあ(笑)</strong>。</p>

<p><b class="speaker asai">浅井</b> disるように誘導してません？(笑)。</p>

<p><b class="speaker shiraishi">白石</b> いや、そんなつもりは…(汗) 。</p>

<p><small>
※ Web Storage…シンプルなローカルストレージAPI。<code>localStorage.setItem('key', 'value')</code>とするだけで、ローカルのストレージに値を保存できる。</p>

<p>※ WHATWGの取り組みの初期に、「<a href="https://whatwg.org/specs/web-forms/current-work/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Forms 2.0</a>」という仕様が提案されていた。</p>

<p>※ Web Workers, Shared Workers…Webブラウザ上でマルチスレッドプログラミングを可能にするAPI。</p>

<p>※ Server Sent Events…サーバプッシュを可能にするAPI。WebSocketとは異なり、HTTPサーバさえあれば動作する。</p>

<p>※ Network Service Discovery API…ネットワーク上のサービスを動的に発見するためのAPI。ホームネットワーク上で、デバイスを発見する用途に利用できるとされていた。
</small></p>

<h2>プレフィックスの反省を活かす</h2>

<p><b class="speaker shiraishi">白石</b> あと、Extensible Webの情報漁ってた時に「<strong>Indexed Database API</strong>（※）は、開発者のフィードバックを受けながら作った素晴らしいAPI」と書いてあったんですが、正直同意できない(笑) 。かなり使いにくいAPIだと思うんだけど…。</p>

<p><b class="speaker asai">浅井</b> えーと、いや、それは、<strong>申し訳ない</strong>。だいぶうちら（Mozilla）が推進しちゃって(笑)。</p>

<p><b class="speaker komatsu">小松</b> 一番最初に実装してなかったけ？</p>

<p><b class="speaker asai">浅井</b> してました(笑)。 （それ以前に提案されていた）<strong>WebSQL Database</strong>（※）なんて、標準化されていないSQLiteの仕様に依存してて全然ダメだ、と。</p>

<p><b class="speaker shiraishi">白石</b> いや、その主張は同意できたんですけど、できあがってみたIndexed Database APIの仕様がこれかーー、と(笑)。</p>

<p><b class="speaker asai">浅井</b> いやでもまあ、Extensibleではあるじゃないですか。プリミティブで、パフォーマンスも上げられるAPIは一応揃っていて。APIの使い勝手については、申し訳ない、ライブラリ使ってくださいと。MDN (Mozilla Developer Network) に掲載されているIndexed Database APIの解説でも、「<a href="https://github.com/mozilla/localForage" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">localForage</a>か<a href="http://www.dexie.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">dexie.js</a>を使ってください。<strong>そっちのほうが『More user friendlyだから』</strong>と」と<a href="https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">書いてあります</a>(笑)。</p>

<p><b class="speaker daniel">ダニエル</b> 素で使うのが厳しいという意味では、<strong>WebGL</strong>（※）とかもそうですよね。ラッパーライブラリがないとコーディングは厳しいけど、プリミティブでパフォーマンスの高いAPIを提供している。</p>

<p><b class="speaker asai">浅井</b> そういう点から言うと、<strong>Extensible Webの考え方があと数年早かったら、Web Audio API（※）じゃなくて、Mozillaが作っていたAudio Data APIだったんじゃないかな</strong>、と思いますね。プリミティブなAPIを提供して、ライブラリはJavaScriptで作ればいいじゃん、と、そういう発想で作られていたAPIだったんです。</p>

<p><b class="speaker komatsu">小松</b> さっき話に上がってたWebSQL Databaseは、実はまだ結構使われてたりする。</p>

<p><b class="speaker asai">浅井</b> ああ、結構ありますね。たまにユーザから「動きません」ってフィードバックもらって、見てみるとWebSQL Databaseのせいだったりする。WebKitがWebSQLを実装したあたりで、急にみんなが新しいWebの機能を使い出して、そのままになってるサイトが多いんですよね。</p>

<p><b class="speaker shiraishi">白石</b> <strong>それは、<code>-webkit-</code>プレフィックスに依存したサイトが未だに大量にある、って問題とも繋がってますよね。</strong></p>

<p><b class="speaker asai">浅井</b> そうなんですよ… <strong>プレフィックス付けてる間に開発者からの意見を取り入れていこう、というシナリオをブラウザベンダは考えていたのですが、開発者たちは便利なものがあれば使ってしまう</strong>。我々（ブラウザベンダ）が考えていたようには、うまくいきませんでした。かと言って、ブラウザベンダ自らがライブラリを作って提案したりしても、使われるのは最初だけで、すぐ使われなくなったりしてしまう。だから、ライブラリを作りやすくして開発者の意見を取り込みやすくしていこうというのがExtensible Webの目標の一つです。プレフィックスの失敗も、反省の一つだと思うんですよね。</p>

<p><small>
※ Indexed Database API…ブラウザ上で利用できるキー・バリュー・ストレージ。Web Storageに比べると複雑だが高機能。</p>

<p>※ Web SQL Database…ブラウザ上で利用できるリレーショナル・データベース。SQLiteというデータベース実装の使用を前提としていたことが標準仕様としては不適格という理由で、今は非推奨に。</p>

<p>※ WebGL…ブラウザ上で利用できる3Dグラフィック用API。</p>

<p>※ Web Audio API…ブラウザ上で利用できる音声操作API。</p>

<p>※ Audio Data API…音声操作のAPIとして、Mozillaが仕様策定と実装を進めていたが、標準化の過程でWeb Audio APIに一本化された。</p>

<p></small></p>

<h2>Extensible Webの起源はjQueryにあり？</h2>

<p><b class="speaker komatsu">小松</b> あと、Extensible Web以前という話で言うと、4年前にサンタクララで行われたTPAC（※）のブレークアウトセッションの中で、「<strong>開発者とW3Cがうまく関わっていくにはどうしたらいいか</strong>」という議論をしたのを覚えています。そこで、開発者が中心になってWebを伸ばしていくという話で、jQueryの例が取り上げられていました。
<br><br>
で、（DOM操作に）セレクタを使用するというのがWeb開発者に受け入れられるというのが判明したので、パフォーマンスの問題を解決するために、ネイティブで<code>querySelector API</code>（※）が実装されたと。ここではフィードバックループがうまく働いたので、こういう例をどんどん増やしていこうという話がありまして、こういう流れがExtensible Webに繋がったのかなあ、と思います。</p>

<p><b class="speaker daniel">ダニエル</b> jQueryの話が出たところで、一ついいですか？Extensible Webとは全然関係ないんだけど。</p>

<p><b class="speaker shiraishi">白石</b> なんですか？</p>

<p><b class="speaker daniel">ダニエル</b> …<strong>小松さん、John Resig（※）に似てない？</strong></p>

<p><b class="speaker saito">斉藤</b> ああー、ググって出てきた写真で見ると、ちょうど黄色のやつに似てる。<a href="https://admin.thefutureofevents.com/assets/speaker/images/516/medium/JResig_(1).jpg?1408528451" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">黄色いJohn Resig</a>。</p>

<p><br>
一同: (爆笑)</p>

<p><img src="/wp-content/uploads/2015/08/DSC_0064.png" alt="" width="640" height="420" class="aligncenter size-full wp-image-16722" srcset="/wp-content/uploads/2015/08/DSC_0064.png 640w, /wp-content/uploads/2015/08/DSC_0064-300x197.png 300w, /wp-content/uploads/2015/08/DSC_0064-207x136.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker daniel">ダニエル</b> すいません、脱線しまして…。</p>

<p><b class="speaker shiraishi">白石</b> いえいえ、最初にお伝えしたように、脱線大歓迎です。この、「黄色いJohn Resig」の話も、記事に含めさせていただきます(笑)。</p>

<p>ではここらで一旦まとめますと、まずjQueryをきっかけとして<code>querySelector API</code>が出てきたといった流れがあり、これは実際に役立つAPIとして世界中で利用されているし、jQuery、もしくは類似ライブラリのパフォーマンス向上にも一役買っている。</p>

<p>一方で、Webプラットフォームには今やたくさんAPIがあるけど、使われていないものや、イケてないものもたくさんあると。こうした問題を解決する一つの糸口として、<code>querySelector API</code>が生み出された経緯をヒントにしつつ、現在のExtensible Webというムーブメントに繋がっている…という流れでしょうか。</p>

<p><strong>（以後、後編に続く）</strong></p>

<p><small>
※ TPAC…W3Cが主催する、Web標準技術に関するカンファレンス。</p>

<p>※ querySelector API…今すぐ開発者ツールのコンソールを開いて、<code>document.querySelector('任意のセレクタ')</code>を実行してみるべし。</p>

<p>※ John Resig…jQueryを作った人。
</small></p>
]]></content:encoded>
			</item>
		<item>
		<title>Webアニメーションを高速化するために知っておくべき10のこと（後編）</title>
		<link>/cssradar/2669/</link>
		<pubDate>Thu, 26 Sep 2013 22:00:07 +0000</pubDate>
		<dc:creator><![CDATA[斉藤 祐也]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[アニメーション]]></category>
		<category><![CDATA[パフォーマンス]]></category>

		<guid isPermaLink="false">/?p=2669</guid>
		<description><![CDATA[連載： パフォーマンスチューニング (8)前編から引き続き、後編でも最適化のために知っておきたいレンダリングプロセス、計測方法、そして最適化を妨げるよくあるアクシデントとその回避方法について紹介していきます。 アニメーシ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/performance-tech/" class="series-149" title="パフォーマンスチューニング" data-wpel-link="internal">パフォーマンスチューニング</a> (8)</div><p><a href="https://html5experts.jp/cssradar/2027/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">前編</a>から引き続き、後編でも最適化のために知っておきたいレンダリングプロセス、計測方法、そして最適化を妨げるよくあるアクシデントとその回避方法について紹介していきます。</p>

<h2>アニメーションを高速化するために知っておきたいレンダリングプロセス</h2>

<p>ブラウザがどのようにウェブサイトを表示しているのかを知ることは、アニメーションだけに限らず、Webのパフォーマンス全体の高速化を行うために大切なステップです。
イスラエルの開発者であるTali Garsiel氏が公開した『<a href="http://taligarsiel.com/Projects/howbrowserswork1.htm" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">How Browsers Work</a>』は、<a href="http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Rocksに転載</a>され、複数の日本語訳も提供されている、ブラウザの内部動作を学ぶために読んでおきたいリソースの1つです。
そのリソースを参考に、レンダリングエンジンのメインフローについて見ていきましょう。</p>

<p>ブラウザはまずHTMLドキュメントを解析し、HTMLタグをコンテント・ツリーと呼ばれるDOMノードに変換します。そして外部CSSやスタイル要素に含まれるスタイルに関するデータを解析し、レンダーツリーを作成します。<br />
このレンダーツリーが色や大きさのような情報を持つ矩形を持っています。 </p>

<p>ここから先が特にアニメーションのパフォーマンスに関わりの深いフローになりますが、レンダーツリーが作成された後、レイアウト(リフロー)と呼ばれるプロセスに入り、そしてペイントがそれに続きます。</p>

<p>ここでは非常に大まかな流れしか解説しませんが、Paul Irish氏が言うとおり、ブラウザがHTMLやCSSを画面に表示するまでのフローを理解することは、開発におけるベストプラクティスの背後にある根拠を理解する手助けとなります。少々慣れない用語が多いかもしれませんが、ぜひ先ほど紹介した記事を一読ください。</p>

<h2>アニメーション・ボトルネック: レイアウト(リフロー)</h2>

<p>Google ChromeやSafariなどのWebKit系ブラウザではレイアウト、FirefoxなどのGecko系ブラウザではリフローと呼ばれるプロセスは、パフォーマンス向上において大きな障害となるプロセスの1つです。<br />
Satoshi Ueyama氏が<a href="http://gyu.que.jp/sjs2007/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">2007年に『出張 Shibuya.js 24』にて発表した</a>際に使用した以下の動画で見ることができます。様々な大きさの矩形が徐々に配置されていくプロセスがレイアウト/リフローです。</p>

<p><a href="http://youtu.be/ZTnIxIA5KGw" title="Gecko Reflow Visualization" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Gecko Reflow Visualization</a></p>

<p>このレイアウトのプロセスを、どのように最小限に抑えることができるかが、アニメーションの高速化において大切なポイントになります。
レイアウトを引き起こす原因について、詳しくはTony Gentilcore氏による「<a href="http://gent.ilcore.com/2011/03/how-not-to-trigger-layout-in-webkit.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">How (not) to trigger a layout in WebKit</a>」を参考にしてください。<br />
記事のタイトルにもある通り、あくまでWebKit系ブラウザのみに限定されていますし、2011年の記事でもありますので、必ずレイアウトの発生を確認できるツールを利用して確認することをおすすめします。<br />
（執筆時点ではGoogle Chrome、Safariの開発者ツール、そして紹介記事から得た情報でしかありませんが、IE11の開発者ツールでもレイアウトの発生を確認できます）</p>

<h2>アニメーション・ボトルネック:ペイント</h2>

<p>やや乱暴ではありますが、ブラウザで何かを表示するということは、HTMLやCSSから得た情報を画像化して表示しているのと大きな差はないと言えます。　</p>

<p>CSS3がプロダクションレベルで利用されはじめた今、角丸やシャドウなどを画像を利用せずに表現することが当たり前になってきているかと思います。読み込む画像が少なくなれば、その画像を制作するコストも減り、画像の読み込みにかかるコストも減りますが、その代わりにブラウザがそのコストを背負ってくれているわけです（もちろん1対1の割合ではありませんが）。<br />
この後の段でアクシデントとして紹介しますが、すべてのスタイルが同じコストでペイントを行うわけではなく、また組み合わせによってコストが甚大になるケースもあるので注意が必要になります。</p>

<p>ブラウザは、表示領域をいくつかのタイルとしてレンダリングを行います。それぞれの個別のタイルごとにレンダリングをし、その結果をキャッシュしていきます。<br />
そのため、大きな領域でペイントを行うことを避ける必要があります。レイアウトと同様に、ペイントを行う範囲を最低限にしておくことがポイントになります。</p>

<h2>アニメーションのパフォーマンスの計測、デバッグツール/ワークフロー</h2>

<p>パフォーマンス最適化において、最も大事なことは計測することです。私自身もよく陥る失敗ですが、どこかで読んだから、以前はうまく回避できた問題だからと盲目的にそれらの情報を頼りにするのではなく、計測する方法をきちんと学び、計測を日々続けることがベストプラクティスです。</p>

<p>開発者ツールについての詳しい記事は今後本サイトで紹介される予定ですので、ここでは私が実際にアニメーションのパフォーマンスについて計測するのに利用しているツールとワークフローを、ほんの一部ですが紹介していきます。</p>

<p>パフォーマンス計測を行う上で欠かすことができないのが、Google Chrome Canaryの開発者ツールです。Chromeではなく、日々更新を続けていくCanaryを利用する理由は、計測ツールとしての機能の多さと深さがChromeとは異なるからです。</p>

<p>アニメーションの最適化という文脈においてタイムラインパネルは、エディタとブラウザの描画エリアと同じくらい見る画面です。 </p>

<p><img src="/wp-content/uploads/2013/09/devtool1.png" alt="devtool" width="668" height="425" class="aligncenter size-full wp-image-2803" srcset="/wp-content/uploads/2013/09/devtool1.png 640w, /wp-content/uploads/2013/09/devtool1-300x190.png 300w, /wp-content/uploads/2013/09/devtool1-207x131.png 207w" sizes="(max-width: 668px) 100vw, 668px" /></p>

<p>まずは上図の1、Framesタブに切り替えて、上図2のRecordボタンをクリックし、計測を行いたいアニメーションを実行します。 </p>

<p><img src="/wp-content/uploads/2013/09/devtool.recording.gif" alt="devtool.recording" width="896" height="491" class="aligncenter size-full wp-image-2671" /></p>

<p>すると、上図のような棒グラフが記録されていきます。その下にある表は棒グラフをより詳細にしたものです。<br />
棒グラフは、背が高ければ高いほど処理に時間がかかっているということになります。計測対象にもよりますが、グラフ上にある2本の線は30FPSと60FPSを示しています。60FPSを目指すのであれば、それ以上の高さになっている棒グラフの周りをドラッグすることで、下にある表にその選択したタイミング内の詳細情報を表示させることができるようになります。</p>

<p>表にある横グラフは、マウスオーバーさせることでその特定の処理についての詳細を見ることができます。<br />
レイアウトやペイントがどの範囲で行われているか、そしてそれにかかっている時間がどのくらいか、などの情報を確認することが可能です。<br />
これらの情報と最前にも紹介したレンダリングの仕組みの情報を踏まえて、トライアル&amp;エラーを繰り返し、最適化を図っていくのが大まかなワークフローとなります。</p>

<h2>アニメーションを遅くするよくあるアクシデント</h2>

<p>最後にアニメーションのパフォーマンス最適化を妨げる、よくある3つのアクシデントを紹介します。</p>

<p>1つ目は<a href="https://html5experts.jp/cssradar/2027/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">本連載の前編</a>でも少し触れたGPUにまつわるアクシデントです。<br />
GPUを使ってRenderLayerを作成し、そのレイヤー上でアニメーションを行うことそのものはベストプラクティスと言えます。しかしCPUからGPUへのデータ転送にはコストがかかり、特にモバイルデバイスなどCPUもGPUも非力である場面で問題になります。</p>

<p>この問題については、Phamtom.jsの作者としてよく知られるAriya Hidayat氏によるデモが非常にわかりやすいです。デモそのものは<a href="http://codepen.io/ariya/full/xuwgy" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちらのcodepen</a>で実際に動作しているので、参考にしてください。 </p>

<p><a href="http://vimeo.com/75182001" title="Ariya Hidayat氏によるGPUへのデータアップロードデモ" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Ariya Hidayat氏によるGPUへのデータアップロードデモ</a></p>

<p>それぞれのボックスの右上に数字があり、カウントされているのが確認できたでしょうか？　このカウントがCPUからGPUへのデータの転送数を示しています。このデータ転送が少ないほうがパフォーマンスはよくなります。<br />
ですが、実際にデータ転送を行わないプロパティは非常に少なく、Ariya Hidayat氏によれば、opacity、transform、filterの3つのみと言われています。<br />
アニメーションの表現としてデータ転送が回避できない場面が多いのも事実ですが、同時にデータ転送には相応のコストがかかることを知っておくことも大切です。</p>

<p>GPU関連でもう1つの落とし穴があります。GoogleのJake Archibald氏による<a href="http://jsbin.com/efirip/5/quiet" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">デモ</a>をご覧ください。 </p>

<p><img src="/wp-content/uploads/2013/09/accidental.layer_.creation.gif" alt="accidental.layer.creation" width="1200" height="660" class="aligncenter size-full wp-image-2672" /></p>

<p>オレンジ色の矩形が、GPUによって処理されるComposited Layerを示しています。実際にComposited Layerを生成したかったのは左上の緑のボックスだけなのにも関わらず、どういうわけか見出しにもComposited Layerが生成されてしまいます。デスクトップ上であれば、このComposited Layerの生成にかかるコストは気にするほどのことでもありませんが、モバイルデバイスにおいては大きなコストになってしまいます。<br />
この問題を回避するのにはシンプルな解決があります。</p>

<p>先ほどのデモ内においてはアニメーションする要素そのものに、z-index: 1を付与することで回避できます。<br />
このアクシデントは、カルーセルのようなUIパターンによく見られます。自作する際も、すでにあるライブラリを利用する際も、思っていない場面でComposited Layerが生成されていないか確認し、z-indexを使って回避できるか試してみてください。</p>

<p>Ariya Hidayat氏によるW3Confでのプレゼンテーション『<a href="http://www.youtube.com/watch?v=gTHAn-nkQnI" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Fluid User Interface with Hardware Acceleration</a>』はハードウェア・アクセラレーションを使った最適化を行うのにあたり、見ておくべきリソースの1つです。またThe Chromium Projectsにてドキュメントされている<a href="http://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GPU Accelerated Compositing in Chrome</a>も参考になりますので、ぜひ一読してください。</p>

<p>ここで紹介する最後のよくあるアクシデントが、CSSプロパティの組み合わせによるペイントコストの増大です。このアクシデントはモバイルデバイスでよく見かけるものです。例えば、角丸とシャドウを組み合わせたボックス、非常によくあるスタイルにも関わらず、これらのスタイルがあると、とたんにスクロールが引っかかるように感じてしまうことがあります。この「引っかかる感じ」の原因の多くがペイントです。</p>

<p>どのプロパティの組み合わせがどれくらいのペイントコストとなるかを計測するためのツールは存在はしますが、ここでは紹介しきれませんので割愛します(チャレンジしてみたい方は<a href="http://dev.chromium.org/developers/how-tos/trace-event-profiling-tool" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちらのドキュメント</a>を参考にしてください。また取得方法は異なりますが、Colt McAnlis氏によるHTML5 Rocksの記事『<a href="http://www.html5rocks.com/en/tutorials/speed/css-paint-times/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Paint Times and Page Render Weight</a>』も合わせて参考にしてください。)。しかし前段で紹介したタイムラインパネルでもペイントコストを確認できますので、トライ&amp;エラーを繰り返すことで、最適化を進められるでしょう。</p>

<p>前後編にわたってWebアニメーションの最適化について紹介してきました。<br />
いずれブラウザや端末そのものも賢くなり、これらの知識やテクニックも早晩時代遅れになっていくだろうと思います。しかし、我々はその過渡期にいる最中です。「使いやすさ」を向上する上で欠かすことができない最適化は多くの苦難があっても報われるものです。</p>
]]></content:encoded>
		
		<series:name><![CDATA[パフォーマンスチューニング]]></series:name>
	</item>
		<item>
		<title>Webアニメーションを高速化するために知っておくべき10のこと（前編）</title>
		<link>/cssradar/2027/</link>
		<pubDate>Thu, 12 Sep 2013 22:00:53 +0000</pubDate>
		<dc:creator><![CDATA[斉藤 祐也]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[アニメーション]]></category>
		<category><![CDATA[パフォーマンス]]></category>

		<guid isPermaLink="false">/?p=2027</guid>
		<description><![CDATA[連載： パフォーマンスチューニング (7)アニメーション／トランジションは身の回りに当たり前にあるものです。 むしろ普段の生活では「0」が「1」に変化するものの方が珍しいでしょう。 アニメーション／トランジションはデジタ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/performance-tech/" class="series-149" title="パフォーマンスチューニング" data-wpel-link="internal">パフォーマンスチューニング</a> (7)</div><p>アニメーション／トランジションは身の回りに当たり前にあるものです。<br>
むしろ普段の生活では「0」が「1」に変化するものの方が珍しいでしょう。<br>
アニメーション／トランジションはデジタルなWebに対して自然な変化を提供する大切なツールです。<br>
今回はそんなアニメーション／トランジションをより自然にスムーズに動作させるために知っておきたいことを前・後編の2回に分けて紹介していきます。</p>

<p><span id="more-2027"></span></p>

<h2>アニメーションを高速化する理由</h2>

<p>アニメーションは先ほど書いたように普段の生活にも存在しています。だからこそ、我々はスムーズではないアニメーションを見つけるのが得意です。</p>

<p>アニメーションに限定した話ではありませんが、FacebookのShane O&#8217;Sullivan氏が、ページロード後のレンダリングパフォーマンスが一定でない場合は「いいね！」や「シェア」などのアクション率が低下すると、昨年Londonで開催されたEdge Conferenceで話していました。</p>

<p><img src="/wp-content/uploads/2013/09/edgeconf-performance-300x158.png" alt="edgeconf-performance" width="300" height="158" class="aligncenter size-medium wp-image-2028" srcset="/wp-content/uploads/2013/09/edgeconf-performance-300x158.png 300w, /wp-content/uploads/2013/09/edgeconf-performance-207x109.png 207w, /wp-content/uploads/2013/09/edgeconf-performance.png 480w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>特にモバイルデバイスは触って操作するだけあって、ユーザが無意識に自分の感覚と近いものを求めることは当然とも言えるでしょう。</p>

<h2>アニメーションの速さを計る「FPS」について</h2>

<p>これまでパフォーマンスを計る単位はページロード速度を計るミリ秒が主でしたが、最近ではページロード後のレンダリングやアニメーションのパフォーマンスを計る単位としてフレームレート(単位時間あたりいくつフレームが処理されるかを表す単位)が利用され始めていて、WebにおいてはFPS(Frames Per Second)、つまりフレーム/秒という単位で表すのが一般的です。</p>

<p>ここでいう「フレーム」は映画などで指す「コマ」と同じものと考えて差し支えないでしょう。例えば映画の世界では24FPSが標準的に使われていて、Webにおいては60FPSがたどり着くべき目標とされています。</p>

<h2>JavaScriptとCSSではどちらがアニメーションに最適なのか？</h2>

<p>Web上でアニメーションを表現するには多くの方法がありますが、ここではJavaScriptとCSSを使った手法にフォーカスします。  </p>

<p>CSS3を使ってのアニメーションの以前はJavaScriptによる実装しか選択肢がありませんでした。jQueryの.fadeIn()や.slideUp()などを使ったアニメーションの実装の経験は多くの人が持っているでしょう。</p>

<p>Web開発におけるすべての問題への正しい解答はいつだって「時と場合による」ものですから、どちらが最適かという問いに対する答えも同じです。しかし、本誌の<a href="https://html5experts.jp/yoshikawa_t/1016/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ユーザーの体感速度を高めるためのJavaScriptチューニング（後編）</a>にある通り、JavaScriptはシングルスレッドで動作するもので、JavaScriptがアニメーションを行っている間はそれ以外の処理を行うことができません。  </p>

<p>JavaScriptは現在のWebサイト/アプリにおいて非常に多くの処理を行う傾向にあるため、CSS3にその処理を代わって実行させることができるようになったことは、パフォーマンス観点では大きな一歩と言えるでしょう。 </p>

<p>しかしCSS3のアニメーションを使ったからといって、60FPSの目標を自動的にクリアできるものでは決してありません。</p>

<h2>ハードウェア・アクセラレーションは銀の弾丸ではない</h2>

<p>CSS3を使ったアニメーション実装が進むにつれ、思った以上にパフォーマンスが出ない場合にハードウェア・アクセラレーションを強制的に利用するテクニックが紹介され始めました。  </p>

<p>ブラウザが行う処理はこれまでCPUで行ってきましたが、アニメーションをスムーズに実行するにはGPU(グラフィックス プロセッシング ユニット)を使う方が効率的です。</p>

<p>ハードウェア・アクセラレーションを利用すると言った場合、端的に言ってしまえば、transform: translate3d(0,0,0)あるいは、transform: translateZ(0)という3Dに関連するプロパティを追加すると、実際に値がゼロであってもブラウザはGPUを利用し、そうすることでアニメーションがスムーズに実行される。というように解説されることが多いです。</p>

<p>どんなツール/テクニックにも当てはまることですが、得るものがあれば、必ず失うものもあります。ハードウェア・アクセラレーションを利用することで得られることは、GPUが得意とするグラフィック処理を行うレイヤーを生成(後述)し、そのレイヤー上で処理が完結できること、そして失うものはそのレイヤーを生成し、管理するコストです。</p>

<p>例えば、ハードウェア・アクセラレーションが効果的だからと言って、body * { transform: translateZ(0) } というような記述をすると、本来であればレイヤーが必要ない要素に対してもレイヤーを生成してしまうことになります。これはレイヤーを生成し、管理するためのメモリを余分に費やすことになり、サイト全体で見るとパフォーマンスが低下してしまうことになります。</p>

<p>ハードウェア・アクセラレーションは必要なタイミングで必要な要素にだけ利用するようにするべきです。また、transform: translateZ(0)というような記述でブラウザにハードウェア・アクセラレーションさせるのはあくまでもハックとして考えておいた方がいいでしょう。ブラウザのアップデートとともにハックが利用できなくなるかもしれません。</p>

<h2>CSSのプロパティによってアニメーションのパフォーマンスはどう変わるのか</h2>

<p>ハードウェア・アクセラレーションはtransform: translateZ(0)だけで利用できるようになるわけではありません。  </p>

<p>例えば、ある要素の位置をA地点からB地点に移動させるアニメーションを実装する際に:</p>

<ol><li>transform: translate()を利用する</li><li>position:absoluteで要素の位置を指定しtopやleftの値を利用する</li></ol>

<p>というケースが考えられます。  </p>

<p>Paul Irish氏はこの<a href="http://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">2つケースを実装し、両者のパフォーマンスを比べています</a>。  </p>

<p><img src="/wp-content/uploads/2013/09/Why-moving-elements-with-translate-is-better-than-pos-abs-top-left-Paul-Irish-300x158.png" alt="Why moving elements with translate   is better than pos abs top left   Paul Irish" width="300" height="158" class="aligncenter size-medium wp-image-2029" srcset="/wp-content/uploads/2013/09/Why-moving-elements-with-translate-is-better-than-pos-abs-top-left-Paul-Irish-300x158.png 300w, /wp-content/uploads/2013/09/Why-moving-elements-with-translate-is-better-than-pos-abs-top-left-Paul-Irish-207x109.png 207w, /wp-content/uploads/2013/09/Why-moving-elements-with-translate-is-better-than-pos-abs-top-left-Paul-Irish.png 480w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>結論から言うと、1)のtransform: translate()を利用するほうがパフォーマンスはよくなります。  </p>

<p>Paul Irish氏は2)で実装する場合、アニメーションする要素はCPUを利用し、かつ敷かれている背景に対して移動する度に描画を行う必要があるのと比べて、1)の場合、要素はGPUが生成するRenderLayerと呼ばれる専用のレイヤー上を移動し、敷かれている背景などへの影響がないため、スムーズに移動することができると解説しています。</p>

<p>RenderLayerについてはブラウザの内部的な話になってしまうので、ここでは詳しくは触れませんが、2)のposition:absolute + top/leftを使った場合のアニメーションは、ブラウザを白い壁に例えると要素が移動するたびに要素を白く塗りつぶし、移動先に書き直す、というような処理になりますが、1)のtransform: translate()を使った場合は、白い壁に透明のシート(RenderLayer)を被せ、そのシート上に要素を描くことで、移動はシートを動かすだけで実現できるようになる、という様に考えてみるとわかりやすいでしょう。もちろんアニメーションによってはRenderLayerが得意な表現だけを利用できるわけではありませんし、あくまでも現時点のブラウザの仕様に依存する部分も多くあります。 </p>

<p>次回後編ではレンダリングプロセス全体について簡単に解説し、アニメーションのボトルネックとなるレイアウトとペイントの2つのプロセスについて、そして、より詳しい計測、デバッグのワークフロー、最後によくあるアクシデントと回避方法について紹介します。</p>
]]></content:encoded>
		
		<series:name><![CDATA[パフォーマンスチューニング]]></series:name>
	</item>
	</channel>
</rss>
