<?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="/takazudo/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>抽象化を避けるCSS設計方法論「Enduring CSS」 第4回</title>
		<link>/takazudo/24269/</link>
		<pubDate>Fri, 10 Nov 2017 01:26:21 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[ECSS]]></category>

		<guid isPermaLink="false">/?p=24269</guid>
		<description><![CDATA[連載： Enduring CSS (4)前回までで、Enduring CSS（以降ECSS）の考え方を紹介してきました。ECSSというのは端的に言うと「分けて考えよ」という設計思想です。当たり前ですけれども、どう「分けて...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/ecss/" class="series-417" title="Enduring CSS" data-wpel-link="internal">Enduring CSS</a> (4)</div><p><a href="https://html5experts.jp/takazudo/22915/" data-wpel-link="internal">前回まで</a>で、Enduring CSS（以降ECSS）の考え方を紹介してきました。ECSSというのは端的に言うと「分けて考えよ」という設計思想です。当たり前ですけれども、どう「分けて」考えるかは、設計者自身に判断が任されています。</p>

<p>ECSSには、Webアプリケーション向けに考えられた設計方法であると書かれていますが、筆者Takazudoとしては、より広い範囲で応用できる考えだと感じました。今回は、どのようにECSSの考え方を活かすべきかという点について考えてみます。</p>

<h2>コンポーネント指向のフレームワーク</h2>

<p>2017年時点において、ReactやAngularのようなコンポーネントベースでWebアプリケーションを構築できるフレームワークが台頭しています。このようなフレームワークでは、コンポーネントの中にだけCSSを適用するアプローチを取ることができます。</p>

<ul>
<li><a href="http://postd.cc/modular-css-with-react/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Reactを使ったモジュラーCSS : CSS-in-JSとCSS Module | POSTD</a></li>
<li><a href="http://postd.cc/css-modules/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSSモジュール ― 明るい未来へようこそ | POSTD</a></li>
<li><a href="https://angular.io/guide/component-styles" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Angular &#8211; Component Styles</a></li>
</ul>

<p>例えばAngularでは、コンポーネントを定義するファイルの中で、以下のように<code>styleUrls</code>にCSSファイルへのパスを指定することができます。</p>

<p></p><pre class="crayon-plain-tag">@Component({
  selector: 'hero-details',
  template: `
    &lt;h2&gt;{{hero.name}}&lt;/h2&gt;
    &lt;hero-team [hero]=hero&gt;&lt;/hero-team&gt;
    &lt;ng-content&gt;&lt;/ng-content&gt;
  `,
  styleUrls: ['app/hero-details.component.css']
})
export class HeroDetailsComponent {
  /* . . . */
}</pre><p></p>

<p>ここで指定されたCSSファイルの内容は、コンポーネントの内部にのみ適用されるよう、Angularが処理します。</p>

<p>この方法でアプリケーションを実装すれば、CSSの特徴である、書いたセレクタがグローバルに適用されてしまうという事態を避けることができるため、意図せず他の箇所にスタイルが適用されてしまうということがなくなります。</p>

<p>ECSSとこれらフレームワークには直接的な関わりはありませんが、このようなフレームワークが用意している、ローカルにのみCSSを効かせるという実装を利用することで、分離による保守性の向上というメリットを得ることができます。これは、ECSSの設計思想と非常に似た考えと言えます。ECSSはモジュールごとの分離を命名規則で実現し、これらフレームワークはその用意したフレームワークの機能の中で実現します。</p>

<p>このようなコンポーネント指向のフレームワークを用いてアプリケーションを設計する際、ECSSを理解することは、そのCSS設計のための助けとなるかもしれません。</p>

<h2>制作チームが別れている運用体制</h2>

<p>筆者Takazudoは、ECSSの考え方を、制作チームが別れている運用体制にて活かすことができたという話を聞きました。</p>

<p>私にその話を聞かせてくれた方は、一つのサイトを複数のチームで運用する際、どこまでを共通化して考えればよいのか、汎用的なモジュールをどう考えれば良いのかということについて悩んでいたようです。制作チームが別れていると、密に連携が取れるわけではないので、汎用的に作った細かいモジュールを、各チームで共有するのが難しいということでした。</p>

<p>その方は、そのような環境を改善するため、ECSSの考えを取り入れました。ヘッダとフッタのみを共通のモジュールとし、それ以外の箇所については、サイト上のカテゴリのまとまりごとに完全に分離してしまうことにしたそうです。具体的には、各々の管理範囲へ個別の名前空間を与え、CSSを書く際は、クラス名の頭にその名前空間の接頭辞をつけることをルールとし、そのクラスセレクタで基本的にCSSを書くことで、競合を避けました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/11/a80ea3d95a5c9af47ad62f320c42e385.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/11/a80ea3d95a5c9af47ad62f320c42e385.png" alt="" width="640" height="314" class="alignnone size-full wp-image-24768" srcset="/wp-content/uploads/2017/11/a80ea3d95a5c9af47ad62f320c42e385.png 640w, /wp-content/uploads/2017/11/a80ea3d95a5c9af47ad62f320c42e385-300x147.png 300w, /wp-content/uploads/2017/11/a80ea3d95a5c9af47ad62f320c42e385-207x102.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>また、アセットも管理範囲毎に分離し、お互いが干渉しないようにしたそうです。その結果、チームごとに触るべきファイルが明確になり、お互いの衝突を減らすことに成功したとのことでした。</p>

<p>これは端的に言うと、モジュールの汎用化を諦めてしまったということですが、制作の体制によってはそのような解決策がベストになることもあるかと考えさせられた話でした。CSS設計の理想とはかけ離れていると感じる方もおられるかもしれませんが、このような諦めは、実際の仕事の中では有効な解決方法となることも多いのではないでしょうか。</p>

<h2>汎用モジュールをベースとした設計</h2>

<p>前項で挙げた事例のような、完全にチームが別れるなどしない場合でも、ECSSの「分離する」考え方は応用できるものと筆者は考えます。というより、Webサイトをモジュールベースで考えて設計していた場合、はじめは分けて考える必要がなかろうとも、運用していたら分ける必要が出てくるというケースは往々に発生するであろうから、基本的にECSSの「分ける」設計をベースにしておいたほうが、後々の保守性の向上の助けになるであろうと感じています。</p>

<p>筆者は以前、コーポレートサイトをワンストップで制作することの多い制作会社にて、フロントの実装を行っていました。その会社では、コンサルから設計、デザイン、コーディング、CMS組み込みまで全てやっているという制作体制を基本としていたことと、主に制作していたのがコーポレートサイトという、汎用的なUIパーツで大量のページを作る必要があるという状況があり、これを効率的にこなすため、どの制作工程においても汎用化されたモジュールでページを構成するという意識を共有することに、それなりに成功していました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/09/example2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/09/example2.png" alt="" width="640" height="328" class="alignnone size-full wp-image-24271" srcset="/wp-content/uploads/2017/09/example2.png 640w, /wp-content/uploads/2017/09/example2-300x154.png 300w, /wp-content/uploads/2017/09/example2-207x106.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>そのような制作体制の中、HTMLとCSSでテンプレートを作っていたのが筆者だったのですが、そのようにモジュール化を強く意識していた現場であったからこそ、汎用化されたモジュールが多くなりすぎてしまうという問題に頭を悩ますことが多くありました。</p>

<p>具体的には、トップページでしか使わないようなメインビジュアル、一部のキャンペーンページでしか使わない特殊なモジュールなど、おおよそ他のページで使わる可能性がないようなものであっても、汎用的なモジュールとして考えてCSSの設計を行ってしまっていました。</p>

<p>いや、むしろそのように「汎用的である」とか「そこでしか使わない局所的なものである」などという考えの元にCSSを設計していませんでした。BEMでいうBlockの集合でWebサイトを作っていましたが、ただそれだけで、とにかくなんでも使いまわせることを念頭に置いて設計を行っていました。</p>

<p>そのように、局所的にしか使わないモジュールを、汎用的なモジュールであると考えて設計してしまったことで、なにかCSSの容量が増えすぎてしまい問題になるというようなことは起こりませんでしたが、今考えればそれは、サイト全体で使う汎用的なモジュールらと、局所的に使うモジュールで分けて設計すべきでした。</p>

<p>例えば、汎用的なモジュールは<code>sw-</code>（SiteWide）、トップページだけで使うモジュールは<code>top-</code>（Top）、キャンペーンページだけで使うモジュールは<code>camp-</code>（Campaign）と名前空間を分けるなど。そのようにしておけば、前回までで紹介したように、トップページのみのリニューアルや、キャンペーンページの更新や削除にも対応しやすくなります。</p>

<p>そのように名前空間によりモジュールを分けるのは、一段階、モジュールのカテゴライズを設計する必要があることに注意する必要があります。ですが、基本的に汎用的なモジュールで構成されるようなWebサイトを作る場合でも、このようにECSSの考え方を適用しておくことは、将来の保守性向上へ貢献するのではなかろうかと筆者は考えます。</p>

<h2>CSS設計のヒントはデザインカンプの外側にあり</h2>

<p>そのように考えていると、もはやCSSの設計について考えることは、デザインカンプを眺めながらHTMLとCSSを書いているだけでは、ベストなゴールへ到達できない問題であるということに気付かされます。前項で上げたようにモジュールのカテゴライズを考えるということは、つまるところ、Webサイトを構成するモジュールをどのように考えるのかというところに辿り着き、画面の設計をどう考えるという設計に習う必要が出てきます。</p>

<p>また、どのようにモジュールを切るかという点について考えた時、HTMLとCSSを書いた後の工程へ目を向けることも重要かもしれません。例えばブログシステムに組み込むためのHTMLテンプレートを書く場合、そのブログシステムが、「ヘッダ」「フッタ」を、システム的にテンプレートを分離していて、それらのファイルをインクルードするような作りになっていたとしたら、HTMLとCSSでも「ヘッダ」「フッタ」を個別のモジュールとして用意することで、ブログのテンプレート組み込みとのモジュール感を一致させることができるでしょう。</p>

<p>プログラミングにおいて、同種の処理は共通化し、DRYを意識するのが、良い設計を行うための考え方の一つとして重要であることはよく知られているところです。OOCSSはそのような考えに習った設計思想でした。しかし、HTMLとCSSはプログラミング言語ではないことに注意しなければなりません。SassなどのCSSプリプロセッサやPostCSSの力を借りれば近いことができますが、行き過ぎた抽象化が保守のコストを高めてしまう可能性があるのでは？と、ECSSは考えさせてくれます。保守性を見越し、行き過ぎた複雑さを排除した、適切なモジュールの分離を目指すのがECSSです。</p>

<p>ECSSを取り入れるべきか否かは、プロジェクトの性質によって左右されるであろうと筆者は考えます。Webサイトは作って終わりではありません。サイトローンチ後も継続して変化しうるHTMLとCSSについての保守を考える場合、ECSS的な視点も考慮しつつCSSの設計を考えてみてはいかがでしょうか。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Enduring CSS]]></series:name>
	</item>
		<item>
		<title>抽象化を避けるCSS設計方法論「Enduring CSS」 第3回</title>
		<link>/takazudo/22915/</link>
		<pubDate>Wed, 26 Apr 2017 01:00:05 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[ECSS]]></category>

		<guid isPermaLink="false">/?p=22915</guid>
		<description><![CDATA[連載： Enduring CSS (3)前回までで、Enduring CSS（以降ECSS）の基本的な設計指針や、命名規則などのルールを紹介しました。ECSSの後半は、著者Ben Frain氏の考える、設計が破綻しないた...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/ecss/" class="series-417" title="Enduring CSS" data-wpel-link="internal">Enduring CSS</a> (3)</div><p><a href="https://html5experts.jp/series/ecss/" data-wpel-link="internal">前回まで</a>で、Enduring CSS（以降ECSS）の基本的な設計指針や、命名規則などのルールを紹介しました。ECSSの後半は、著者Ben Frain氏の考える、設計が破綻しないためのCSSの書き方が、Tipsの集合のような形でまとめられています。</p>

<p>ECSSは「分けて」考えることで、サイトが破綻しないようにすることに重きを置いた考え方です。なので、あらゆるサイトにとって最適な解となるわけではなく、自身の目的に合った設計を選ぶべきであると著にはあります。100%この内容にならう必要はありませんので、参考になりそうなノウハウをピックアップし、自身のプロジェクトに活かすとよいのではないでしょうか。</p>

<h2>とはいっても、サイト全体で共通のModuleというのはあるでしょう？</h2>

<p>前回までの内容からすると、ECSSでは「ヘッダ」「フッタ」のようなサイト全体の共通のUIを除いては、すべて名前空間でカッチリ分け、「汎用的に使われるコラム」だったり、「ナビゲーションのリスト」みたいなものも、各々の名前空間に属する、個別のModuleとして扱うべきであると言うふうに思われるのではないでしょうか。</p>

<p>例えば以下は、<a href="http://getbootstrap.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Bootstrap</a>で用意されているPanel（左）、List Group（右）というコンポーネントです。このような見栄えのUIが何度もサイトの中で登場するのだとしても、個別のModuleとして定義しておくべきなのでしょうか。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/04/bootstrapEx.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/04/bootstrapEx.png" alt="" width="640" height="208" class="alignnone size-full wp-image-22975" srcset="/wp-content/uploads/2017/04/bootstrapEx.png 640w, /wp-content/uploads/2017/04/bootstrapEx-300x98.png 300w, /wp-content/uploads/2017/04/bootstrapEx-207x67.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ECSS的には、その答えはYESです。別の機能の中で登場するのであれば、別のModuleとしたほうが良いと考えます。しかし、ECSSはそのような汎用的なModuleの存在を完全に禁止しているわけではありません。例えば、サイト全体で汎用的に使われるModuleを用意したければ、<code>sw</code>（SiteWide）という名前空間に属させてはどうかと書かれています。この場合であれば、<code>sw-Panel</code>、<code>sw-ListGroup</code>というModuleにするという具合です。</p>

<p>しかしながら、このように汎用的にどこでも使えるModuleを増やしすぎないようにしたほうが良いとECSSは警告しています。理由は簡単で、そのように汎用的なModuleを増やしていけば、それはどこでも使われる可能性があるゆえに、二度と消せないModuleとなってしまうからです。</p>

<p>前回挙げたトップページだけをリニューアルするような例を考えてみると、その意味が分かるのではないでしょうか。トップページに登場するModule群が、汎用的にどこでも使われているもので構成されていたとしたら、前回紹介したように、もう使わなくなったModuleを消すということがやりづらくなります。</p>

<p>ECSSは、そのように汎用的なModuleでサイトを構成することを否定しているわけではありません。ただ、そのようにModuleの汎用化を進めていくとECSSの目指している、分けて管理するという設計からは外れていくということです。</p>

<p>このように、汎用的に使用できるModuleを用意することは、Module構成の複雑化とのトレードオフであると考えることができます。かたくなに汎用的なModuleを禁止する必要は無いかと思いますが、ECSS的な設計を取り入れたいのであれば、汎用的なModuleが増えすぎないように注意する必要があるでしょう。</p>

<h2>ビルドによるCSS結合の必要性</h2>

<p>前回、ECSSはアセットを名前空間ごとに分けると書きましたが、そのように分けたCSSやJavaScriptのファイルを、1つずつ読み込ませるのが良いと考えているわけではありません。gulp、PostCSS、Sass等を使い、必要に応じてCSSをまとめることを推奨しています。</p>

<p>このあたり、どうCSSをまとめるかという設計が必要と考えても良さそうです。そこまで細かく設計する必要は無いと感じるのであれば、全NamespaceのCSSを一つにまとめてしまうのでもいいと思いますが、テンプレートごとに必要なCSSは何かを把握し、どうまとめるかという設計を挟むことで、ユーザーに不必要なCSSを読み込ませないようにすることが可能になるでしょう。</p>

<p>筆者Takazudoは、ECSS著者のBen Frain氏に、どのようにCSSをまとめたらいいのかと聞いてみたことがあるのですが、それは自分の必要に応じて柔軟に決めれば良いとアドバイスを貰いました。</p>

<p>SPAなど、全てのCSSルールが1ページの上で必要な場合は、あえてCSSファイルを分ける必要がないので全部CSSファイルを一つにまとめたり、例えばキャンペーンサイトのような、そこでしか使われないという具合にNamespaceが明確に切り分けられるのであれば、それらだけを別のCSSファイルとしてまとめたりするなど、様々なまとめ方が考えられます。</p>

<h2>PostCSSやSassとの付き合い方</h2>

<p>ECSSでは、開発の効率化のため、PostCSSやSassなどの、CSSを書くのを手助けするツールの使用を推奨しています。ECSS書籍内で紹介されている機能の一部を紹介します。</p>

<h3>autoprefixer</h3>

<p>まず、ぜひ使うべきと紹介しているのが、<a href="https://github.com/postcss/autoprefixer" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">autoprefixer</a>です。このautoprefixer、使ったことのある人であれば分かると思いますが、autoprefixerが自動で必要なvendor prefixを足してくれるため、vendor prefixを自分で書く必要がなくなります。vendor prefixを自分で書かないといけないような状況は、コードの複雑さを高めます。この複雑さを自動で排除できるautoprefixerは、コードの保守性を高めるのに寄与するものとECSSは考えています。</p>

<h3>変数</h3>

<p>ほか、PostCSSやSassで利用できる、変数、mixinの機能も利用すべきであるとECSSは考えています。変数やmixinを使ってしまうと、「分けて」管理することがしづらくなくなるのではないか？と思われるかもしれませんが、まさにその通りで、利用用途に注意して、控えめに使うべきであるとECSSでは述べられています。</p>

<p>例えば変数ですが、ECSSでは、サイズ、色、z-indexのために使用することをオススメしています。サイズ、色を変数化しておくのは、デザインやコードの統一性を確保するためです。</p>

<p>既存のコードを眺める際、<code>width</code>が<code>50px</code>と書かれている場合と<code>$size-double</code>と書かれている場合では、コードを読む者の捉え方は異なります。前者の場合は<code>50px</code>以上のなんの情報も得られませんが、後者の場合、基準のサイズが<code>25px</code>であり、その長さを基準にしてデザインが行われているということが想像できます。</p>

<p>デザインの矛盾や意図しない値の差異を発生させないため、このようなマジックナンバーは、なるべく変数化しておき、数値の指定を行うときにはこれら変数を利用するとよかろうとECSSには書かれています。</p>

<h3>mixinとextend</h3>

<p>mixinは控えめに使うべきであると、ECSSは考えています。控えめというのはどういうことかというと、Moduleの抽象化をするために使うべきではないということのようです。</p>

<p>例えばOOCSSでは、共通部分のスタイルをベースのObjectにまとめ、そこに差分のスタイルを当てたクラスをSkinとして適用することで、似た見栄えのUI表現を実現するという旨を、連載第1回で紹介しました。このようなOOCSSの設計思想を、OOCSS自身はマルチクラスを利用して実現しますが、mixinやextendを使えばスタイルの抽象化をCSS内で済ませられるため、よりスマートにModuleの抽象化が実現できると言うことができるでしょう。</p>

<p>しかしECSSでは、このようなmixim、extendの利用を禁止します。理由は簡単、Moduleが複雑になるからです。このmixinやextendも、汎用的なModuleを作るのと同じ問題をはらんでいます。そのような抽象化をmixinやextendで行うと、作ったmixin、extendが様々なModuleの中で使われるわけです。そうなってしまったら、そのmixin、extendをいじった場合、どこかで意図しない崩れが発生するかもしれませんから、作ったmixin、extendの内容は2度と編集することができず、「分けて」管理するというポリシーからは外れてしまいます。</p>

<p>もっと言えば、そんな風に最初は抽象化できたように見えても、サイトが成長していけばより色々なバリエーションのUIが登場するため、そのような抽象化を完全に行うことはそもそも無理であろうとさえECSSは考えています。（ECSSはって言うより、著者Ben Frain氏がという感じですね）</p>

<p>ではどのようにmixinを使うのか。その例として、ECSSではフォントに関する指定を例に挙げています。特定の<code>font-family</code>、<code>font-size</code>、<code>font-weight</code>、<code>line-height</code>の組み合わせを色々なところに使いたいと考えるのであれば、それは単純に変数で表せるものではないから、mixinとしてまとめ、使いまわすといいだろうと、ECSS書籍内では紹介されています。</p>

<p>このような、あくまで簡単なスニペット的なmixinの使い方に限定し、究極的には10個以内のmixinに収めておくのが良いだろうとECSSは考えているようです。</p>

<h2>複雑な書き方は避けるべし</h2>

<p>このように、ECSSは、CSSを書くことを手助けするツールの使用を推奨しているものの、そこに多くの機能を求めません。むしろ、なにか込み入った機能を持ち込む場合、その学習コストを考慮し、プロジェクトに適しているのかを判断すべしとECSSには書かれています。複雑さは運用の負荷を高めます。その結果、CSSを編集することに対してかかるコストが上がってしまうということです。</p>

<p>ほかにもECSSは、複雑なCSSの書き方も避けるべきであるとアドバイスしています。その例としてFlexboxを例に挙げています。Flexboxを使えば、少ない数の要素で柔軟にレイアウトを組むことができるわけですが、もし開発メンバーがあまりFlexboxに慣れていないような状況であったなら、Flexboxを積極的に使用することで得られるメリットと、Flexboxを理解するための時間を天秤にかえて考えてみる必要があるであろうと警告しています。</p>

<p>CSSを書いていると、新しい技術仕様をどんどん使うのがクールなコードであるように思えることはないでしょうか。筆者Takazudoは結構、そのように考えていたところがありました。対応環境の許す限り、なるべく最新の仕様をどんどん使いたいなと、まぁ技術者だとそういう欲望はある程度あるのではなかろうかと個人的には思うわけですが、それであとから見た時に読解に時間がかかりすぎてしまうようでは本末転倒です。なにを重要とするのかを考えろということです。</p>

<p>これってCSSだけではなく、プログラミング全般に言えることだとも思うのですがどうでしょうか。</p>

<p>※ Enduring CSSが書かれた時期からするとFlexboxはだいぶ普通に使われるようになってきたかと思いますので、そこまで警戒すべきものではないかとは思いますが、重要なのは、開発メンバーがその技術に慣れているか否かという点です。</p>

<p>今回は、ECSS書籍内より、実装のヒントとなりそうなトピックのうちのいくつかを紹介しました。ECSSには、他にもたくさんの実装のヒントがありますので、ご興味が有る方は是非、ECSSのサイトをチェックしてみるといいかと思います。</p>

<p>次回は、ECSSをどのように利用していったらよいか。実際に書いてみて気をつけたほうがよさそうなことを筆者なりにまとめて、締めとしたいと思います。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Enduring CSS]]></series:name>
	</item>
		<item>
		<title>抽象化を避けるCSS設計方法論「Enduring CSS」 第2回</title>
		<link>/takazudo/22123/</link>
		<pubDate>Fri, 27 Jan 2017 00:00:36 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[ECSS]]></category>

		<guid isPermaLink="false">/?p=22123</guid>
		<description><![CDATA[連載： Enduring CSS (2)本連載では、Enduring CSS（ECSS）というCSS設計方法論を紹介しています。 Architect CSS and scale CSS with the ECSS CSS...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/ecss/" class="series-417" title="Enduring CSS" data-wpel-link="internal">Enduring CSS</a> (2)</div><p>本連載では、Enduring CSS（ECSS）というCSS設計方法論を紹介しています。</p>

<ul>
<li><a href="http://ecss.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Architect CSS and scale CSS with the ECSS CSS methodology</a></li>
</ul>

<p><a href="https://html5experts.jp/takazudo/21946/" data-wpel-link="internal">前回</a>は、ECSSの考え方の特徴と、Module、及びその内容について見てきました。今回は、Namespace（名前空間）とアセットの分離について解説します。</p>

<h2>Namespace（名前空間）</h2>

<p>ECSSの大きな特徴の一つに、Module群をNamespace（名前空間）でまとめるという点があります。前回解説したクラスの命名規則だったり、実際のWebサイト上で使われているクラス名には、名前空間を示す接頭辞がついていました。</p>

<p>以下に、前回登場したクラス名の一部を列挙します。括弧内の文字列が、Namespaceです。（各モジュールがどういうものかは、第一回目の終わりに紹介した<a href="https://html5experts.jp/takazudo/21946/#top-page-structure" data-wpel-link="internal">ECSSサイトのトップページのモジュール一覧</a>をご覧ください）</p>

<ul>
<li><code>home-Benefits</code>（home）: ECSSの利点をまとめているモジュール</li>
<li><code>home-Testimonials</code>（home）: ECSSの推薦コメントをまとめているモジュール</li>
<li><code>st-Nav</code>（st）: ヘッダ部にあるナビゲーションのモジュール</li>
<li><code>st-Footer</code>（st）: フッタのモジュール</li>
<li><code>hero-Standard</code>（hero）: ヒーローエリアのモジュール</li>
</ul>

<p><img src="/wp-content/uploads/2017/01/top_modules_1.png" alt="トップのモジュール一覧その1" width="480" height="284" class="aligncenter size-full wp-image-21989" srcset="/wp-content/uploads/2017/01/top_modules_1.png 640w, /wp-content/uploads/2017/01/top_modules_1-300x177.png 300w, /wp-content/uploads/2017/01/top_modules_1-207x122.png 207w" sizes="(max-width: 480px) 100vw, 480px" />
<img src="/wp-content/uploads/2017/01/top_modules_2.png" alt="トップのモジュール一覧その2" width="480" height="340" class="aligncenter size-full wp-image-21990" srcset="/wp-content/uploads/2017/01/top_modules_2.png 640w, /wp-content/uploads/2017/01/top_modules_2-300x212.png 300w, /wp-content/uploads/2017/01/top_modules_2-207x147.png 207w" sizes="(max-width: 480px) 100vw, 480px" />
<img src="/wp-content/uploads/2017/01/top_modules_3.png" alt="トップのモジュール一覧その3" width="480" height="345" class="aligncenter size-full wp-image-21991" srcset="/wp-content/uploads/2017/01/top_modules_3.png 640w, /wp-content/uploads/2017/01/top_modules_3-300x215.png 300w, /wp-content/uploads/2017/01/top_modules_3-207x148.png 207w" sizes="(max-width: 480px) 100vw, 480px" /></p>

<p>上記であれば、<code>home-Benefits</code>と<code>home-Testimonials</code>は<code>home</code>に、<code>st-Nav</code>と<code>st-Footer</code>は<code>st</code>に、
<code>hero-Standard</code>は<code>hero</code>に属するという具合です。</p>

<p>なお、ECSSには、クラス名上でのNamespaceは、単語の頭文字らをとったりして略称にすると良かろうと書かれています。書籍の内容によれば、ここで登場している<code>st</code>というのは、<code>Structure</code>を意味し、ヘッダやフッタなど、サイト共通の基本構造的なModuleを属させているようです。</p>

<h2>セレクタの競合を回避するNamespace</h2>

<p>このように、Moduleを必ずNamespaceに属させる意味としてはまず、セレクタの重複を避けるという点が大きくあります。</p>

<p>どのようなCSS設計方法論を用いていたとしても、ECSSでいうModuleの名前をどうするかという点に頭を悩ませることが多いのではないでしょうか。筆者は数多くのWebサイトをコーディングしてきましたが、この名前付け作業にはいつも多くの時間をかけていました。今後どこかで使われることを見越し、どういった名前にしようかなどと考えると、最適な名前はなんだろうかと悩むのです。</p>

<p>ECSSは、Moduleを必ずNamespaceに属させるというルールにしています。そして、前回解説したように、Moduleのクラス命名規則が</p>

<p></p><pre class="crayon-plain-tag">namespace-Module</pre><p></p>

<p>であり、Module内の要素にスタイルを当てたい場合は、その要素をChildNodeとし、</p>

<p></p><pre class="crayon-plain-tag">namespace-Module_ChildNode</pre><p></p>

<p>とクラス名を付け、そのクラスセレクタでスタイルを当てるルールになっています。なので、Moduleの名前をそのNamespace内で重複しないようにさえしておけば、別のModuleのセレクタと競合することがありません。</p>

<p>例えば、前回例に出した<code>Benefits</code>というModuleは、Namespace <code>home</code>に属します（<code>home-Benefits</code>）。<code>home</code>というのは、このサイトを眺める限り、トップページで使うModuleらをまとめるために使用されているように見受けられます。とすれば、トップページの中で重複しないModule名であればそれで良いのです。</p>

<p>どこかで<code>Benefits</code>という名前のModuleが登場したとしても、それは別のNamespaceでの話です。<code>hoge-Benefits</code>などという、別のNamespaceを示す接頭辞から始まるクラスセレクタでスタイルが当てられるでしょうから、セレクタの競合を恐れる必要はありません。</p>

<p>もちろん、このように深く考えないで良いという前提としては、前回解説したように、例え似たようなModuleがどこか別のところ（この場合ですとトップページ以外）で登場しても、そのためには別のセレクタを書き、別にスタイルを当てるという、CSSの重複を許す諦めがあってのことです。</p>

<h2>Namespaceの切り方</h2>

<p>では、具体的にどういう風にNamespaceを用意したら良いのでしょう。ECSSでは、Namespaceの切り方として、ショッピングカートを例に挙げています。ショッピングカートの仕組みを作るのであれば、<code>sc</code>という、ShoppingCartを略したNamespaceを用意し、そこで使われるModule群を<code>sc</code>に属させるようにするという具合です。</p>

<p>この例を、もうちょっと発展させて考えてみます。</p>

<ul>
<li>トップページ</li>
<li>商品詳細</li>
<li>ショッピングカート</li>
</ul>

<p>という3つのテンプレートで構成されるサイトがあったと仮定します。この場合、例えばこんな風にNamespaceを分けてしまうのはどうでしょう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/01/2_ns.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/01/2_ns.png" alt="2_ns" width="640" height="329" class="alignnone size-full wp-image-22124" srcset="/wp-content/uploads/2017/01/2_ns.png 640w, /wp-content/uploads/2017/01/2_ns-300x154.png 300w, /wp-content/uploads/2017/01/2_ns-207x106.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>トップページで登場するModuleは全て<code>tp</code>（topPage）に、商品詳細で登場するModuleは全て<code>pd</code>（productDetail）に、ショッピングカートで登場するModuleは全て<code>sc</code>（ShoppingCart）に属させるという具合です。</p>

<p>しかし、大抵の場合、ヘッダやフッタはサイト全体で共通のものになっていることでしょう。ほかにも、サイドナビにある広告エリアがどのページでも共通であるような状況を想像してみてください。そんな時は、共通Moduleをまとめる<code>cmn</code>（common）というNamespaceを用意してみてはどうでしょう。</p>

<p><code>cmn</code>に、ヘッダやフッタ、サイドエリアの広告エリアを属させるのです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/01/2_ns2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/01/2_ns2.png" alt="2_ns2" width="640" height="358" class="alignnone size-full wp-image-22125" srcset="/wp-content/uploads/2017/01/2_ns2.png 640w, /wp-content/uploads/2017/01/2_ns2-300x168.png 300w, /wp-content/uploads/2017/01/2_ns2-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>例えばこんなModule名で。</p>

<ul>
<li><code>cmn-Header</code>（ヘッダ）</li>
<li><code>cmn-Footer</code>（フッタ）</li>
<li><code>cmn-SideAd</code>（サイド広告）</li>
</ul>

<p>これは、あくまでテンプレートの種類でNamespaceを切るというひとつの例にすぎませんので、当然、必ずテンプレートごとにNamespaceを用意せよというわけではありません。Namespaceの切り方は設計者次第であり、自由です。</p>

<p>このようにECSSでは、Namespaceを切ることで、セレクタの重複を防ぎます。Namespaceをどう切るかという設計は必要になりますが、Moduleの名前を考えるのは、かなり気軽になるのではないでしょうか。</p>

<h2>アセットの分離</h2>

<p>ECSSでは、Namespaceごとに、そのNamespaceに属するModule内で使用するCSS、JS、SVG、画像等のリソースを分離してしまうのが良いと考えています。本連載では、便宜上、これらのリソースのことを「アセット」と呼ぶことにします。</p>

<p>普段Webサイトを作る時、例えば以下のようにCSSやJSファイルを一つにまとめて管理したり、</p>

<p></p><pre class="crayon-plain-tag">/src
├── css
│   └── styles.css
└── js
    └── app.js</pre><p></p>

<p>機能やModuleごとにCSSやJSファイルを作り、アセットの種類ごとにディレクトリを作り、ファイルをまとめたりしていませんでしょうか。</p>

<p></p><pre class="crayon-plain-tag">/src
├── css
│   ├── ProductDetail.css
│   ├── ShoppingCart.css
│   └── TopPage.css
└── js
    ├── ProductDetail.js
    ├── ShoppingCart.js
    └── TopPage.js</pre><p></p>

<p>ECSSでは、ファイルタイプ別ではなく、Namespace別にアセットを管理します。前例の</p>

<ul>
<li>トップページ &#8211; TopPage</li>
<li>商品詳細 &#8211; ProductDetail</li>
<li>ショッピングカート &#8211; ShoppingCart</li>
</ul>

<p>だと例えば、以下のような形になるかもしれません。</p>

<p></p><pre class="crayon-plain-tag">/src
├── ProductDetail
│  ├── ProductDetail.css
│  └── ProductDetail.js
├── ShoppingCart
│  ├── ShoppingCart.css
│  └── ShoppingCart.js
└── TopPage
    ├── TopPage.css
    └── TopPage.js</pre><p></p>

<p>各Namespaceのディレクトリ配下は、もっと好きなように便利に管理して良いのですが、重要なのは、Namesapce毎にアセットを分けて管理するという所です。</p>

<p>ECSSでは、このように分けたアセットらを、必要に応じてビルドしてまとめたりして使うよう、想定しています。</p>

<h2>アセットの分離がもたらすメリット</h2>

<p>Namespace毎にアセット分けられていると何が嬉しいのでしょうか。先述した、Namespaceの切り方として挙げた例をベースに考えてみます。</p>

<h3>探しやすさ</h3>

<p>アセット分離のメリットとしてはまず、どこにアセットがあるのか探しやすいという点が挙げられます。</p>

<p>例えばトップページの、以下のヒーローエリアへ配置された<code>tp-HeroImage</code>というModuleの、CSS／JS／画像を探したいとします。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/01/2_nsSearch.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/01/2_nsSearch.png" alt="2_nsSearch" width="640" height="294" class="alignnone size-full wp-image-22128" srcset="/wp-content/uploads/2017/01/2_nsSearch.png 640w, /wp-content/uploads/2017/01/2_nsSearch-300x138.png 300w, /wp-content/uploads/2017/01/2_nsSearch-207x95.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>この場合、Namespaceごとにアセットが管理されていたとすると、このModuleに関するアセットは、トップページのアセットがまとめられているディレクトリ内にあるはずです。トップページのアセットを、<code>/topPage</code>（<code>tp</code>）に置いていたとしたら、このModuleのアセットもその中にあることが分かります。また、新しく画像やJSを追加したい場合でも、このディレクトリの中に置けばよいということも分かります。</p>

<h3>捨てやすさ</h3>

<p>見つけやすいという点は重要ですが、何にも増して重要なのは、使わなくなったアセットを捨てられるという点です。</p>

<p>CSSを書いていると、一度書いてしまったルールセットは二度と消せないと感じないでしょうか。自分一人で書いていたならまだしも、複数の人間がひとつのWebサイトのCSSを編集していたら、自分が書いていないルールセットを編集したり、消したりするのには細心の注意が必要です。ECSSの「アセットの分離」というアプローチは、これを解決する一つの方法です。</p>

<p>例えば、トップページのデザインをリニューアルしたいと仮定します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/01/2_nsDel.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/01/2_nsDel.png" alt="2_nsDel" width="640" height="294" class="alignnone size-full wp-image-22126" srcset="/wp-content/uploads/2017/01/2_nsDel.png 640w, /wp-content/uploads/2017/01/2_nsDel-300x138.png 300w, /wp-content/uploads/2017/01/2_nsDel-207x95.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>この場合、それまでトップページで使っていたModule群はもう不要となるでしょうから、当然、そのModule内で使用していた画像なども不要になります。</p>

<p>このような場合、トップページ上のModule群をNamespace <code>tp</code>（topPage）に属させていたとして、そのアセットを<code>/topPage</code>に配置していたとすれば、もう過去のトップページのアセットは不要であると判断される場合、この<code>/topPage</code>ディレクトリごと消してしまえばよいのです。</p>

<p>そしてリニューアルされたバージョンのトップページで使うModule群は、Namespace <code>tp2</code>（topPage2）に属させることにします。そして、そのアセットを<code>/topPage2</code>に配置することにしましょう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/01/2_nsDel2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/01/2_nsDel2.png" alt="2_nsDel2" width="640" height="294" class="alignnone size-full wp-image-22127" srcset="/wp-content/uploads/2017/01/2_nsDel2.png 640w, /wp-content/uploads/2017/01/2_nsDel2-300x138.png 300w, /wp-content/uploads/2017/01/2_nsDel2-207x95.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>結果として、リニューアル前のトップページで使用されていたCSSや画像などは、どこにも残りません。</p>

<p>もし、トップページで使っているModule群が、他のページでも使えるよう、汎用的なModuleとして作られていたとしたら、このように、簡単に消すことはできないはずです。そのように汎用的に作ってしまったModuleは、永遠にWebサイトのCSSの中に残り続ける運命にあります。</p>

<p>また、前回解説した、「抽象化を避ける」という点についても思い出してみてください。もしOOCSSで言うレゴのように、細かな汎用的なModuleが沢山トップページで使用されていた場合、このように古いModuleを簡単に消すことができるでしょうか。きっと、使われていないModuleを一つ一つ吟味し、慎重に消すことになるでしょう。</p>

<p>何を重要とするかはプロジェクトにより異なるでしょうが、ECSSは、このようにNamespace毎にアセットを分離することで、運用にシンプルさをもたらし、永続的にCSSを運用していく事ができるようになると考えます。</p>

<hr />

<p>今回は、名前空間とアセットの分離について解説しました。次回は、ここまでで紹介していないトピックのうち、いくつかを選んで紹介します。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Enduring CSS]]></series:name>
	</item>
		<item>
		<title>抽象化を避けるCSS設計方法論「Enduring CSS」 第1回</title>
		<link>/takazudo/21946/</link>
		<pubDate>Fri, 13 Jan 2017 00:00:07 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[ESCC]]></category>

		<guid isPermaLink="false">/?p=21946</guid>
		<description><![CDATA[連載： Enduring CSS (1)本連載では、Enduring CSSというCSS設計方法論を紹介します。Enduring CSSは、Ben Frain氏の著書で、末永く破綻させずにサイトのCSSを設計するにはどう...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/ecss/" class="series-417" title="Enduring CSS" data-wpel-link="internal">Enduring CSS</a> (1)</div><p>本連載では、Enduring CSSというCSS設計方法論を紹介します。Enduring CSSは、Ben Frain氏の著書で、末永く破綻させずにサイトのCSSを設計するにはどうすればよいか。その方法論をまとめたものです。電子書籍でも販売していますが、Webサイトで全ての内容が公開されていますので、無料で全内容を確認可能です。</p>

<ul>
<li><a href="https://leanpub.com/enduringcss" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Enduring CSS by Ben Frain &#91;Leanpub PDF/iPad/Kindle&#93;</a></li>
<li><a href="http://ecss.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Architect CSS and scale CSS with the ECSS CSS methodology</a></li>
</ul>

<p>CSS設計方法論（CSS methodology）と言うと、OOCSS、BEM、SMACSSの3つが著名なものと言えるのではないでしょうか。</p>

<ul>
<li><a href="https://www.smashingmagazine.com/2011/12/an-introduction-to-object-oriented-css-oocss/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">An Introduction To Object Oriented CSS (OOCSS) – Smashing Magazine</a></li>
<li><a href="http://getbem.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">BEM — Block Element Modifier</a></li>
<li><a href="https://smacss.com/ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ja &#8211; Scalable and Modular Architecture for CSS</a></li>
</ul>

<p>特にBEMは、フロントエンド界隈でクラスの命名規則のデファクトスタンダードになったとも言ってしまっていい気がします。このEnduring CSS（以降ECSS）は、これらのCSS設計方法論と比較すると、知名度は低く、事細かにドキュメントが用意されているわけではありません。</p>

<p>しかしながら、ECSSの内容は筆者Takazudoにとって目からウロコであり、CSS設計に対する考え方をかなり改めさせられることとなりました。ECSSは、そこまでカッチリとしたルールではありません。サイトを長生きさせるにはどうすればいいかというヒント集のようなものと思って読むとよいと思います。</p>

<p>そんなEnduring CSSというCSS設計方法論を、ざっくりと紹介していきます。</p>

<h2>ECSSの特徴</h2>

<p>多くのCSS設計方法論では、ページを構成するUIをモジュールなどと呼ばれる単位に分け、管理するところから始めます。ECSSでもその考え方は同じです。この「モジュール」は、BlockだとかObjectだとかComponentだとか、いろいろな呼ばれ方をしますが、ECSSではこれをModuleと呼びます。</p>

<p>ECSSは、Module及びそのModuleの中身がどう構成されるかという考え方について、BEMを参考にしています。そこにNamespace（名前空間）や、Componentという概念を付け足したのがECSSの考え方になります。</p>

<h3>抽象化を避けるECSS</h3>

<p>ECSSでは、抽象化を避け、なるべく「分けて」管理することで運用の負荷を下げるというアプローチを取ります。</p>

<p>例えばOOCSSでは、ページを構成するUIをレゴの組み合わせで構成すると例えています。複雑なUIも単純なレゴをうまく組み合わせで構成し、新しいページを作る場合でも、既存のObjectで使えそうなものがあったらその組み合わせで構成し、足りないものは新しく作るという、HTMLとCSSの再利用を推し進めた考え方です。その結果、CSSを書く量が減るため、CSSの容量を減らすことができると。</p>

<p>そして、一つ一つのレゴをObjectと呼び、このObjectの変化のパターンをバリエーションをSkinという概念で表現し、オブジェクト思考における継承の考えを取り込んだ、かなりCSS的にミニマムな設計を指向しています。UIパーツをObjectで抽象化して考えるという具合です。</p>

<p>ECSSは、OOCSSのこのアプローチとは真逆と言ってよい考え方をします。ページを構成するUIパーツをモジュール化して管理するという点については同様ですが、多くの機能で汎用的に使用するModuleの存在をあまり良しとしません。同じような見栄えのUIパーツが登場したとしても、基本的にそれは別のものであると定義します。</p>

<p>そう聞くと疑問に思うことでしょう。その考えでコードを書いていったら、おなじCSSを何度もコピペすることになってしまうのでは？と。</p>

<h3>CSSの重複を許すECSS</h3>

<p>ECSSはそのようにCSSを重複して書くことを良しとします。</p>

<p>そのように考える大きな目的は、複雑化の回避です。幾つものObjectが組み合わされ、Skinでそれぞれが拡張された状態のコード。これを編集するのは、時に大変な作業になりえます。何が大変かというと、他所での影響を考慮しなければならないからです。</p>

<p>既に書いてあるCSSのルールセットを変更した場合、他のどこかで問題が発生しないと言い切れるでしょうか。小さなサイトであればそれは可能でしょう。しかし、複数のデベロッパーがコードをいじるような環境では、それを制御するのは困難を極めます。</p>

<p>そのように複雑な構造を一度作ってしまったら、ゆくゆくはコードを編集することが不可能になる。そしてCSSは破綻する。CSS容量を増やしてしまったとしても、「分ける」ことにより、これを避けるメリットのほうが遥かに大きいと考えるのがECSSです。CSSの容量増加は、gzipすれば大した差にはならないとECSSは考えています。</p>

<p>これは筆者Takazudoのイメージですが、OOCSSが目指すのが一つの高い塔であれば、ECSSが目指しているのはビル街です。</p>

<p><img src="/wp-content/uploads/2017/01/1_buildings.png" alt="" width="640" height="286" class="aligncenter size-full wp-image-21948" srcset="/wp-content/uploads/2017/01/1_buildings.png 640w, /wp-content/uploads/2017/01/1_buildings-300x134.png 300w, /wp-content/uploads/2017/01/1_buildings-207x93.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ECSSには、自身が大きなWebアプリケーションのCSS設計のため、合理的なアプローチが必要で考えたものであると書かれています。また、どのようなサイトにも適した考え方であると言うわけではないということも書かれています。このことは予め理解しておく必要があります。</p>

<h2>ECSSにおけるModule内の構成</h2>

<p>まずはECSSにおいて、Module及びその内容をどのように考えているのかを紹介します。基本的な考え方はBEMと同じなので、以下、BEMと比較する形で説明します。</p>

<p>例えば、こんなタブUIの構造を例に考えてみます。</p>

<p><img src="/wp-content/uploads/2017/01/1_bem1.png" alt="" width="413" height="146" class="aligncenter size-full wp-image-21950" srcset="/wp-content/uploads/2017/01/1_bem1.png 413w, /wp-content/uploads/2017/01/1_bem1-300x106.png 300w, /wp-content/uploads/2017/01/1_bem1-207x73.png 207w" sizes="(max-width: 413px) 100vw, 413px" /></p>

<p>BEMにおいて、このUIのタブ部分をBlockであると定義すると、</p>

<p><img src="/wp-content/uploads/2017/01/1_bem2.png" alt="" width="413" height="157" class="aligncenter size-full wp-image-21951" srcset="/wp-content/uploads/2017/01/1_bem2.png 413w, /wp-content/uploads/2017/01/1_bem2-300x114.png 300w, /wp-content/uploads/2017/01/1_bem2-207x79.png 207w" sizes="(max-width: 413px) 100vw, 413px" /></p>

<p>タブUI全体がBEMにおいてのBlock。これはECSSではModuleと呼びます。</p>

<p><img src="/wp-content/uploads/2017/01/1_bem3.png" alt="" width="413" height="157" class="aligncenter size-full wp-image-21952" srcset="/wp-content/uploads/2017/01/1_bem3.png 413w, /wp-content/uploads/2017/01/1_bem3-300x114.png 300w, /wp-content/uploads/2017/01/1_bem3-207x79.png 207w" sizes="(max-width: 413px) 100vw, 413px" /></p>

<p>そして例えば、一つ一つのタブがBEMにおいてのElement。これはECSSではChildNodeと呼びます。</p>

<p><img src="/wp-content/uploads/2017/01/1_bem4.png" alt="1_bem4" width="413" height="157" class="aligncenter size-full wp-image-21953" srcset="/wp-content/uploads/2017/01/1_bem4.png 413w, /wp-content/uploads/2017/01/1_bem4-300x114.png 300w, /wp-content/uploads/2017/01/1_bem4-207x79.png 207w" sizes="(max-width: 413px) 100vw, 413px" /></p>

<p>状態により変化するようなパーツは、BEMではModifierというフラグを付加することで表現します。これをECSSではvariantと呼びます。</p>

<p>このあたりは、BEMを理解しているのであれば、呼び方が変わっているぐらいの差に過ぎません。</p>

<h3>BEMのクラス命名規則</h3>

<p>BEMでは、このように考えた上で、各要素に命名規則に沿ったクラスを付加し、単純なクラスセレクタでルールセットを書いていきますが、これについてもECSSは同様です。</p>

<p>BEMにおけるクラスの命名規則は以下です。</p>

<p></p><pre class="crayon-plain-tag">block__element--modifier</pre><p></p>

<p>例えばこのタブUIのコードだと、以下のようになるかもしれません。</p>

<p></p><pre class="crayon-plain-tag">&lt;ul class="tab"&gt;
  &lt;li class="tab__item"&gt;&lt;button&gt;One&lt;/button&gt;&lt;/li&gt;
  &lt;li class="tab__item tab__item--active"&gt;&lt;button&gt;Two&lt;/button&gt;&lt;/li&gt;
  &lt;li class="tab__item"&gt;&lt;button&gt;Three&lt;/button&gt;&lt;/li&gt;
  &lt;li class="tab__item"&gt;&lt;button&gt;Four&lt;/button&gt;&lt;/li&gt;
&lt;/ul&gt;</pre><p></p>

<h3>ECSSのクラス命名規則</h3>

<p>これに対し、ECSSにおけるクラスの命名規則は以下です。</p>

<p></p><pre class="crayon-plain-tag">namespace-Module_ChildNode-variant</pre><p></p>

<p><code>namespace</code>というのは名前空間を意味しますが、これは追って解説します。他はBEMの名前が置き換わったぐらいと考えておいてよいです。</p>

<p></p><pre class="crayon-plain-tag">&lt;ul class="tp-Tab"&gt;
  &lt;li class="tp-Tab_Item"&gt;&lt;button&gt;One&lt;/button&gt;&lt;/li&gt;
  &lt;li class="tp-Tab_Item tp-Tab_Item-active"&gt;&lt;button&gt;Two&lt;/button&gt;&lt;/li&gt;
  &lt;li class="tp-Tab_Item"&gt;&lt;button&gt;Three&lt;/button&gt;&lt;/li&gt;
  &lt;li class="tp-Tab_Item"&gt;&lt;button&gt;Four&lt;/button&gt;&lt;/li&gt;
&lt;/ul&gt;</pre><p></p>

<p>ECSS著者はBEMの区切り文字が好みではないらしく、アンダースコアとハイフンで区切りを表現します。</p>

<p>ほか、ModuleとChildNodeはアッパーキャメルケースで記述します。これは、多くのプログラミング言語で、クラスの宣言は大文字からはじめ、そこからインスタンスを作成することになぞらえ、HTMLにおけるこのクラス属性に指定するこの文字列は、具体的なUIを表現するための雛形であるという考えのもと、アッパーキャメルケースで記述することにしたそうです。
（筆者Takazudo的にはけっこうナルホドと思いました）</p>

<h3>Component</h3>

<p>ECSSでは、Module内で登場するある程度の大きさを持ったUIの塊を、Componentとして定義することにしています。</p>

<p>例えば、ヘッダーのModule内でプルダウンメニューが登場したら、そのプルダウンをComponentとして扱うというような具合です。その場合は、上記クラス命名規則は以下ように、<code>Module</code>がComponent名に置き換わった形になります。</p>

<p></p><pre class="crayon-plain-tag">namespace-Component_ChildNode-variant</pre><p></p>

<p>どのようにComponentとしてまとめるかは各々が判断して設計する部分で、明確な切り分け基準があるわけはありません。Componentは、Moduleの大きさが大きくなった場合、コードの可読性やJavaScriptとして操作するまとまりの区切りをつけるために用意されるものと考えておいて良さそうです。</p>

<h2>Moduleの粒度</h2>

<p>ECSSには、Moduleは以下であると書かれています。</p>

<blockquote><p>a module is the widest, visually identifiable, individual section of functionality.</p></blockquote>

<p>「Moduleは、視覚的に認識できる個別の機能領域のもっとも大きな区分である」とでも訳せばよいのでしょうか。この定義からは、あまり小さい単位のUIをModuleであると定義しないような印象を受けます。</p>

<h3>具体的なModuleの例</h3>

<p>具体的にはどうModuleを考えればよいのか。丁度<a href="http://ecss.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ECSSのWebサイト</a>自体がECSSで書かれているので、そのクラス名から、Moduleの粒度がどのようなものかを見てみました。</p>

<p>※2017年1月時点でのWebサイトのコードを参照しています</p>

<p>ページの中ほどにある、ECSSの利点を述べた<code>Benefits</code>というModuleです。</p>

<p><img src="/wp-content/uploads/2017/01/1_benefits.png" alt="" width="640" height="445" class="aligncenter size-full wp-image-21954" srcset="/wp-content/uploads/2017/01/1_benefits.png 640w, /wp-content/uploads/2017/01/1_benefits-300x209.png 300w, /wp-content/uploads/2017/01/1_benefits-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このようなUIをHTMLとCSSで作る場合、例えばBEMであればどのようにBlockとElementを構成するでしょうか。</p>

<p>明確な決まりは当然ありませんが、例えば上部にある見出し部分、アイコン一つ一つ、アイコン直下にあるラベルなどを個別のBlockとして切り出し、Blockの入れ子により構成されると考えることもできます。</p>

<p>他でもそのBlockが使えそうだなと、そのように細かくBlock分けをしてもよさそうですが、実際のECSSのWebサイトでは、以下のようにクラス名が振られていました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/01/1_benefitsExplained.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/01/1_benefitsExplained.png" alt="" width="640" height="395" class="alignnone size-full wp-image-21955" srcset="/wp-content/uploads/2017/01/1_benefitsExplained.png 640w, /wp-content/uploads/2017/01/1_benefitsExplained-300x185.png 300w, /wp-content/uploads/2017/01/1_benefitsExplained-207x128.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>以下は、上記で青で囲んだ<code>home-Benefits_Unit</code>の内容です。</p>

<p><img src="/wp-content/uploads/2017/01/1_benefitsExplained2.png" alt="" width="640" height="197" class="aligncenter size-full wp-image-21956" srcset="/wp-content/uploads/2017/01/1_benefitsExplained2.png 640w, /wp-content/uploads/2017/01/1_benefitsExplained2-300x92.png 300w, /wp-content/uploads/2017/01/1_benefitsExplained2-207x64.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このクラス名から判断されることは、この<code>Benefits</code>とういうModuleは、このModule内に別のModuleやComponentが含まれておらず、中にある要素はすべてChildNodeとして構成されていることです。このことから、このModule内の要素は、このModuleの外側では一切使われないことが分かります。</p>

<p>また、このModuleの名称が<code>Benefits</code>という、具体的な機能を示すという点についてもECSSらしいと言えそうです。もしこのModuleが他でも使用されることを想定するのであれば、<code>IconTextSet</code>などという、汎用性を持った名前にしたほうが、後々都合が良いのではないでしょうか。</p>

<p>しかし、<code>Benefits</code>というModule名からは、このModuleが、ECSSのBenefitsを表すためだけに使用されることが想起されます。</p>

<h3 id="top-page-structure">トップページにあるその他のModule群</h3>

<p><a href="http://ecss.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ECSSのWebサイトトップページ</a>において、他のUI群は、どのようにModule分けされているのかを見てみました。以下がその図になります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/01/top_modules_1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/01/top_modules_1.png" alt="トップのモジュール一覧その1" width="640" height="378" class="alignnone size-full wp-image-21989" srcset="/wp-content/uploads/2017/01/top_modules_1.png 640w, /wp-content/uploads/2017/01/top_modules_1-300x177.png 300w, /wp-content/uploads/2017/01/top_modules_1-207x122.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/01/top_modules_2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/01/top_modules_2.png" alt="トップのモジュール一覧その2" width="640" height="453" class="alignnone size-full wp-image-21990" srcset="/wp-content/uploads/2017/01/top_modules_2.png 640w, /wp-content/uploads/2017/01/top_modules_2-300x212.png 300w, /wp-content/uploads/2017/01/top_modules_2-207x147.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2017/01/top_modules_3.png" data-wpel-link="internal"><img src="/wp-content/uploads/2017/01/top_modules_3.png" alt="トップのモジュール一覧その3" width="640" height="459" class="alignnone size-full wp-image-21991" srcset="/wp-content/uploads/2017/01/top_modules_3.png 640w, /wp-content/uploads/2017/01/top_modules_3-300x215.png 300w, /wp-content/uploads/2017/01/top_modules_3-207x148.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>各Module中のクラスも確認してみましたが、Module内に別のModuleがあるという、入れ子状態になっているModuleはありませんでした。また、各Module名称は、かなり具体的な単語になっているのも分かるのではないでしょうか。</p>

<p>単に一つのページの構成を例として挙げたにすぎませんが、このように、ECSSでは、Moduleを細かく分け、Moduleの入れ子で構成するような作りを避けることで、そのModuleがそれ自身で完結するようなModule分けを基本として考えています。同じような見栄えのUIが出ても、そのModuleの担う機能が別であれば、それは別のものとして扱います。</p>

<p>今回は、ECSSの考え方の概要と、Moduleについて解説しました。次回は、Namespaceとアセットの分離について解説します。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Enduring CSS]]></series:name>
	</item>
		<item>
		<title>テンプレートエンジン不要？JavaScriptで文字列処理を簡潔にするTemplate literal</title>
		<link>/takazudo/17396/</link>
		<pubDate>Mon, 19 Oct 2015 00:00:58 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">/?p=17396</guid>
		<description><![CDATA[連載： ECMAScript 2015（ECMAScript 6）特集 (7)これまでのJavaScriptでは、複雑な文字列処理はテンプレートエンジンを使うことが一般的でした。しかしECMAScript 2015（EC...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/ecma2015/" class="series-336" title="ECMAScript 2015（ECMAScript 6）特集" data-wpel-link="internal">ECMAScript 2015（ECMAScript 6）特集</a> (7)</div><p>これまでのJavaScriptでは、複雑な文字列処理はテンプレートエンジンを使うことが一般的でした。しかしECMAScript 2015（ECMAScript 6）では、パワフルなTemplate literalが標準で利用できるようになりました。この新たに追加されたTemplate literalについて、概要とサンプルコードを紹介します。
<img src="/wp-content/uploads/2015/10/Ecma_RVB-003.jpg" alt="" width="373" height="146" class="aligncenter size-full wp-image-17453" srcset="/wp-content/uploads/2015/10/Ecma_RVB-003.jpg 373w, /wp-content/uploads/2015/10/Ecma_RVB-003-300x117.jpg 300w, /wp-content/uploads/2015/10/Ecma_RVB-003-207x81.jpg 207w" sizes="(max-width: 373px) 100vw, 373px" /></p>

<h2>これまでの文字列組み立て</h2>

<p>ES6で追加されたTemplate literalを使うと、文字列をより柔軟に、シンプルに組み立てることができます。例えば、これまでのJavaScriptでは、文字列を組み立てるために、例えば以下のような方法を取る必要がありました。</p>

<p></p><pre class="crayon-plain-tag">var name = 'john';
var country = 'japan';

var str1 = 'Hello! My name is ' + name + '. I live in ' + country + '.';

var str2 = [
  'Hello! My name is ',
  name,
  '. I live in ',
  country,
  '.'
].join('');

console.log(str1); // "Hello! My name is john. I live in japan."
console.log(str2); // "Hello! My name is john. I live in japan."</pre><p></p>

<p>文字列の断片を複数作り、<code>+</code>や<code>concat</code>でつなぎ合わせたり、配列に突っ込んで<code>join</code>したりなどといった方法です。単純なテキスト結合であればことたりますが、ある程度複雑な処理を行う場合、可読性の欠如や、複数行に渡る文字列を簡潔に表現できないというような点が問題になってきます。</p>

<h2>Template literalを使った文字組み立て</h2>

<p>Template literalを使えば、上記の文字組み立てを、以下のように書くことができます。</p>

<p></p><pre class="crayon-plain-tag">var name = 'john';
var country = 'japan';

var str1 = `Hello! My name is ${name}. I live in ${country}.`;

console.log(str1); // "Hello! My name is john. I live in japan."</pre><p></p>

<p>&#96;&#96;で囲まれた部分がTemplate literalです。この中で<code>${name}</code>、<code>${country}</code>という部分がありますが、ここはそれぞれ、<code>"john"</code>、<code>"japan"</code>と、変数の内容に置き換わります。このように、Template literal内の<code>${}</code>部分は、その内容が評価された結果に置き換えられ、最終的な処理結果が文字列として変数<code>str1</code>に格納されます。</p>

<h2>式の展開</h2>

<p><code>${}</code>の中には、変数だけでなく、式を入れることができます。例えば、以下の例を見て下さい。</p>

<p></p><pre class="crayon-plain-tag">var str1 = `今月: ${(new Date).getMonth()+1}月`;

console.log(str1); // "今月: 10月"</pre><p></p>

<p>上記例では、<code>Date</code>を利用し、現在の月を表示させています。<code>(new Date).getMonth()+1</code>の結果は現在の月で、例えばこの原稿執筆時では<code>10</code>となりますが、このような計算結果を、あらかじめ変数に入れておかずとも、<code>${}</code>内で展開させることも可能です。</p>

<p>JavaScriptを用いて複雑なテキストの組み立て処理を行いたい場合、Handlebarsやmustacheといった、文字列処理を抽象化したテンプレートエンジンが利用されてきました。</p>

<ul>
<li><a href="http://handlebarsjs.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Handlebars.js: Minimal Templating on Steroids</a></li>
<li><a href="https://mustache.github.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">{{ mustache }}</a></li>
</ul>

<p>このようなライブラリを利用すれば、今解説したような、テンプレート的な文字列処理を行えるのですが、そういった処理がある程度、素のJavaScriptでできるようになります。</p>

<h2>タグ付テンプレート</h2>

<p>Template literalにはタグという機能（Tagged template strings）があります。タグを利用すると、テンプレートの処理内容を、functionで具体的に指定することができます。その仕組みを理解するため、まずは単純な例を見てみます。</p>

<p></p><pre class="crayon-plain-tag">var marginVal = '30px';
var paddingVal = '40px';

function tag(strings, ...values) {
  console.log(strings); // ["marginは", "で、paddingは", "です"]
  console.log(values);  // ["30px", "40px"]
  return 'returned strings!';
};

var str1 = tag `marginは${marginVal}で、paddingは${paddingVal}です`;

console.log(str1); // "returned strings!"</pre><p></p>

<p>ここで使われているTemplate literalの頭には、<code>tag</code>という文字があります。これがタグの指定で、<code>tag</code>というfunctionで、テンプレートの処理内容を定義していることを示します。タグとして指定されたfunctionは、テンプレート内の文字列、変数を受け取ることができます。そして、このfunctionの返す値が、Template literalの処理結果となります。</p>

<p>もし、このTemplate literalにタグが指定されていない場合、コンソールに表示される結果は「marginは30pxで、paddingは40pxです」となりますが、タグが指定されているため、そのようにはなりません。</p>

<p>以降は、この例で登場しているfunction、<code>tag</code>を眺めながらご確認下さい。</p>

<p>タグとして指定されたfunctionは、第一引数に、テンプレート内で使われている文字列が、登場する順に格納された配列を受け取ります。この場合ですと、処理する対象は「<code>marginは${marginVal}で、paddingは${paddingVal}です</code>」で、この中で使われている文字列は、以下の3つです。</p>

<ul>
<li>&#8220;marginは&#8221;</li>
<li>&#8220;で、paddingは&#8221;</li>
<li>&#8220;です&#8221;</li>
</ul>

<p>これらが配列になって渡ってくるのが第一引数。第二引数以降で、これら文字列の間に挟まっている<code>${}</code>で展開される式の結果が渡されます。ここでは、以下の値を<code>values</code>として受け取っています。(※1)</p>

<ul>
<li>&#8220;30px&#8221;</li>
<li>&#8220;40px&#8221;</li>
</ul>

<p>そして最終的にfunctionが返した値が、テンプレートの処理結果となります。この場合ですと、<code>"returned strings!"</code>という文字列を返しているので、<code>str1</code>に入るのは<code>"returned strings!"</code>という文字列となり、これがコンソールに表示される結果となります。</p>

<p>こんなふうにして、受け取った値を好きに加工してくださいというのがタグ付きテンプレートです。この例では、最終的に返した値が、受け取った値を一切使っていませんが、ひとまずのタグの仕組みの理解のためそうしています。</p>

<p>ちなみに、以下例のように、<code>${}</code>と<code>${}</code>の間に何も文字がない場合、空文字が渡されます。いきなり<code>${}</code>から始まる場合はその前に空文字が、<code>${}</code>で終わる場合はその後に空文字があるものとして扱われます。</p>

<p></p><pre class="crayon-plain-tag">var val1 = 'value1';
var val2 = 'value2';

function tag(strings, ...values) {
  console.log(strings, values);
};

var str1 = tag `${val1}`;        // ["", ""], ["value1"]
var str1 = tag `${val1}${val2}`; // ["", "", ""], ["value1", "value2"]</pre><p></p>

<p><small>
※1: <code>...values</code>と引数に書かれていますが、これは、残りの引数を配列にまとめて受け取ることのできる、ES6の<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rest parameters</a>という機能を利用しています。
</small></p>

<h2>タグを利用して大文字に変換する例</h2>

<p>このタグを利用し、テンプレート内に埋め込まれた文字列を大文字にしてみたのが、以下の例です。</p>

<p></p><pre class="crayon-plain-tag">var charsToUpper = function(strings, ...values) {
  var res = '';
  for(var i=0, l=strings.length; i&lt;l; i+=1) {
    res += strings[i];
    if(i &lt; values.length) {
      res += values[i].toUpperCase();
    }
  }
  return res;
};

var name = &#039;john&#039;;
var country = &#039;japan&#039;;

var str1 = charsToUpper `Hello! My name is ${name}. I live in ${country}.`;
var str2 = charsToUpper `${name} ${country}`;

console.log(str1); // &quot;Hello! My name is JOHN. I live in JAPAN.&quot;
console.log(str2); // &quot;JOHN JAPAN&quot;</pre><p></p>

<p>テンプレート内で利用されている変数<code>name</code>、<code>country</code>にはそれぞれ、<code>"john"</code>、<code>"japan"</code>と、小文字の文字列が入っていますが、テンプレートの処理結果は、<code>"Hello! My name is JOHN. I live in JAPAN."</code>と、大文字に置き換わっています。タグとして指定された<code>charsToUpper</code>の内容を見ると、登場する順に文字列と変数の内容を結合し、その中で、<code>${}</code>で埋め込まれた文字列に関しては、<code>.toUpperCase()</code>で大文字にしているのが確認できます。</p>

<h2>ブログ記事用のHTMLを展開する例</h2>

<p>最後に、ちょっと長いですが、ブログ記事のようなものをHTMLとして出力するようなケースを想定した例を紹介します。</p>

<p></p><pre class="crayon-plain-tag">var data = {
  title: '&lt;探検&gt;！ECMAScript',
  author: '佐藤鈴木&amp;田中太郎',
  tags: [ 'HTML', 'JavaScript', 'CSS' ],
  links: [
    { 
      title: 'Mozilla Developer Network',
      href: 'https://developer.mozilla.org/ja/'
    },
    {
      title: 'Web Hypertext Application Technology Working Group',
      href: 'https://whatwg.org/'
    }
  ],
  entryBody: '&lt;p&gt;This is a blog post!&lt;/p&gt;'
};

// HTMLの特殊文字を実体参照にするタグ
function htmlEscape(strings, ...values) {
  var handleString = function(str) {
    return str.replace(/&amp;/g, '&amp;amp;')
              .replace(/&gt;/g, '&amp;gt;')
              .replace(/&lt;/g, '&amp;lt;')
              .replace(/&quot;/g, '&amp;quot;')
              .replace(/'/g, '&amp;#039;')
              .replace(/`/g, '&amp;#096;');
  };
  var res = '';
  for(var i=0, l=strings.length; i&lt;l; i+=1) {
    res += handleString(strings[i]);
    if(i &lt; values.length) {
      res += handleString(values[i]);
    }
  }
  return res;
};

var html = `
  &lt;section class=&quot;entry&quot;&gt;
    &lt;header&gt;
      &lt;h1&gt;${htmlEscape `${data.title}`}&lt;/h1&gt;
      &lt;div class=&quot;author&quot;&gt;Author: ${htmlEscape `${data.author}`}&lt;/div&gt;
      &lt;ul class=&quot;tags&quot;&gt;
        ${data.tags.map(function(tag) { return `&lt;li&gt;${tag}&lt;/li&gt;` }).join('\n')}
      &lt;/ul&gt;
    &lt;/header&gt;
    ${data.entryBody}
    &lt;hr&gt;
    &lt;dl&gt;
      &lt;dt&gt;関連リンク&lt;/dt&gt;
      ${data.links.map(function(link) { return `&lt;dd&gt;&lt;a href=&quot;${link.href}&quot;&gt;${link.title}&lt;/dd&gt;` }).join('\n')}
    &lt;/dl&gt;
  &lt;/section&gt;
`;

console.log(html);</pre><p></p>

<p>このコードで出力されるのは、以下の文字列です。（見やすさのためにインデントを調節しています）</p>

<p></p><pre class="crayon-plain-tag">&lt;section class="entry"&gt;
  &lt;header&gt;
    &lt;h1&gt;&amp;lt;探検&amp;gt;！ECMAScript&lt;/h1&gt;
    &lt;div class="author"&gt;Author: 佐藤鈴木&amp;amp;田中太郎&lt;/div&gt;
    &lt;ul class="tags"&gt;
      &lt;li&gt;HTML&lt;/li&gt;
      &lt;li&gt;JavaScript&lt;/li&gt;
      &lt;li&gt;CSS&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/header&gt;
  &lt;p&gt;This is a blog post!&lt;/p&gt;
  &lt;hr&gt;
  &lt;dl&gt;
    &lt;dt&gt;関連リンク&lt;/dt&gt;
    &lt;dd&gt;&lt;a href="https://developer.mozilla.org/ja/"&gt;Mozilla Developer Network&lt;/dd&gt;
    &lt;dd&gt;&lt;a href="https://whatwg.org/"&gt;Web Hypertext Application Technology Working Group&lt;/dd&gt;
  &lt;/dl&gt;
&lt;/section&gt;</pre><p></p>

<p>このサンプルでは、コードの頭で用意しているオブジェクト<code>data</code>の内容を、テンプレートに展開しています。</p>

<p>その処理内容の中で、タグ<code>htmlEscape</code>を使っています。このfunctionは、受け取った値の中に含まれるHTMLの特殊文字を実体参照に変換し、ひとつに結合して返します。ここでは、タイトル部分と著者名部分に使われており、出力結果には&#8220;、<code>&amp;amp;</code>がそれぞれ実体参照に置き換わっているのが確認できます。</p>

<p>このほか、タグやリンクからリストを作っている箇所では、<code>${}</code>の中で<code>map</code>(※2)を使い、配列をli要素の繰り返しに変換しています。単純な処理であれば、このようにテンプレート内で何らかの処理を行わせてしまってもよいですし、ある程度複雑な処理であれば、別途functionとして分け、<code>${}</code>内でそのfunctionを呼び出すというような方法を取るのもよさそうです(※3)。</p>

<p><small>
※2: <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Array.prototype.map</a>は、配列の各要素それぞれに対して、渡されたfunctionを実行し、その結果から新しい配列を作る機能です。</p>

<p>※3: ES6で追加された<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Arrow function</a>を使えば、このテンプレート内で<code>map</code>が使用されている箇所を、以下のように簡潔に書くことができます。
</small></p>

<p></p><pre class="crayon-plain-tag">${data.tags.map(tag =&gt; `<li>${tag}</li>`).join('\n')}</pre><p></p>

<p></p><pre class="crayon-plain-tag">${data.links.map(link =&gt; `<dd><a href="${link.href}" data-wpel-link="internal">${link.title}</dd>`).join('\n')}</pre><p></p>

<h2>ブラウザ対応状況</h2>

<p>以下のサイトのES6対応テーブルを見ると、Template literal (Template strings)は、IEを除く最新版のモダンブラウザ（Microsoft Edgeは可）で利用可能なようです。各ブラウザの対応はかなり進んでいると言えそうですが、bable等のトランスパイラを利用しない場合、IE11、iOS8のSafariではまだ対応していないというあたりが、現実的に利用可能かを判断するボーダーラインとなりそうです。</p>

<ul>
<li><a href="https://kangax.github.io/compat-table/es6/#test-template_strings">ECMAScript 6 compatibility table</a></li>
</ul>

<h2>まとめ</h2>

<p>以上、Template literalについて、その概要を解説しました。Template literalを用いれば、文字列の結合処理をとても簡潔に書くことができるようになります。複雑なテンプレート処理の場合ははやり、テンプレートエンジンのような仕組みを利用したほうが良いケースが多いように筆者は感じますが、ちょっとした文字列処理の際には、基本、Template literalを使っていくようになるのではないでしょうか。</p>

<p>Template literalについてより詳しく知りたい場合、以下が参考になります。</p>

<ul>
<li><a href="https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/template_strings" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Template strings &#8211; JavaScript | MDN</a></li>
<li><a href="http://ponyfoo.com/articles/es6-template-strings-in-depth" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ES6 Template Literals in Depth</a></li>
<li><a href="http://www.sitepoint.com/es6-now-template-strings/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ES6 for Now: Template Strings</a></li>
</ul>
]]></content:encoded>
		
		<series:name><![CDATA[ECMAScript 2015（ECMAScript 6）特集]]></series:name>
	</item>
		<item>
		<title>JavaScriptにもクラスがやってきた！JavaScriptの新しいclass構文をマスターしよう</title>
		<link>/takazudo/17355/</link>
		<pubDate>Fri, 16 Oct 2015 04:00:17 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">/?p=17355</guid>
		<description><![CDATA[連載： ECMAScript 2015（ECMAScript 6）特集 (6)ECMAScript 2015（ECMAScript 6）で新たに追加された待望のclass構文について、その概要をサンプルコードを交えて紹介...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/ecma2015/" class="series-336" title="ECMAScript 2015（ECMAScript 6）特集" data-wpel-link="internal">ECMAScript 2015（ECMAScript 6）特集</a> (6)</div><p>ECMAScript 2015（ECMAScript 6）で新たに追加された待望のclass構文について、その概要をサンプルコードを交えて紹介します。</p>

<p><img src="/wp-content/uploads/2015/10/Ecma_RVB-003.jpg" alt="" width="373" height="146" class="aligncenter size-full wp-image-17453" srcset="/wp-content/uploads/2015/10/Ecma_RVB-003.jpg 373w, /wp-content/uploads/2015/10/Ecma_RVB-003-300x117.jpg 300w, /wp-content/uploads/2015/10/Ecma_RVB-003-207x81.jpg 207w" sizes="(max-width: 373px) 100vw, 373px" /></p>

<h2>これまでのJavaScriptにおけるクラス</h2>

<p>多くのプログラミング言語はクラスを作れる機能を持っていますが、JavaScriptにその機能は用意されていませんでした。しかし、JavaScriptにはprototypeという柔軟な仕組みが存在しており、このprototypeを利用することで、他の言語で表現されている「クラス」と似たような振る舞いを再現することが可能でした。</p>

<p>それは例えば、こんなふうにです。</p>

<p></p><pre class="crayon-plain-tag">/* Cat雛形の作成 */

function Cat(name) {
  this.setName(name);
};
Cat.prototype = {
  setName: function(name) {
    this._name = name;
  },
  getName: function() {
    return this._name;
  },
  walk: function() {
    console.log(this._name + 'が歩いてます');
  }
};

/* Catからオブジェクトを作成 */

var cat1 = new Cat('タマ');
var cat2 = new Cat('コタロー');
cat1.walk(); // タマが歩いています
cat2.walk(); // コタローが歩いています</pre><p></p>

<p>コンストラクタであるfunction <code>Cat</code>を宣言し、その<code>prototype</code>にインスタンスメソッド群を定義したオブジェクトを指定します。すると、<code>new Cat</code>した時、作成されたオブジェクトのプロパティは、そのオブジェクト自身に直接定義されていない場合、<code>Cat.prototype</code>に定義されている同名のプロパティを参照するという具合です。</p>

<p>このように、単純なオブジェクトの雛形を作るだけならまだよいのですが、あるクラスを継承し、別のクラスを作る、いわゆる「クラスの継承」を表現するのはちょっと複雑です。その実装方法についてはここでは割愛しますが、例えばこの<code>Cat</code>であれば、より上位の概念を表現したクラス<code>Animal</code>を用意し、<code>Cat</code>は<code>Animal</code>を継承して作られる……というような場合です。複雑と言っても、よく使われる概念ではあるので、これまでは多くのライブラリやトランスパイラがこの機能を担っていました。</p>

<p>このような、prototypeを利用した「クラス」的な振る舞いの実装は、JavaScript初学者のひとつのハードルになっていたと言ってもよいのではないでしょうか。</p>

<h2>ES6のclass構文</h2>

<p>そんな「クラス」を実現するclass構文が、ES6では用意されました。</p>

<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Classes &#8211; JavaScript | MDN</a></li>
<li><a href="http://www.ecma-international.org/ecma-262/6.0/#sec-class-definitions" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ECMAScript 2015 Language Specification &#8211; Class Definitions</a></li>
</ul>

<p>class構文を使えば、クラスの継承も簡単に行えます。その仕様の実態は、prototypeベースの継承であり、単なる糖衣構文に過ぎませんが、複雑な実装をすることなく誰でも簡単にクラスを扱えるようになったことは大きな意味があると言ってよいでしょう。</p>

<p>先ほどの<code>Cat</code>を、ES6のclass構文で書くと、以下のようになります。</p>

<p></p><pre class="crayon-plain-tag">/* Catクラス */

class Cat {
  constructor(name) {
    this.name = name;
  }
  set name(name) {
    this._name = name;
  }
  get name() {
    return this._name;
  }
  walk() {
    console.log(this._name + 'が歩いてます');
  }
}

/* Catクラスのインスタンス作成 */

var cat1 = new Cat('タマ');
var cat2 = new Cat('コタロー');
cat1.walk(); // タマが歩いています
cat2.walk(); // コタローが歩いています</pre><p></p>

<p>これで先ほどと同様の実行結果になります。</p>

<p>※ ここで使っている<code>set</code>はsetter、<code>get</code>はgetterとしてES5で定義されている構文、<code>walk</code>メソッドを定義しているのはMethod definitionで、ES6で定義されている構文です。class構文とはまた別なので注意して下さい。</p>

<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">setter &#8211; JavaScript | MDN</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">getter &#8211; JavaScript | MDN</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Method definitions &#8211; JavaScript | MDN</a></li>
</ul>

<h2>静的メソッド</h2>

<p>class構文は、静的メソッド※の定義方法も用意しています。先ほどの<code>Cat</code>に、作成した猫の数を返す<code>count</code>メソッドを実装してみたのが以下です。</p>

<p>※クラスのインスタンスを作らずとも呼べるメソッドのことを言います。</p>

<p></p><pre class="crayon-plain-tag">var catCount = 0; // 作った猫の数

/* Catクラス */

class Cat {
  constructor(name) {
    this.name = name;
    catCount += 1; // 作った猫の数を+1
  }
  set name(name) {
    this._name = name;
  }
  get name() {
    return this._name;
  }
  walk() {
    console.log(this._name + 'が歩いてます');
  }
  /* 静的メソッド */
  static count() {
    return catCount;
  }
}

/* Catクラスのインスタンス作成 */

console.log(Cat.count()); // 0
var cat1 = new Cat('タマ');
console.log(Cat.count()); // 1
var cat2 = new Cat('コタロー');
console.log(Cat.count()); // 2</pre><p></p>

<p><code>Cat</code>の<code>constructor</code>が実行されると猫の匹数を示す<code>catCount</code>がインクリメントされ、静的メソッドの<code>count()</code>が呼ばれると、この<code>catCount</code>を返します。</p>

<p>※ ちなみに、メソッド以外の静的なプロパティを設定すること（ここだと例えば<code>Cat.catCount</code>に猫の数を格納するようなこと）は、class構文には今のところ用意されていないようです。これについては2015年10月現在、proposalが出ているだけの状態で、今後どうなるかはまだ分かりません。</p>

<ul>
<li><a href="https://github.com/jeffmo/es-class-static-properties-and-fields" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GitHub &#8211; jeffmo/es-class-static-properties-and-fields</a></li>
<li><a href="http://stackoverflow.com/questions/22528967/es6-class-variable-alternatives" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">javascript &#8211; ES6 class variable alternatives &#8211; Stack Overflow</a></li>
</ul>

<h2>クラスの継承</h2>

<p>クラスを継承し、別のクラスを作るには、<code>extends</code>を使います。以下は、<code>Animal</code>を継承した<code>Cat</code>クラスを定義した例です。</p>

<p></p><pre class="crayon-plain-tag">/* Animalクラス */

class Animal {
  constructor(name) {
    this.name = name;
  }
  set name(name) {
    this._name = name;
  }
  get name() {
    return this._name;
  }
  walk() {
    console.log(this.name + 'が歩いてます');
  }
}

/* Catクラス */

class Cat extends Animal { // Animalを継承したCatクラスを定義
  mew() {
    console.log(this.name + 'がニャーと鳴いてます');
  }
}

/* Catクラスのインスタンス作成 */

var cat1 = new Cat('タマ');
console.log(cat1.name); // タマ
cat1.walk(); // タマが歩いてます
cat1.mew();  // タマがニャーと鳴いてます

var cat2 = new Cat('コタロー');
console.log(cat2.name); // コタロー
cat2.walk(); // コタローが歩いてます
cat2.mew();  // コタローがニャーと鳴いてます</pre><p></p>

<p><code>Cat</code>のインスタンスオブジェクトである<code>cat1</code>、<code>cat2</code>は、<code>Cat</code>に定義されているメソッドが利用できるだけではなく、<code>Animal</code>に定義されている<code>constructor</code>で初期化され、<code>Animal</code>で定義されているメソッドを利用できていることが分かります。</p>

<h2>継承元のメソッド呼び出し</h2>

<p>クラスを継承した場合、継承元のメソッドを呼びたいことがあります。その場合、以下のように<code>super</code>を使います。</p>

<p></p><pre class="crayon-plain-tag">/* Catクラス */

class Cat extends Animal {
  constructor(name, color) {
    super(name); // Animalクラスのconstructor呼び出し
    this.color = color;
  }
  get color() {
    return this._color;
  }
  set color(color) {
    this._color = color;
  }
  mew() {
    console.log(this.color + '色の' + this.name + 'がニャーと鳴いてます');
  }
  walk() {
    super.walk(); // Animalクラスのwalkメソッド呼び出し
    console.log('忍び足です');
  }
}

/* Catクラスのインスタンス作成 */

var cat1 = new Cat('タマ', '茶');
console.log(cat1.name); // タマ
cat1.walk(); // タマが歩いてます
             // 忍び足です
cat1.mew();  // 茶色のタマがニャーと鳴いてます

var cat2 = new Cat('コタロー', '黒');
console.log(cat2.name); // コタロー
cat2.walk(); // コタローが歩いてます
             // 忍び足です
cat2.mew();  // 黒色のコタローがニャーと鳴いてます</pre><p></p>

<p><code>constructor</code>内で、<code>super(name)</code>と、<code>Animal</code>の<code>constructor</code>を実行し、<code>walk()</code>内で<code>super.walk()</code>と、<code>Animal</code>の<code>walk</code>を実行しています。</p>

<p>class構文を使わない場合、<code>Animal.prototype.walk.apply(this, arguments)</code>などと、継承元のメソッドを<code>prototype</code>経由で直接参照し、<code>apply</code>でコンテキストを自分にして実行するなどというような実装が必要です。<code>super</code>を使えば、同じ内容をとてもシンプルに書くことができます。</p>

<h2>その他注意点</h2>

<p>他、筆者がclass構文を使ってみて気になったこととして、インスタンスのプロパティを<code>prototype</code>直下に直接指定できないという点が気になりました。例えば、はじめに挙げた<code>Cat</code>でインスタンス作成時に<code>name</code>を受け取らない場合、以下のように書けば、<code>setName</code>する前に<code>getName</code>が呼ばれた場合、<code>'名無しの猫'</code>が名前として返ります。</p>

<p></p><pre class="crayon-plain-tag">/* Cat雛形の作成 */

function Cat() {};
Cat.prototype = {
  _name: '名無しの猫', /* _nameの初期値として指定 */
  setName: function(name) {
    this._name = name;
  },
  getName: function() {
    return this._name;
  },
  walk: function() {
    console.log(this._name + 'が歩いてます');
  }
};</pre><p></p>

<p>しかし、ES6のclass構文では、class宣言時に設定できるのはメソッドのみです。上記例のように<code>_name</code>を<code>prototype</code>に指定することができません。インスタンスのプロパティの初期値を設定したい場合、<code>constructor</code>内で設定する必要があります。</p>

<p>※<code>prototype</code>直下にオブジェクトを指定した場合、全てのインスタンスで同一のオブジェクトを参照してしまい、思わぬバグの原因になったりすることもありえるため、このような書き方をそもそもしないほうがよいという見解もあります。</p>

<h2>ブラウザ対応状況</h2>

<p>class構文の対応状況は、2015年10月現在、まだまだといった状況です。</p>

<ul>
<li><a href="http://kangax.github.io/compat-table/es6/#test-class" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ECMAScript 6 compatibility table</a></li>
</ul>

<p>筆者が確認したタイミングで対応しているのは、Safari9 (Webkit)だけです。デベロッパー版や設定フラグなど考慮すると Chrome45 (enable-javascript-harmonyをオンにし、strict modeのみで動作)、Firefox nightly (v44)、Microsoft Edge（experimental featureをオンにして使用）などで利用できます。一般的な閲覧環境を想定する場合、class構文を使用するのはまだ先だと考えておいてよいでしょう。bableやtraceur等のトランスパイラは対応しています。ただし、まだclass構文の全ての機能に対応しているわけではないようです。</p>

<p>ちなみに筆者は、本稿を書くためのサンプルを、Chrome canaryで動作することを確認しています。</p>

<h2>まとめ</h2>

<p>以上、ES6のclass構文について、その概要を簡単に紹介しました。筆者は、好きでよく<a href="http://coffeescript.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CoffeeScript</a>を使っていたのですが、CoffeeScriptを使う大きな理由の一つとして、CoffeeScript独自のclass構文が使えるようになっているというところがありました。そういったコードの設計の根幹部分が言語として用意された状態だと、コードの見通しがよくなるなぁと感じていまして。しかし、ES6にてclass構文が実装されたとなれば、自分がCoffeeScriptを選択する理由が一つ、なくなった感じがします。</p>

<p>ほか、class構文を使って書かれたコードは、そのコードで表現したいことが、同様の内容をclass構文を使わないで書いた場合よりも、よりシンプルに表現できているように感じます。これは、チーム間でのコミュニケーション効率を高め、開発をスムーズにするかもしれません。</p>

<p>class構文がやってくれることは、これまでJavaScriptで書かれてきたいわゆる「クラス」的なものの実装そのものであるため、class構文を使ったからといって、これまで書いてきたJavaScriptと根本的に設計が変わってしまうということはないでしょう。ブラウザの対応はまだまだのようですが、babelをお供に、開発に採用できるケースはかなり多いのではないかと思います。</p>
]]></content:encoded>
		
		<series:name><![CDATA[ECMAScript 2015（ECMAScript 6）特集]]></series:name>
	</item>
		<item>
		<title>Promiseで簡単！JavaScript非同期処理入門【後編】</title>
		<link>/takazudo/17113/</link>
		<pubDate>Mon, 05 Oct 2015 00:00:01 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">/?p=17113</guid>
		<description><![CDATA[連載： ECMAScript 2015（ECMAScript 6）特集 (5)前回に引き続き、ECMAScript 2015（ECMAScript 6）で新たに追加されたPromiseについて、その概要を全2回に渡って紹...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/ecma2015/" class="series-336" title="ECMAScript 2015（ECMAScript 6）特集" data-wpel-link="internal">ECMAScript 2015（ECMAScript 6）特集</a> (5)</div><p>前回に引き続き、ECMAScript 2015（ECMAScript 6）で新たに追加されたPromiseについて、その概要を全2回に渡って紹介します。今回は後編です。</p>

<h2>前回のおさらい</h2>

<p>前回は、こんなふうにPromiseを使うという例を紹介しました。それは、以下のようにAjaxでAPIにアクセスする例でした。</p>

<p></p><pre class="crayon-plain-tag">var fetchSomething1 = function() {
  return new Promise(function(resolve, reject) {
    // API1にアクセス
    doAjaxStuff(someOptions1, {
      success: function(data) { // 成功した場合
        resolve();
      },
      fail: function() { // 何かしらエラーが発生した場合
        reject({ message: 'APIにアクセスできませんでした' });
      }
    });
  });
};

fetchSomething1().then(function() { // A: fetchSomething1の成功時に実行される
  alert('API1よりデータを取得しました');
}, function(error) { // B: fetchSomething1の失敗時に実行される
  alert('API1よりデータを取得できませんでした。エラーメッセージ: ' + error.message);
});</pre><p></p>

<p>ここで定義している<code>fetchSomething1</code>は、Promiseオブジェクトを返します。AjaxでAPIにアクセスするのが成功した場合、<code>then</code>の第一引数に指定したfunctionが、失敗した場合、<code>then</code>の第二引数に指定したfunctionが実行されるのでした。</p>

<p>以降、便宜上、<code>then</code>の第一引数に指定されたfunctionのことをonFulfilledハンドラ、第二引数に指定されたfunctionのことをonRejectedハンドラと呼ぶことにします。</p>

<h2>Promiseインターフェイスの実装例: Fetch API</h2>

<p>このPromise、今後はJavaScriptを書いていく上での基本的な知識となっていくことが、ほとんど確実と言ってよいだろうと筆者は考えます。</p>

<p>例えば、WHATWGで策定されている<a href="https://fetch.spec.whatwg.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Fetch API</a>は、Promiseをベースに作られています。以下の例では、同階層にある<code>memo.txt</code>の内容をFetch APIを利用して取得、そのファイルの内容を<code>console.log</code>しています。</p>

<p></p><pre class="crayon-plain-tag">fetch('./memo.txt')
  .then(function(response) {
    response.text().then(function(text) {
      console.log(text); // memo.txtの内容
    });
  }, function(error) {
    console.log(error);
  });</pre><p></p>

<p>Fetch APIについての知識がなかったとしても、Promiseに慣れていれば、上記コードがどのような意味を持っているかを想像するのは容易でしょう。今後、ブラウザやECMAScript自体が実装していく非同期に処理を行うAPIについても、Promiseをベースとしていくであろうと想像されます。</p>

<p>なお、このコード内では、<code>response.text()</code>でレスポンス内容のテキストを取得しています。この処理自体も非同期で実装されており、その結果を<code>then</code>で受け取るようになっています。</p>

<h2>インターフェースを統一できるのもPromiseのメリット</h2>

<p>初めに挙げたAjaxする例ですが、コレ、<code>then</code>を使って、Ajaxの成功時、失敗時に指定したfunctionを実行させているわけですが、前編で紹介したコールバックを使っても実装可能です。例えばこんなふうにしたっていいじゃないですか。</p>

<p></p><pre class="crayon-plain-tag">fetchSomething1(function() {
  // 成功時の処理
}, function() {
  // エラー時の処理
});</pre><p></p>

<p>第一引数に成功時の処理を、第二引数にエラー時の処理を。これでも問題ないです。はたまた、こんなのはどうでしょう。各種オプションを渡せるようにしました。</p>

<p></p><pre class="crayon-plain-tag">fetchSomething1(params, method, noCache, {
  success: function() {
    // 成功時の処理
  },
  fail: function() {
    // エラー時の処理
  }
});</pre><p></p>

<p>やりかたはいろいろとあります。どの方法が一番良いのでしょう？それぞれメリット、デメリットがあるかもしれませんが、ひとつ言えることは、各々が、それぞれの方法でバラバラな書き方をしてしまうことがあり得るということです。</p>

<p>Promiseを利用すれば、非同期処理の書き方を統一できます。成功か失敗か。結果が単純にその2つに分かれる非同期処理において、それを担うfunctionがPromiseオブジェクトを返してくれるのであれば、結果を受け取った方は、以降の処理を<code>then</code>で書くものと理解することができます。</p>

<p>これはあくまで、そのように書くよう統一しておけば、多くの人が理解しやすいコードにできますというだけのことではあるのですが、PromiseがES6に採用されたことで、非同期処理の扱いには、Promiseをベースにしていくのが基本となっていくことはほとんど確実と言えるのではないでしょうか。</p>

<h2>順次処理を行わせる</h2>

<p>前回、コールバックを使いAPIに順番にアクセスすると、以下のようになってしまうという例を挙げました。</p>

<p></p><pre class="crayon-plain-tag">/* 順番に実行 */

fetchSomething1(function() {
  fetchSomething2(function() {
    fetchSomething3(function() {
      fetchSomething4(doSomethingFinally); // 全部終わったら doSomethingFinally()
    });
  });
});</pre><p></p>

<p>そして先ほど、この<code>fetchSomething1</code>を、Promiseをベースにした書き方にしてみたわけですが、他のfunctionも同様にPromiseベースで書き直し、それぞれがPromiseオブジェクトを返すようにすると、上記コードは以下のように書き直せます。</p>

<p></p><pre class="crayon-plain-tag">fetchSomething1()
  .then(fetchSomething2)
  .then(fetchSomething3)
  .then(fetchSomething4)
  .then(doSomethingFinally);</pre><p></p>

<p>何段階にも入れ子になってしまうfunctionよりも、こちらのほうがコードの見通しがよいのではないでしょうか。</p>

<p><code>fetchSomething1</code>〜<code>fetchSomething4</code>はそれぞれ、Promsieオブジェクトを返します。<code>then</code>に指定されたfunction内でPromiseオブジェクトが返された場合、<code>then</code>の返す値自体が、そのPromiseオブジェクトとなります。上記を一つずつ分けて書くと、以下のようになります。</p>

<p></p><pre class="crayon-plain-tag">var promise1 = fetchSomething1();
var promise2 = promise1.then(fetchSomething2);
var promise3 = promise2.then(fetchSomething3);
var promise4 = promise2.then(fetchSomething4);
promise4.then(doSomethingFinally);</pre><p></p>

<p>各functionはそれぞれのPromiseを返し、続けて書いた処理は、前のPromiseが<code>fulfilled</code>になった時に初めて実行されます。<code>fetchSomething2</code>は<code>fetchSomething1</code>の返すPromiseが<code>fulfilled</code>になった時に実行され、<code>fetchSomething3</code>は<code>fetchSometing2</code>の返すPromiseが<code>fulfilled</code>になった時に実行され……と、非同期処理が連鎖するように動作します。</p>

<p>Promiseを使えば、このように連続した非同期処理を簡潔に記述することが可能になります。</p>

<h2>同期的な処理も混ぜる</h2>

<p>そのように非同期処理をうまく扱えるようにするPromiseですが、その途中に同期的な処理を挟むこともできます。</p>

<p>以下で用意した各functionはそれぞれ、非同期的に扱う必要のない処理たちですが、渡された数値を2倍にして返す<code>double</code>と、渡された数値を3倍にして返す<code>treble</code>は、Promiseオブジェクトを返し、計算が終わったらその結果を後続する処理に渡すようにしています。</p>

<p>また、渡された数値をコンソールに表示するだけのfunction、<code>dump</code>は、<code>console.log</code>で渡された値を表示したあとは、そのままその数値を返しています。</p>

<p></p><pre class="crayon-plain-tag">/* 2倍にする */

var double = function(number) {
  return new Promise(function(resolve) {
    resolve(number * 2);
  });
};

/* 3倍にする */

var treble = function(number) {
  return new Promise(function(resolve) {
    resolve(number * 3);
  });
};

/* 表示する */

var dump = function(number) {
  console.log(number);
  return number;
}

/* 実行 */

double(10)       // 10*2 -&gt; 20
  .then(dump)    // コンソールに表示: 20
  .then(treble)  // 20*3 -&gt; 60
  .then(dump)    // コンソールに表示: 60
  .then(double)  // 60*2 -&gt; 120
  .then(dump);   // コンソールに表示: 120</pre><p></p>

<p><code>resolve</code>に渡した値は、後続する処理で受け取ることができるため、<code>double(10)</code>の結果は後続する<code>dump</code>に渡されます。function <code>dump</code>の内容は、<code>console.log</code>した後、渡された数値を返すだけです。このように、onFulfilledハンドラ内でPromiseオブジェクト以外が返された場合、新しくPromiseオブジェクトが作成され、返した値ですぐに<code>resolve</code>されます。例えば、上記コードで最初に<code>dump</code>している箇所は、処理内容的には以下と同じです。</p>

<p></p><pre class="crayon-plain-tag">double(10)       // 10*2 -&gt; 20
  .then(function(number) {
    return new Promise(function(resolve) {
      console.log(number); // コンソールに表示: 20
      resolve(number);
    });
  })    
  .then(treble)  // 20*3 -&gt; 60
  .then(dump)    // コンソールに表示: 60
  .then(double)  // 60*2 -&gt; 120
  .then(dump);   // コンソールに表示: 120</pre><p></p>

<p>このような仕組みが用意されているため、Promiseを使うことで、同期処理と非同期処理を自然に混ぜて記述することが可能になっています。</p>

<p>※ ちなみに、ここで用意したfunction<code>double</code>も、<code>treble</code>も、処理内容的には同期的なものですが、Promiseを介すと、非同期な処理として扱われます。</p>

<h2>並列処理</h2>

<p>非同期処理を扱う時、一つずつ順番に処理するのではなく、いくつかの処理を並列に走らせたい場合があります。例えば、何回か例に出している、AjaxでAPIにアクセスするfunction、<code>fetchSomething1</code>〜<code>fetchSomething4</code>であれば、これらを同時に実行し、すべての処理が終わったタイミングを知りたいというようなケースを考えてみます。そのような並列処理は、<code>Promise.all</code>を使うことで簡単に実装できます。以下にそのコード例を挙げます。</p>

<p></p><pre class="crayon-plain-tag">var promises = [
  fetchSomething1(),
  fetchSomething2(),
  fetchSomething3(),
  fetchSomething4()
];

Promise.all(promises)
  .then(function(results) {
    console.log(results[0]); // fetchSomething1のresolveに渡された値
    console.log(results[1]); // fetchSomething2のresolveに渡された値
    console.log(results[2]); // fetchSomething3のresolveに渡された値
    console.log(results[3]); // fetchSomething4のresolveに渡された値
    doSomethingFinally();
  }, function(error) {
    console.log(error); // 最初にrejectに渡された値
  });</pre><p></p>

<p><code>Promise.all</code>にPromiseオブジェクトの配列を渡すと、渡された全てのPromiseオブジェクトが<code>fulfilled</code>になった時、後続する<code>then</code>にて登録された処理が実行されます。このとき、各Promiseオブジェクト内で<code>resolve</code>に渡された値は、それぞれの結果をまとめた配列として受け取ることができます。上記コードだと、<code>then</code>のonFulfilledハンドラで受け取っている<code>results</code>がその配列です。</p>

<p>また、いずれかのPromiseオブジェクトが<code>rejected</code>になった場合、<code>then</code>のonRejectedハンドラが実行されます。この時、<code>rejected</code>にされたPromiseオブジェクト内で、<code>reject</code>に渡された値を受け取ることができます。</p>

<p>このような処理を<code>Promise.all</code>なしで書くには、コールバックのように一筋縄で済ませることはできません。各処理が終わったかどうかをフラグを立ててチェックしたりなど、なかなか地味な処理を書く必要がありそうです。しかし、Promiseがあれば簡潔に処理を記述することができます。</p>

<h2>エラーをまとめてキャッチ</h2>

<p><code>then</code>のonRejectedハンドラは、Promiseオブジェクトが<code>rejected</code>になったときに実行されます。この時、<code>then</code>にonRejectedハンドラが指定されていない場合、後続する<code>then</code>のonRejectedハンドラが実行されます。例えば以下のような例を見てみます。</p>

<p></p><pre class="crayon-plain-tag">fetchSomething1()
  .then(fetchSomething2) // A
  .then(doSomethingFinally, handleError); // B</pre><p></p>

<p>今までの例と同様、<code>fetchSomethingX</code>は、AjaxでAPIにアクセスする、非同期で、Promiseオブジェクトを返すfunctionです。ここで、<code>fetchSomething1</code>の中でエラーが発生し、<code>fetchSomething1</code>が返すPromiseオブジェクトが<code>rejected</code>になったとします。すると、上記コメントAで示した<code>then</code>に指定されたonRejectedハンドラが実行されるのですが、AにはonRejectedハンドラが指定されていません。その場合は、続きの<code>then</code>に指定されたonRejectedハンドラが実行されます。この結果、上記コメントBにて指定されているonRejectedハンドラ<code>handleError</code>が実行される結果となります。</p>

<p>これはエラーの発生をまとめて扱いたい際に便利な機能です。同様に順次AjaxでAPIにいくつもアクセスする場合、以下のようにエラー処理をまとめて行うことができます。</p>

<p></p><pre class="crayon-plain-tag">fetchSomething1()
  .then(fetchSomething2)
  .then(fetchSomething3)
  .then(fetchSomething4)
  .then(fetchSomething5)
  .then(doSomethingFinally, handleError);</pre><p></p>

<p>上記のように書けば、<code>fetchSomething1</code>〜<code>fetchSomething5</code>のどこかでPromiseがrejectされた場合、後続する<code>then</code>に指定されたonFulfilledハンドラは実行されず、<code>handleError</code>が実行されます。</p>

<p><code>then</code>の第二引数は省略可能なため、onFulfilledハンドラだけを指定することが可能ですが、このようにエラー処理だけを個別に書きたい場合、例えば以下のように書くことで、onRejectedハンドラだけを指定することができます。</p>

<p></p><pre class="crayon-plain-tag">fetchSomething1()
  .then(fetchSomething2)
  .then(doSomethingFinally)
  .then(null, handleError); // 第一引数にnull</pre><p></p>

<p>上記のように書いてもよいですが、Promiseは、上記と同様の動作をする<code>catch</code>というメソッドを用意しています。このような場合、<code>catch</code>を使い、以下のように書いたほうが簡潔なコードとなるでしょう。</p>

<p></p><pre class="crayon-plain-tag">fetchSomething1()
  .then(fetchSomething2)
  .then(doSomethingFinally)
  .catch(handleError);</pre><p></p>

<h2>ライブラリやPolyfill</h2>

<p>Promiseは、2015年9月現在、一般的に普及しているブラウザに十分対応されているという状況ではありません（<a href="http://caniuse.com/#search=Promise" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">caniuse &#8211; Promise</a>）。しかし、ブラウザの対応を待ってからでないと利用できないと類の機能ではありません。Promiseオブジェクトと同様の挙動が実現できればよいわけで、既に様々なライブラリ、Polyfillが存在し、広く使われています。ES6のPromiseが使えない環境であっても、これらライブラリを利用すれば、様々なプロジェクトに活用することができるでしょう。</p>

<ul>
<li><a href="https://github.com/petkaantonov/bluebird" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">petkaantonov/bluebird</a></li>
<li><a href="https://github.com/tildeio/rsvp.js/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">tildeio/rsvp.js</a></li>
<li><a href="https://github.com/getify/native-promise-only" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">getify/native-promise-only</a></li>
<li><a href="https://github.com/calvinmetcalf/lie" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">calvinmetcalf/lie</a></li>
<li><a href="https://github.com/kriskowal/q" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">kriskowal/q</a></li>
<li><a href="https://github.com/paulmillr/es6-shim" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">paulmillr/es6-shim</a></li>
</ul>

<h2>最後に</h2>

<p>以上、2回に渡り、Promiseの機能概要を紹介しました。普段からJavaScriptを使って開発をしている者としては、Promiseっていう機能がECMAScriptに追加されたぞ！と言うより、ついに標準仕様となったか…！と感じる人がほとんどなのではないでしょうか。筆者も、<a href="https://api.jquery.com/jquery.deferred/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">jQueryのDeferred</a>や、<a href="https://docs.angularjs.org/api/ng/service/$q" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AngularJSの$q</a>を日常的に使っていたので、Promiseのインターフェイスには馴染みがあります。これからは、これまで以上に当たり前のようにPromiseが使われるようになっていくでしょうから、この機会に正しく仕様を理解しておきたいところです。</p>

<p>Promiseについてより詳しく知りたい場合、以下を参考にすることをおすすめします。</p>

<ul>
<li><a href="http://azu.github.io/promises-book/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JavaScript Promiseの本</a></li>
<li><a href="http://exploringjs.com/es6/ch_promises.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Exploring ES6 &#8211; 25. Promises for asynchronous programming</a></li>
</ul>
]]></content:encoded>
		
		<series:name><![CDATA[ECMAScript 2015（ECMAScript 6）特集]]></series:name>
	</item>
		<item>
		<title>Promiseで簡単！JavaScript非同期処理入門【前編】</title>
		<link>/takazudo/17107/</link>
		<pubDate>Fri, 02 Oct 2015 00:00:35 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">/?p=17107</guid>
		<description><![CDATA[連載： ECMAScript 2015（ECMAScript 6）特集 (4)ECMAScript 2015（ECMAScript 6）で新たに追加されたPromiseについて、その概要を全2回に渡って紹介します。 ひと...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/ecma2015/" class="series-336" title="ECMAScript 2015（ECMAScript 6）特集" data-wpel-link="internal">ECMAScript 2015（ECMAScript 6）特集</a> (4)</div><p>ECMAScript 2015（ECMAScript 6）で新たに追加されたPromiseについて、その概要を全2回に渡って紹介します。</p>

<h2>ひとつずつ処理されるJavaScript</h2>

<p>まず、Promiseについて解説する前に、基礎的なことではありますが、JavaScriptのコードがどのようにJavaScriptエンジンに処理されるかについて、軽く解説しておきましょう。例えば以下の様なコードがあったとします。</p>

<p></p><pre class="crayon-plain-tag">var result1 = 1 + 2; // 3
var result2 = result1 + 100; // 103

/* functionらを準備 */

var doSomething1 = function() {
  document.getElementById('price').value = result2;
};
var doSomething2 = function() {
  alert('計算結果: ' + result2);
};
var doSomething3 = function() {
  console.log('計算結果: ' + result2);
};

/* 実行 */

doSomething1();
doSomething2();
doSomething3();</pre><p></p>

<p>このコードを実行すると、まず、</p>

<p></p><pre class="crayon-plain-tag">var result1 = 1 + 2;</pre><p></p>

<p>が実行され、<code>result</code>には<code>3</code>が入ります。そして次に、</p>

<p></p><pre class="crayon-plain-tag">var result2 = result1 + 100;</pre><p></p>

<p>が実行され、<code>result2</code>には<code>103</code>が入ります。その後、3つのfunctionが準備され、<code>doSomething1()</code>、<code>doSomething2()</code>、<code>doSomething3()</code>と、準備したfunction群が順番に実行されます。JavaScriptは基本的にシングルスレッドであり、一つの処理が完了するまで次の処理が実行されないようになっています。</p>

<p>2行目の<code>result1 + 100</code>が実行できるのも、1行目で<code>result1</code>に<code>1 + 2</code>の結果が入っているからですし、3つのfunctionが実行できるのも、それよりも前に各functionが準備されたからです。そして、各function内で使用されている<code>result2</code>には、2行目で計算された<code>103</code>が入っています。当たり前と言えば当たり前ですが。</p>

<p>また、function <code>doSomething2</code>内には<code>alert</code>があり、実行されると「計算結果: 103」とダイアログが出現します。ここで、ユーザーがそのダイアログを閉じなければ、処理は先に進みません。ほか、非常に複雑な計算をしたりなどし、一つの処理にとても時間がかかる場合などでも、その処理が終わるまでは、次の処理が始まりません。</p>

<h2>非同期な処理</h2>

<p>そんなJavaScriptですが、後から任意の処理をさせる方法がもちろんありますし、普段から利用しているでしょう。その方法の一つとして、イベントの利用が挙げられます。</p>

<p></p><pre class="crayon-plain-tag">document.getElementById('img1').addEventListener('click', function() {
  alert('画像がクリックされました');
}, false);</pre><p></p>

<p>このように、<code>addEventListener</code>を使えば、img要素がクリックされたタイミングで任意の処理を走らせることができます。</p>

<p>ほか、<code>setTimeout</code>のような、処理の実行をスケジュールする組み込み関数を利用すれば、後から任意の処理を実行させることができます。例えば、<code>setTimeout</code>を以下のように使えば、指定したfunctionは5秒後に実行されることになります。</p>

<p></p><pre class="crayon-plain-tag">setTimeout(function() {
  alert('5秒経ったみたいです');
}, 5000);</pre><p></p>

<p>当然、このコードが実行された時、ブラウザが5秒間固まったままになってしまうわけではありません。imgのクリックについても同様、もちろん画像がクリックするまでブラウザが固まってしまうわけではありません。<code>addEventListener</code>や<code>setTimeout</code>は、functionを受け取り、時が来たらそのfunctionを実行するように作られています。渡したfunctionは、即座に実行されるわけではないため、非同期に処理されるといえます。</p>

<h2>コールバック</h2>

<p>JavaScripで書かれたプログラムでは、そのような非同期処理を行いたい場合、functionの受け渡しをを利用して実現されてきました。今例に挙げた<code>addEventListener</code>も<code>setTimeout</code>も、関数を受け取っている点に注目して下さい。このように、なにかしらの処理が完了したら渡したfunctionを実行させるという実装手法は、「コールバック」と呼ばれています。このコールバックを使って非同期処理を書くというスタイル、単純なケースであればシンプルで分かりやすいのですが、問題もあります。</p>

<p>以下は、決められた順番でアクセスしなければならないAPI4つを順に叩き、その結果を使って何か最終的に処理を行ったという想定の例です。この中で使われている<code>doAjaxStuff</code>は、<code>XMLHttpRequest</code>を使ってGETなりPOSTなりのリクエストを送る、いわゆるAjaxを行うfunctionであると想像して下さい。リクエストしたいパラメーターなり、リクエストの成功時、失敗時に実行したいfunctionを受け取れるものとします。</p>

<p></p><pre class="crayon-plain-tag">var fetchSomething1 = function(done) {
  // API1にアクセス
  doAjaxStuff(someOptions, {
    success: function(data) {
      done(); // 成功したら渡されたfunctionを実行
    }
  });
};

// fetchSomething1と同じようにそれぞれ別のAPIにアクセスするfunction群
var fetchSomething2 = function(done) { /* 省略 */ };
var fetchSomething3 = function(done) { /* 省略 */ };
var fetchSomething4 = function(done) { /* 省略 */ };

var doSomethingFinally = function() {
  // APIにアクセスして取得してきたデータを使って何かする
};

/* 順番に実行 */

fetchSomething1(function() {
  fetchSomething2(function() {
    fetchSomething3(function() {
      fetchSomething4(doSomethingFinally); // 全部終わったら doSomethingFinally()
    });
  });
});</pre><p></p>

<p>それぞれの動作はすぐに終わるものではなく、時間がかかるもの。そしてその処理が終わった時に別の処理を行わせるために今のコールバックを利用するとすると、functionの中にfunction、その中にまたfunction&#8230;と、マトリョーシカみたいな入れ子functionを作ることになってしまうことがあります。</p>

<p>コールバックの仕組みを利用する以上、仕方のないことなのですが、複雑な処理の場合、この書き方はなかなかに読みづらいものです。ここにエラー処理を加えた場合、さらにややこしくなります。第二引数にエラー時に実行させたいfunctionを指定できるようにした……というような実装をしたとすると、例えば以下の様な形になるでしょうか。</p>

<p></p><pre class="crayon-plain-tag">fetchSomething1(function() {
  fetchSomething2(function() {
    fetchSomething3(function() {
      fetchSomething4(doSomethingFinally, function() {
        // fetchSomething4のエラー処理
      });
    }, function() {
      // fetchSomething3のエラー処理
    });
  }, function() {
    // fetchSomething2のエラー処理
  });
}, function() {
  // fetchSomething1のエラー処理
});</pre><p></p>

<p>これだとどこにどのエラー処理を書けばいいのか、なかなかに解読が困難です。</p>

<p>ブラウザ上で動作させるJavaScriptの場合、APIにアクセスしたりなどするためにAjaxを利用することが多いでしょう。複雑なWebアプリケーションの場合、いくつものAPIにアクセスし、返ってきたデータ群からDOMを生成し、ページを作ったりするかもしれません。そんな時、このように複雑なコールバックの入れ子になってしまうことは珍しいことではありません。ほか、複数の非同期処理が全て完了したい時に何か処理をさせたいというケースもよくあります。時代の流れとともにとでも言いましょうか、JavaScriptには、非同期処理をより柔軟に行える機能が求められてきたと言ってしまって間違いはないでしょう。</p>

<h2>Promise!</h2>

<p>そんな時代に登場した非同期処理の救世主？が、Promiseです。Promiseを使えば、実行と完了に遅延がある処理をうまい具合に扱うことができます。いろいろと説明するよりも、コードを見ながら理解していきましょう。以下がPromiseを使った非同期処理の例です。この例では、先ほど例として挙げた、APIにアクセスするfunction <code>fetchSomething1</code>を、Promiseを使って書いてみたサンプルを例とします。</p>

<p></p><pre class="crayon-plain-tag">var fetchSomething1 = function() {
  return new Promise(function(resolve, reject) {
    // API1にアクセス
    doAjaxStuff(someOptions, {
      success: function(data) { // 成功した場合
        resolve();
      },
      fail: function() { // 何かしらエラーが発生した場合
        reject({ message: 'APIにアクセスできませんでした' });
      }
    });
  });
};

fetchSomething1().then(function() {
  alert('API1よりデータを取得しました');
}, function(error) {
  alert('API1よりデータを取得できませんでした。エラーメッセージ: ' + error.message);
});</pre><p></p>

<p>function <code>fetchSomething1</code>は、Promiseオブジェクトを作り、返します。</p>

<p>ここで何が起こっているかざっと解説してみます。</p>

<h2>Promiseオブジェクトの状態</h2>

<p>Promiseを理解するためにはまず、Promiseオブジェクトの「状態」について理解することが必要です。</p>

<p>何はともあれ、最初にすることは、Promiseオブジェクトの作成です。Promiseオブジェクトを作るには、コンストラクタである<code>Promise</code>を<code>new</code>すればよいだけです。このPromiseオブジェクトを経由し、処理がうまくいった場合、いかなかった場合の処理を続けて書くことができます。それをどう書くのかは後述するとして、まずはPromiseオブジェクトの状態についてです。</p>

<p>Promiseオブジェクトには状態があります。それは以下の3種類です。</p>

<ul>
<li><code>pending</code>: 未解決</li>
<li><code>fulfilled</code>: 無事完了した</li>
<li><code>rejected</code>: 棄却された</li>
</ul>

<p>最初は<code>pending</code>になっていますが、無事完了すると<code>fulfilled</code>、棄却されると<code>rejected</code>になります。<code>pending</code>からは、<code>fulfilled</code>、<code>rejected</code>のいずれかの状態に変化することができますが、一度状態が変化したら、それ以上状態を変化させることはできません。一方通行です。</p>

<p><img src="/wp-content/uploads/2015/09/states.png" alt="states" width="640" height="354" class="aligncenter size-full wp-image-17111" srcset="/wp-content/uploads/2015/09/states.png 640w, /wp-content/uploads/2015/09/states-300x166.png 300w, /wp-content/uploads/2015/09/states-207x114.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>コンストラクタである<code>Promise</code>には、<code>new</code>する時、functionを引数として渡します。このfunction内にPromiseがラップしたい処理を書きます。</p>

<p>このfunctionには、2つの引数を指定することができます。まずは第一引数として指定している<code>resolve</code>。これは必ず指定する必要があります。この<code>resolve</code>はfunctionで、処理結果が正常だった場合に実行させます。ここでは、APIへのアクセスに成功した時に実行させています。<code>resolve</code>を実行すると、Promiseオブジェクトの状態が<code>fulfilled</code>になります。「無事完了した」ことにするfunctionです。</p>

<p>第二引数である<code>reject</code>もfunctionですが、この<code>reject</code>は<code>resolve</code>とは逆で、処理結果がエラーであった場合に実行させます。ここではAPIへのアクセスが失敗に終わった時に実行させています。<code>reject</code>を実行すると、Promiseオブジェクトの状態が<code>rejected</code>になります。「棄却された」ことにするfunctionです。この第二引数は省略可能です。</p>

<p>このようにして、Promiseコンストラクタに渡したfunction内で、Promsieオブジェクトの状態を<code>pending</code>から<code>fulfilled</code>及び<code>rejected</code>に変化させます。</p>

<p>まとめると、以下のようになります。</p>

<ul>
<li>function <code>fetchSomething1</code>を実行すると、Promiseオブジェクトが返ってくる</li>
<li>APIへのアクセスに成功するとPromiseオブジェクトの状態が<code>pending</code>から<code>fulfilled</code>になる</li>
<li>APIへのアクセスに失敗するとPromiseオブジェクトの状態が<code>pending</code>から<code>rejected</code>になる</li>
</ul>

<p>APIへのアクセス成功可否によりPromiseオブジェクトの状態が変化しますが、このfunction <code>fetchSomething1</code>を実行した側からすれば、ただひとつのPromiseオブジェクトが返ってくるだけです。</p>

<h2>then</h2>

<p>このようにして作ったPromiseオブジェクトのメソッドを呼ぶことで、状態変化が起こった時に実行されるfunctionを登録することができます。それを行うのが<code>then</code>です。以下のように使います。</p>

<p></p><pre class="crayon-plain-tag">fetchSomething1().then(function() {
  alert('API1よりデータを取得しました');
}, function(error) {
  alert('API1よりデータを取得できませんでした。エラーメッセージ: ' + error.message);
});</pre><p></p>

<p><code>then</code>には二つの引数を渡すことができます。第一引数として渡したfunctionは、Promiseオブジェクトの状態が<code>fulfilled</code>になった時、第二引数として渡したfunctionは、Promiseオブジェクトの状態が<code>rejected</code>になった時に実行されます。<code>then</code>の第二引数は省略可能です。</p>

<p>結果として、<code>fetchSomething1</code>のメインの処理が無事完了すれば、「API1よりデータを取得しました」と、棄却されたら、「API1よりデータを取得できませんでした。エラーメッセージ: APIにアクセスできませんでした」とalertが出ます。</p>

<p>この<code>then</code>に渡したfunctionは、<code>resolve</code>及び<code>reject</code>が実行された時に渡された値を受け取ることができます。ここでは、<code>reject</code>時に渡されているオブジェクトを受け取り、エラーメッセージとして利用しています。</p>

<h2>次回に続く</h2>

<p>今回は、JavaScriptにおいて非同期処理を扱う方法と、Promiseのごく基礎的な書き方について紹介しました。今回の内容だけでは、Promiseを使って何が嬉しいのかよく分からないかもしれません。次回は、複数の非同期処理を順次処理する方法、並列に処理する方法、エラーを効率的にハンドリングする方法等を紹介していきます。</p>
]]></content:encoded>
		
		<series:name><![CDATA[ECMAScript 2015（ECMAScript 6）特集]]></series:name>
	</item>
		<item>
		<title>理解しておきたい、CSSによるインラインレイアウトの仕組み（inline-block編）Inline Layout─Frontrend Conference</title>
		<link>/takazudo/14096/</link>
		<pubDate>Mon, 06 Apr 2015 00:00:13 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">/?p=14096</guid>
		<description><![CDATA[連載： Frontrend Conference 特集 (8)この記事は、Frontrend Conferenceのセッション「Inline layout」でお話させていただいた内容を基に、連載記事（全4回）として書き起...]]></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> (8)</div><p>この記事は、Frontrend Conferenceのセッション「Inline layout」でお話させていただいた内容を基に、連載記事（全4回）として書き起こしたものです。今回は第4回目、最終回です。</p>

<h2>背景画像でリストのビュレットを配置した場合の問題</h2>

<p>今回は、前回までの内容を踏まえ、主にインラインブロックについて見ていきます。まずは、以下のようなリストを「HTMLとCSSで作りたい」と思います。この時、リストのビュレットはオリジナルの画像にしたいです。</p>

<p><img src="/wp-content/uploads/2015/03/il-bullet-fail-300x143.png" alt="il-bullet-fail" width="300" height="143" class="aligncenter size-medium wp-image-14097" srcset="/wp-content/uploads/2015/03/il-bullet-fail-300x143.png 300w, /wp-content/uploads/2015/03/il-bullet-fail.png 640w, /wp-content/uploads/2015/03/il-bullet-fail-207x98.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>こんな時、背景画像を利用し、以下のような方法でこの見栄えを再現するという方は多いでしょう。筆者も昔からずっと、この方法で実装してきました。</p>

<p></p><pre class="crayon-plain-tag">&lt;ul&gt;
  &lt;li&gt;彼は背後にひそかな...&lt;/li&gt;
  &lt;li&gt;それはあまり良い意味を...&lt;/li&gt;
  ...
&lt;/ul&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">ul {
  list-style-type: none;
}
li {
  padding: 0 0 10px 16px;
  background: url(bullet.png) no-repeat 0 .45em;
}</pre><p></p>

<p><code>li</code>の左上を起点に、左から<code>0px</code>、上から<code>0.45em</code>の位置に背景画像としてビュレットを配置するという方法です。</p>

<p>何ら問題のなさそうなこの方法ですが、行の高さや、<code>li</code>の上<code>padding</code>が変わってしまうと、ビュレットの位置がずれてしまいます。左上を起点に画像を配置しているため、本連載で解説した、アイコン画像を<code>vertical-align:top</code>で配置した場合と似た形になります。例えば、極端に<code>line-height</code>を高くすれば、以下のようになります。理解しやすさのため、<code>li</code>の上端に赤い線を引いてみました。</p>

<p><img src="/wp-content/uploads/2015/03/il-bullet-fail2-300x239.png" alt="il-bullet-fail2" width="300" height="239" class="aligncenter size-medium wp-image-14098" srcset="/wp-content/uploads/2015/03/il-bullet-fail2-300x239.png 300w, /wp-content/uploads/2015/03/il-bullet-fail2.png 640w, /wp-content/uploads/2015/03/il-bullet-fail2-207x165.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>こんなに大きく<code>line-height</code>が変わってしまうことは稀でしょうが、あとからサイト全体のベースとなる<code>font-size</code>、<code>line-height</code>を調節したりした場合、この実装を行った箇所のビュレットは、ほんのわずか上下にずれてしまうかもしれません。そのたびに微調節するのはかなり手間です。</p>

<p>IE6、7でも問題なく利用できるというのは。この実装方法の大きなメリットです。それゆえ、昔から多く使われてきました。</p>

<h2>インラインブロックを利用してアイコンを表現する</h2>

<p>インラインブロックを利用して、この問題を解決した実装例を紹介しましょう。</p>

<p>前回紹介した実装例では、<code>img</code>を<code>vertical-align</code>で<code>middle</code>に配置し、上下にネガティブマージンを指定することで、ビュレットとして利用していました。以下のサンプルでは、それと同じことを<code>before</code>擬似要素で実現しています。</p>

<p><img src="/wp-content/uploads/2015/03/il-bullet-fail3-300x223.png" alt="il-bullet-fail3" width="300" height="223" class="aligncenter size-medium wp-image-14099" srcset="/wp-content/uploads/2015/03/il-bullet-fail3-300x223.png 300w, /wp-content/uploads/2015/03/il-bullet-fail3.png 640w, /wp-content/uploads/2015/03/il-bullet-fail3-207x154.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p></p><pre class="crayon-plain-tag">&lt;ul&gt;
  &lt;li&gt;彼は背後にひそかな...&lt;/li&gt;
  &lt;li&gt;それはあまり良い意味を...&lt;/li&gt;
  ...
&lt;/ul&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">ul {
  list-style-type: none;
}
li {
  padding: 0 0 10px 16px;
  text-indent: -16px;
}
li:before {
  content: '';
  display: inline-block;
  background: url(bullet.png) no-repeat 0 0;
  width: 8px;
  height: 8px;
  vertical-align: middle;
  margin: -5px 8px -3px 0;
}</pre><p></p>

<p><code>:before</code>を利用し、<code>li</code>のはじめに<code>display</code>が<code>inline-block</code>である擬似要素を配置します。</p>

<p><code>display</code>に<code>inline-block</code>が指定された要素（これを以降インラインブロックと呼ぶことにします）は、中にブロックレベルの要素を入れることができるコンテナとなります。この場合は中に何も入れないため、それについては特に気にする必要がありません。</p>

<p>このインラインブロック、<code>display:inline</code>が指定されたインライン要素とは異なり、幅と高さを持ち、行をまたがないという特徴を持ちます。その名の通り、文中に入るブロック要素のような存在です。この場合のレイアウト方法は、文中にimg要素を入れた場合……つまり、インラインの置換要素とほぼ同じです。</p>

<p>この例は、img要素としてビュレットを入れたいが、HTMLをシンプルにしたいゆえ、それを擬似要素で代替しているという具合に考えると分かりやすいかもしれません。ここでポイントとなるのは、この擬似要素が<code>vertical-align:middle</code>で配置されているということです。この状態で<code>line-height</code>の値を上げ、行間を広げると以下のようになります。わかりやすさのため、middleのラインに赤い線を引いています。</p>

<p><img src="/wp-content/uploads/2015/03/il-bullet-fail3-300x223.png" alt="il-bullet-fail3" width="300" height="223" class="aligncenter size-medium wp-image-14099" srcset="/wp-content/uploads/2015/03/il-bullet-fail3-300x223.png 300w, /wp-content/uploads/2015/03/il-bullet-fail3.png 640w, /wp-content/uploads/2015/03/il-bullet-fail3-207x154.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>middleのラインにimg要素が揃えられるため、行の高さに影響されず、ほぼ中央配置が維持されます。</p>

<p>このように、img要素の代わりとしてインラインブロックを利用すれば、HTMLをシンプルに保ったまま、<code>vertical-align</code>の柔軟さを利用することができます。</p>

<h2>チェックボックスやラジオボタンの配置</h2>

<p>本連載の初めに挙げた疑問として、チェックボックスやラジオボタンをうまく配置するにはどうすればよいのか？という点がありました。</p>

<p>そもそも、チェックボックスやラジオボタンを置いた場合、ブラウザはそれらをどのように描画するのでしょうか。HTMLやCSSの仕様書の中から、そのことについて書かれている箇所を探していたのですが、どうもそれらの実装について明確な取り決めはまだあるわけではなく、ブラウザに内容をよしなに描画するよう任せられているというのが現状のようです。現状の実装においては、たいていOSが持っているコンポーネントがそこに配置されるようになっています。</p>

<p>つまるところ、これらは内容の不明確な置換要素であり、その高さや幅はブラウザによって異なると、とらえるしかなさそうです。そうなると、幅がわからないわけですから、今まで<code>text-indent</code>と<code>margin</code>を利用したビュレットやアイコンの配置方法をそのまま使うだけでは、うまくいきません。</p>

<p>そこで、インラインブロックにしたspan要素でラジオボタンやチェックボックスを囲み、その幅を固定するというアプローチをとったのが、以下の例です。</p>

<p><img src="/wp-content/uploads/2015/03/il-checks-300x69.png" alt="il-checks" width="300" height="69" class="aligncenter size-medium wp-image-14100" srcset="/wp-content/uploads/2015/03/il-checks-300x69.png 300w, /wp-content/uploads/2015/03/il-checks.png 640w, /wp-content/uploads/2015/03/il-checks-207x48.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p></p><pre class="crayon-plain-tag">&lt;ul&gt;
  &lt;li&gt;&lt;label&gt;&lt;span&gt;&lt;/span&gt;彼は...&lt;/label&gt;&lt;/li&gt;
  &lt;li&gt;&lt;label&gt;&lt;span&gt;&lt;/span&gt;それは...&lt;/label&gt;&lt;/li&gt;
&lt;/ul&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">ul {
  list-style-type: none;
}
li {
  padding: 0 0 10px 25px;
  text-indent: -25px;
}
span {
  display: inline-block;
  width: 20px;
  margin: -17px 5px -13px 0;
  vertical-align: middle;
}
input {
  display: block;
  margin: 0 auto;
}</pre><p></p>

<p>ここでは先ほどスルーした、インラインブロックの「中にブロックレベルの要素を入れることができる」という特徴を利用しています。あとはこれまでの実装と同様、<code>text-indent</code>で左に飛び出させ、その部分に頭に置きたい要素を置くという方法を利用しています。チェックボックスやラジオボタン（以降、input要素）の幅は不定ですが、それを囲むspan要素の幅が<code>20px</code>で固定されているため、input要素の幅を気にしなくても良いようになっています。</p>

<p>また、高さについてですが、インラインブロックの高さが特別指定されていない場合、内容により自動的に高さが決定されます。この場合は、input要素の高さがそのまま、span要素の高さとなります。そして、このspan要素は、<code>vertical-align:middle</code>で行中に配置されます。この場合、span要素の中央のラインが行のmiddleラインと揃えられるため、input要素の高さを気にすること無く、行のほぼ中央に揃えられます。</p>

<p>なかなかややこしいですが、インラインブロックの特徴を利用すれば、このように細かなレイアウトも柔軟に表現することができます。</p>

<h2>インラインブロックを利用したカラムレイアウト</h2>

<p>このように便利なインラインブロックですが、普段<code>float</code>なりで実現されるようなカラムレイアウトにも利用することができます。まず、この単純な例を見て下さい。</p>

<p><img src="/wp-content/uploads/2015/03/il-col-300x37.png" alt="il-col" width="300" height="37" class="aligncenter size-medium wp-image-14101" srcset="/wp-content/uploads/2015/03/il-col-300x37.png 300w, /wp-content/uploads/2015/03/il-col-207x25.png 207w, /wp-content/uploads/2015/03/il-col.png 484w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p></p><pre class="crayon-plain-tag">&lt;div&gt;Hello! Hello! Hello!&lt;/div&gt;</pre><p></p>

<p>ただ1行のテキストがあるだけです。<br />
ここに、インラインブロックを一つ突っ込んでみます。</p>

<p><img src="/wp-content/uploads/2015/03/il-col2-300x134.png" alt="il-col2" width="300" height="134" class="aligncenter size-medium wp-image-14102" srcset="/wp-content/uploads/2015/03/il-col2-300x134.png 300w, /wp-content/uploads/2015/03/il-col2-207x92.png 207w, /wp-content/uploads/2015/03/il-col2.png 484w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p></p><pre class="crayon-plain-tag">&lt;div&gt;
  Hello! 
  &lt;div class=&quot;box&quot;&gt;...&lt;/div&gt;
  Hello!
&lt;/div&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">.box {
  display: inline-block;
  vertical-align: middle;
}</pre><p></p>

<p>インラインブロックは外からはimg要素のようにレイアウトされ、その中にはブロックレベルの要素を入れられるのでした。なので、上記のようにレイアウトされます。</p>

<p>ではここで、テキストを全て取り払ってしまい、インラインブロックだけにしてしまったら……以下のようになります。</p>

<p><img src="/wp-content/uploads/2015/03/il-col3-300x92.png" alt="il-col3" width="300" height="92" class="aligncenter size-medium wp-image-14103" srcset="/wp-content/uploads/2015/03/il-col3-300x92.png 300w, /wp-content/uploads/2015/03/il-col3.png 640w, /wp-content/uploads/2015/03/il-col3-207x64.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p></p><pre class="crayon-plain-tag">&lt;div&gt;
  &lt;div class=&quot;box&quot;&gt;...&lt;/div&gt;
  &lt;div class=&quot;box&quot;&gt;...&lt;/div&gt;
  &lt;div class=&quot;box&quot;&gt;...&lt;/div&gt;
&lt;/div&gt;</pre><p></p>

<p>これで、インラインブロックを利用したカラムレイアウトの出来上がりです。上図で緑で塗りつぶしている部分は、行を表しています。インラインブロックの中にはブロックレベルの要素を入れることができるため、これが行なのかと言われるとなんとも不思議な感じです。普段は行の中にはテキストが入っていますが、その代わりにインラインブロックだけを詰めてしまえば、それでカラムレイアウトが実現できるというぐらいです。内容が増えれば行が増え、複数段の段組が実現されます。</p>

<p><img src="/wp-content/uploads/2015/03/il-col4.png" alt="il-col4" width="640" height="228" class="alignnone size-full wp-image-14104" srcset="/wp-content/uploads/2015/03/il-col4.png 640w, /wp-content/uploads/2015/03/il-col4-300x107.png 300w, /wp-content/uploads/2015/03/il-col4-207x74.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このように、インラインブロックを利用して、カラムレイアウトを行うこともできます。</p>

<h2>floatを利用したカラムレイアウトの問題点</h2>

<p>このインラインブロックで行われるようなレイアウトは、旧ブラウザまで対応するとなると、<code>float</code>を利用して実現することが多いはずです。例えば以下の様な「レイアウトを実現したい」とします。</p>

<p><img src="/wp-content/uploads/2015/03/il-float-300x295.png" alt="il-float" width="300" height="295" class="aligncenter size-medium wp-image-14105" srcset="/wp-content/uploads/2015/03/il-float-300x295.png 300w, /wp-content/uploads/2015/03/il-float.png 640w, /wp-content/uploads/2015/03/il-float-207x204.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>こんな時、例えば以下の様なコードになりそうです。</p>

<p></p><pre class="crayon-plain-tag">&lt;div class=&quot;items&quot;&gt;
  &lt;div class=&quot;item&quot;&gt;...&lt;/div&gt;
  &lt;div class=&quot;item&quot;&gt;...&lt;/div&gt;
  &lt;div class=&quot;item&quot;&gt;...&lt;/div&gt;
  &lt;div class=&quot;item&quot;&gt;...&lt;/div&gt;
  ...
&lt;/div&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">.item {
  float: left;
  width: 25%;
}</pre><p></p>

<p>一見問題なさそうですが、悲しいことに、この描画結果は以下のようになってしまいます。</p>

<p><img src="/wp-content/uploads/2015/03/il-float2-300x270.png" alt="il-float2" width="300" height="270" class="aligncenter size-medium wp-image-14106" srcset="/wp-content/uploads/2015/03/il-float2-300x270.png 300w, /wp-content/uploads/2015/03/il-float2.png 640w, /wp-content/uploads/2015/03/il-float2-207x186.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>細かい話は割愛しますが、このように<code>float:left</code>された要素が連続すると、左上から詰めて配置されるようなレイアウトが行われるため、上記のような描画結果になってしまいます。</p>

<p><img src="/wp-content/uploads/2015/03/il-float3-300x270.png" alt="il-float3" width="300" height="270" class="aligncenter size-medium wp-image-14107" srcset="/wp-content/uploads/2015/03/il-float3-300x270.png 300w, /wp-content/uploads/2015/03/il-float3.png 640w, /wp-content/uploads/2015/03/il-float3-207x186.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>これは望んだ結果とは異なります。これを解決するには、この場合、例えば4つごとに<code>cler:left</code>を指定したり、4つごとを別のdiv要素で囲み、clearfix的な指定を行うなどという方法が必要とされます。</p>

<h2>インラインブロックを利用した解決方法</h2>

<p>こんなとき、インラインブロックを利用すると、シンプルなHTMLで同様のことを実現できます。以下がその例です。</p>

<p></p><pre class="crayon-plain-tag">&lt;div class=&quot;items&quot;&gt;&lt;!--
  --&gt;&lt;div class=&quot;item&quot;&gt;...&lt;/div&gt;&lt;!--
  --&gt;&lt;div class=&quot;item&quot;&gt;...&lt;/div&gt;&lt;!--
  --&gt;&lt;div class=&quot;item&quot;&gt;...&lt;/div&gt;&lt;!--
  --&gt;&lt;div class=&quot;item&quot;&gt;...&lt;/div&gt;&lt;!--
  ...
--&gt;&lt;/div&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">.item {
  display: inline-block;
  vertical-align: top;
  width: 25%;
}</pre><p></p>

<p>これで、望んでいたレイアウトは実現されます。4つごとに何かする必要もありません。先ほどのインラインブロックを利用したカラムレイアウトの例に習えば、ここでは、以下のように、3つの行ボックスがあり、その中にインラインブロックが積まれていると考えられます。</p>

<p><img src="/wp-content/uploads/2015/03/il-floatReplace-300x300.png" alt="il-floatReplace" width="300" height="300" class="aligncenter size-medium wp-image-14108" srcset="/wp-content/uploads/2015/03/il-floatReplace-300x300.png 300w, /wp-content/uploads/2015/03/il-floatReplace-150x150.png 150w, /wp-content/uploads/2015/03/il-floatReplace.png 640w, /wp-content/uploads/2015/03/il-floatReplace-207x207.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>そして、これらインラインブロックは、<code>vertical-align:top</code>で配置されているため、上端で揃えられています。</p>

<p>見た目上はこれが行などとは全く思えませんが、このように行のレイアウトを利用すると、柔軟なカラムレイアウトも実現することができます。現状、これと同じようなことをしたかったら、Flexboxを利用する必要があるように思います。</p>

<p>ちなみに、この例でdiv要素間に入れている変なコメントは、改行やタブを殺すためのものです。改行やタブが存在しているとホワイトスペースがそこにあることになり、そのぶん、領域が確保されてしまいます。このカラムレイアウトの方法自体は、本来行の中で行われる細かな部分のレイアウトを行うための仕組みを利用したものであり、仕様的には正しいものの、トリッキーな応用であるという点を忘れてはいけないでしょう。</p>

<h2>まとめ</h2>

<p>以上、全4回に渡り、行の中で行われる種々のレイアウト方法について解説してきました。筆者自身、普段何気なく使っていたプロパティでしたが、改めて突っ込んで調べてみたところ、以前よりも意図通りに正確にレイアウトが行えるようになったように感じています。ミクロなレイアウト制御からマクロなレイアウト制御まで、色々と応用の効く知識であると思いますので、CSSの書き方に悩んだらこの連載で取り上げた内容を思い出してみると、応用できる場合もあるかもしれません。</p>

<h2>CodeGridについて</h2>

<p>この連載の内容は、弊社、株式会社PixelGridが運営するフロントエンドの技術情報を配信するサービス、<a href="http://www.codegrid.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CodeGrid</a>にて連載された内容を元にしています。ご興味があれば、こちらもチェックしていただけると幸いです。</p>

<h2>イベント動画</h2>

<p>イベントの模様はYoutubeで公開されています。よろしければ、ご覧ください。</p>

<div class="aligncenter">
<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/tDJR9KoIsZA" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>
</div>
]]></content:encoded>
		
		<series:name><![CDATA[Frontrend Conference 特集]]></series:name>
	</item>
		<item>
		<title>理解しておきたい、CSSによるインラインレイアウトの仕組み（vertical-align編その2）Inline Layout─Frontrend Conference</title>
		<link>/takazudo/13592/</link>
		<pubDate>Wed, 18 Mar 2015 00:00:20 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">/?p=13592</guid>
		<description><![CDATA[連載： Frontrend Conference 特集 (7)この記事は、Frontrend Conferenceのセッション「Inline layout」でお話させていただいた内容を基に、連載記事（全4回）として書き起...]]></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> (7)</div><p>この記事は、Frontrend Conferenceのセッション「Inline layout」でお話させていただいた内容を基に、連載記事（全4回）として書き起こしたものです。今回は第3回目です。</p>

<h2>vertical-alignごとのアイコンの揃え位置</h2>

<p><a href="https://html5experts.jp/takazudo/13464/" target="_blank" data-wpel-link="internal">前回</a>に引き続き、<code>vertical-align</code>の利用方法について解説していきます。今回はまず、文頭に置いたアイコン画像を、<code>vertical-align</code>を用いて位置調節する方法から見ていきます。</p>

<p>以下の様なHTMLがあったとします。</p>

<p></p><pre class="crayon-plain-tag">&lt;ul&gt;
  &lt;li&gt;&lt;img&gt; xAhy 鈴&lt;/li&gt;
  &lt;li&gt;&lt;img&gt; xAhy 鈴&lt;/li&gt;
  &lt;li&gt;&lt;img&gt; xAhy 鈴&lt;/li&gt;
  ...
&lt;/ul&gt;</pre><p></p>

<p>ここで配置されているimg要素は、文頭にあるアイコンのようなものを想定して下さい。このようにアイコンを配置する時、そのままだとなんだかアイコンの位置がイマイチうまい位置に配置されないことがあります。そんな時にどうすればよいか。それはこのimg要素の<code>vertical-align</code>を調節すればいいのですが、これをどう調節すればよいかは悩みどころですね。</p>

<p>先に答えを言ってしまうと、筆者的には<code>vertical-align: middle</code>を指定するのが一番無難であるように思いました。前回までの内容を踏まえ、このアイコン画像の<code>vertical-align</code>値を変えてみるとどうなるのか、見てみます。</p>

<h2>vertical-align: top</h2>

<p>まずは<code>top</code>です。文頭に置いたアイコンのサイズをいろいろと変えてみました。このとき、<code>img</code>に<code>vertical-align: top</code>を指定すると、以下の様な表示になります。（わかりやすさのために<code>li</code>には背景色をつけてあります）</p>

<p></p><pre class="crayon-plain-tag">img {
  vertical-align: top;
}</pre><p></p>

<p><img src="/wp-content/uploads/2015/03/icon-top.png" alt="icon-top" width="640" height="468" class="alignnone size-full wp-image-13609" srcset="/wp-content/uploads/2015/03/icon-top.png 640w, /wp-content/uploads/2015/03/icon-top-300x219.png 300w, /wp-content/uploads/2015/03/icon-top-207x151.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>top</code>が指定された場合、行の上端に画像の上端が合わせられます。</p>

<p><img src="/wp-content/uploads/2015/03/exp-top.png" alt="exp-top" width="640" height="203" class="alignnone size-full wp-image-13600" srcset="/wp-content/uploads/2015/03/exp-top.png 640w, /wp-content/uploads/2015/03/exp-top-300x95.png 300w, /wp-content/uploads/2015/03/exp-top-207x66.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>この場合ですと、画像の高さが行の高さと同じぐらいでないと、ちょうどよい位置に配置するのは難しそうです。アイコンのデザイン基準位置が上端であったならばアリかもしれませんが、そういったことは稀でしょう。今回のような用途で<code>top</code>を指定することは、ほとんどなさそうです。</p>

<h2>vertical-align: bottom</h2>

<p>次は<code>bottom</code>の場合です。</p>

<p></p><pre class="crayon-plain-tag">img {
  vertical-align: bottom;
}</pre><p></p>

<p><img src="/wp-content/uploads/2015/03/icon-bottom.png" alt="icon-bottom" width="640" height="468" class="alignnone size-full wp-image-13604" srcset="/wp-content/uploads/2015/03/icon-bottom.png 640w, /wp-content/uploads/2015/03/icon-bottom-300x219.png 300w, /wp-content/uploads/2015/03/icon-bottom-207x151.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>bottom</code>が指定された場合、行の下端に画像の下端が合わせられます。</p>

<p><img src="/wp-content/uploads/2015/03/exp-bottom.png" alt="exp-bottom" width="640" height="203" class="alignnone size-full wp-image-13594" srcset="/wp-content/uploads/2015/03/exp-bottom.png 640w, /wp-content/uploads/2015/03/exp-bottom-300x95.png 300w, /wp-content/uploads/2015/03/exp-bottom-207x66.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>この場合も<code>top</code>と同様に、画像の高さが行の高さと同じぐらいでないと、利用価値はなさそうです。ただ、アイコン画像が、文字の高さよりも少し大きいぐらいでばらつきがあり、なおかつ画像の下端を基準としたようなアイコンであれば、<code>bottom</code>を指定するのはアリかもしれません。</p>

<h2>vertical-align: text-top</h2>

<p>次は<code>text-top</code>の場合です。</p>

<p></p><pre class="crayon-plain-tag">img {
  vertical-align: text-top;
}</pre><p></p>

<p><img src="/wp-content/uploads/2015/03/icon-text-top.png" alt="icon-text-top" width="640" height="490" class="alignnone size-full wp-image-13608" srcset="/wp-content/uploads/2015/03/icon-text-top.png 640w, /wp-content/uploads/2015/03/icon-text-top-300x230.png 300w, /wp-content/uploads/2015/03/icon-text-top-207x158.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>text-top</code>が指定された場合、inline boxの上端に画像の上端が合わせられます。</p>

<p><img src="/wp-content/uploads/2015/03/exp-text-top.png" alt="exp-text-top" width="640" height="218" class="alignnone size-full wp-image-13599" srcset="/wp-content/uploads/2015/03/exp-text-top.png 640w, /wp-content/uploads/2015/03/exp-text-top-300x102.png 300w, /wp-content/uploads/2015/03/exp-text-top-207x71.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>この場合は、アイコンの高さが文字の高さぐらいであれば、ちょうど真ん中に揃えられそうです。しかし、アイコンが大きい場合は、アイコンが下に飛び出るように配置されるため、おかしな配置となってしまいそうです。アイコンを配置する用途として利用する機会は少なそうに思います。</p>

<h2>vertical-align: text-bottom</h2>

<p>次は<code>text-bottom</code>の場合です。</p>

<p></p><pre class="crayon-plain-tag">img {
  vertical-align: text-bottom;
}</pre><p></p>

<p><img src="/wp-content/uploads/2015/03/icon-text-bottom.png" alt="icon-text-bottom" width="640" height="493" class="alignnone size-full wp-image-13607" srcset="/wp-content/uploads/2015/03/icon-text-bottom.png 640w, /wp-content/uploads/2015/03/icon-text-bottom-300x231.png 300w, /wp-content/uploads/2015/03/icon-text-bottom-207x159.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>text-bottom</code>が指定された場合、inline boxの下端に画像の下端が合わせられます。</p>

<p><img src="/wp-content/uploads/2015/03/exp-text-bottom.png" alt="exp-text-bottom" width="640" height="218" class="alignnone size-full wp-image-13598" srcset="/wp-content/uploads/2015/03/exp-text-bottom.png 640w, /wp-content/uploads/2015/03/exp-text-bottom-300x102.png 300w, /wp-content/uploads/2015/03/exp-text-bottom-207x71.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>text-top</code>と同様、アイコンの高さが文字の高さぐらいの場合にはちょうどよいですが、アイコンが大きい場合は、アイコンが上に飛び出ます。アイコンの高さにばらつきがあり、その高さが文字の高さを超えないぐらいなのであれば、ちょうどよい位置に配置することができそうです。</p>

<h2>vertical-align: baseline</h2>

<p></p><pre class="crayon-plain-tag">img {
  vertical-align: baseline;
}</pre><p></p>

<p>次は<code>baseline</code>の場合です。<code>vertical-align</code>の初期値は<code>baseline</code>ですので、特に何も指定しなければこの方法でレイアウトされます。</p>

<p><img src="/wp-content/uploads/2015/03/icon-baseline.png" alt="icon-baseline" width="640" height="509" class="alignnone size-full wp-image-13603" srcset="/wp-content/uploads/2015/03/icon-baseline.png 640w, /wp-content/uploads/2015/03/icon-baseline-300x239.png 300w, /wp-content/uploads/2015/03/icon-baseline-207x165.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>baseline</code>が指定された場合、baselineに画像の下端が合わせられます。</p>

<p><img src="/wp-content/uploads/2015/03/exp-baseline.png" alt="exp-baseline" width="640" height="235" class="alignnone size-full wp-image-13593" srcset="/wp-content/uploads/2015/03/exp-baseline.png 640w, /wp-content/uploads/2015/03/exp-baseline-300x110.png 300w, /wp-content/uploads/2015/03/exp-baseline-207x76.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>この指定が有効なのは、画像の高さが、x-heightの高さ〜文字の高さの範囲である場合でしょう。それよりも大きな画像の場合は、アイコンが上側に飛び出ているように見えてしまいます。このため、特に何もCSSで調節しないままアイコンを置いたら、どうも上めに配置されてしまうな〜と感じる方は多いのではないでしょうか。</p>

<h2>vertical-align: &lt;length&gt;</h2>

<p>次は<code>length</code>の場合です。<code>3px</code>とか<code>0.3em</code>等が指定された場合です。ここでは、<code>4px</code>を指定しました。</p>

<p></p><pre class="crayon-plain-tag">img {
  vertical-align: 4px;
}</pre><p></p>

<p><img src="/wp-content/uploads/2015/03/icon-length.png" alt="icon-length" width="640" height="490" class="alignnone size-full wp-image-13605" srcset="/wp-content/uploads/2015/03/icon-length.png 640w, /wp-content/uploads/2015/03/icon-length-300x230.png 300w, /wp-content/uploads/2015/03/icon-length-207x158.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>length</code>が指定された場合、baselineから、<code>length</code>分、上方向にずれた位置に画像の下端が揃えられます。</p>

<p><img src="/wp-content/uploads/2015/03/exp-length.png" alt="exp-length" width="640" height="267" class="alignnone size-full wp-image-13595" srcset="/wp-content/uploads/2015/03/exp-length.png 640w, /wp-content/uploads/2015/03/exp-length-300x125.png 300w, /wp-content/uploads/2015/03/exp-length-207x86.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>上記レンダリング結果を見てわかる通り、baselineよりも上にずれてしまっては、かなり小さいアイコンを使う場合にしか、利用価値はなさそうに思えます。ただ、例えば<code>-3px</code>や<code>-0.2em</code>のように、マイナスの値を指定した場合、baselineよりもその分だけ下にずれた位置に画像の下端が揃えられます。</p>

<p><img src="/wp-content/uploads/2015/03/exp-length2.png" alt="exp-length2" width="640" height="203" class="alignnone size-full wp-image-13596" srcset="/wp-content/uploads/2015/03/exp-length2.png 640w, /wp-content/uploads/2015/03/exp-length2-300x95.png 300w, /wp-content/uploads/2015/03/exp-length2-207x66.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>これを利用すれば、アイコンの下端位置を微調節できるため、アイコンの高さにある程度のバリエーションがあっても、うまく位置調節に利用できそうです。筆者はこの方法でこういったアイコン画像をよく調節していました。恥ずかしながら、なんとなく指定したぶんズレるぐらいにしか理解していませんでしたが……。</p>

<h2>vertical-align: middle</h2>

<p>次は<code>middle</code>の場合です。</p>

<p></p><pre class="crayon-plain-tag">img {
  vertical-align: middle;
}</pre><p></p>

<p><img src="/wp-content/uploads/2015/03/icon-middle.png" alt="icon-middle" width="640" height="468" class="alignnone size-full wp-image-13606" srcset="/wp-content/uploads/2015/03/icon-middle.png 640w, /wp-content/uploads/2015/03/icon-middle-300x219.png 300w, /wp-content/uploads/2015/03/icon-middle-207x151.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>middle</code>が指定された場合、baselineよりもx-heightの高さの半分だけ上の位置に、画像の中央位置が揃えられます。</p>

<p><img src="/wp-content/uploads/2015/03/exp-middle.png" alt="exp-middle" width="640" height="175" class="alignnone size-full wp-image-13597" srcset="/wp-content/uploads/2015/03/exp-middle.png 640w, /wp-content/uploads/2015/03/exp-middle-300x82.png 300w, /wp-content/uploads/2015/03/exp-middle-207x57.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ここまでで紹介してきたほかプロパティと異なり、画像の「中央」の位置が揃えられるというのが、<code>middle</code>の便利なポイントかと思います。ここまでで紹介してきた他の値では、画像の上端か下端がいずこかに揃えられます。中央で揃えてくれるのは<code>middle</code>だけです。ちなみに、<code>central</code>という、行の中央に画像の中央が揃えられる指定もありますが、ブラウザのサポートはまだまだのようです。</p>

<h2>微調整を加えた例</h2>

<p>ほとんどの場合、<code>middle</code>指定すれば、だいたいよい感じに中央に揃ってくれるのではないでしょうか。ただし、アイコンの高さによっては、やや下寄りにアイコンが寄っているように見えてしまうかもしれません。</p>

<p>例えば、アイコンの高さがちょうど文字の大きさぐらいで、アイコンに続くテキストが日本語である場合、そのように見えてしまう可能性が高いと私は感じます。これは、日本語の文字というものは、アルファベットと比較した場合、文字の上方まで密度が高く作られていることが多いためです。第1回で軽く触れましたが、日本語の文字のbaselineは、アルファベットのbaselineよりも少し下にあります。</p>

<p><img src="/wp-content/uploads/2015/03/jap.png" alt="jap" width="640" height="196" class="alignnone size-full wp-image-13611" srcset="/wp-content/uploads/2015/03/jap.png 640w, /wp-content/uploads/2015/03/jap-300x92.png 300w, /wp-content/uploads/2015/03/jap-207x63.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>そして、ほとんどの文字は、このbaselineよりも下方のスペースを利用しません。平仮名や漢字の書体を思い浮かべてみてください。<code>g</code>とか<code>j</code>とかいったように、下に伸びる文字は、日本語の中にはあまりなさそうです。それゆえ、日本語の文字というのは、アルファベットの文字と比較すると、行のやや上寄りに寄っているように見えるのではないでしょうか。</p>

<p>これを微調節すれば丁度真ん中ぐらいに見えるのでは？というのが、以下の様な微調整のアプローチです。</p>

<p></p><pre class="crayon-plain-tag">img {
  vertical-align: middle;
  position: relative;
  top: -0.1em;
}</pre><p></p>

<p>このようにすると、以下のように、<code>middle</code>で揃えた位置から若干上寄りにアイコンが配置されます。（左が<code>middle</code>、右が微調整したもの）</p>

<p><img src="/wp-content/uploads/2015/03/icon-adjust2.png" alt="icon-adjust2" width="640" height="176" class="alignnone size-full wp-image-13602" srcset="/wp-content/uploads/2015/03/icon-adjust2.png 640w, /wp-content/uploads/2015/03/icon-adjust2-300x83.png 300w, /wp-content/uploads/2015/03/icon-adjust2-207x57.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>レンダリング結果は、以下の様な形になります。</p>

<p><img src="/wp-content/uploads/2015/03/icon-adjust.png" alt="icon-adjust" width="640" height="468" class="alignnone size-full wp-image-13601" srcset="/wp-content/uploads/2015/03/icon-adjust.png 640w, /wp-content/uploads/2015/03/icon-adjust-300x219.png 300w, /wp-content/uploads/2015/03/icon-adjust-207x151.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>本当にちょっとだけ上に寄っているだけですけれども……。img要素の上下の<code>margin</code>を微調節したり、このように相対配置をし、上めにずらすと、日本語と並べた時に自然になるように筆者は思います。</p>

<h2>アイコンをリストのビュレットとして使う</h2>

<p>ここまででアイコンの位置を調節するため、img要素の<code>vertical-align</code>をいろいろといじってみてきました。ですが、このままではリストのビュレットのようには利用できません。以下のように、2行以上になれば、2行目以降は当然アイコンの左端からテキストが始まってしまいますし、アイコンのサイズが大きくなれば、その行の高さはそれに合わせ、大きくなってしまいます。</p>

<p><img src="/wp-content/uploads/2015/03/moreTweak.png" alt="moreTweak" width="640" height="547" class="alignnone size-full wp-image-13613" srcset="/wp-content/uploads/2015/03/moreTweak.png 640w, /wp-content/uploads/2015/03/moreTweak-300x256.png 300w, /wp-content/uploads/2015/03/moreTweak-207x177.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>これを解決する実装例を一つ紹介します。以下です。</p>

<p><img src="/wp-content/uploads/2015/03/listbullet.png" alt="listbullet" width="640" height="313" class="alignnone size-full wp-image-13612" srcset="/wp-content/uploads/2015/03/listbullet.png 640w, /wp-content/uploads/2015/03/listbullet-300x147.png 300w, /wp-content/uploads/2015/03/listbullet-207x101.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p></p><pre class="crayon-plain-tag">&lt;ul&gt;
  &lt;li&gt;&lt;img&gt;彼は背後に...&lt;/li&gt;
  &lt;li&gt;&lt;img&gt;それはあまり...&lt;/li&gt;
  &lt;li&gt;&lt;img&gt;彼は背後に...&lt;/li&gt;
&lt;/ul&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">ul {
  list-style-type: none;
}
li {
  padding: 0 0 10px 32px;
  text-indent: -32px;
}
img {
  width: 24px;
  height: 24px;
  margin: -14px 8px -10px 0;
  vertical-align: middle;
}</pre><p></p>

<p>リストマーカーだけを左に飛び出させているのが<code>li</code>に指定した左<code>padding</code>と、<code>text-indent</code>です。ここでは<code>li</code>の左側に<code>32px</code>の<code>padding</code>が指定されています。これでは左に余白ができてしまうだけですが、ここで<code>text-indent: -32px</code>を指定します。すると何が起こるかというと、<code>li</code>の1行目だけ、文字が本来の開始位置よりも<code>32px</code>左にずれた箇所から開始されます。つまるところ、1行目だけは、左に<code>padding</code>が指定されていないかのように配置され、2行目以降では、左に<code>32px</code>の<code>padding</code>が指定された状態になります。</p>

<p>このように1行目だけ左にめり込んでいるような状態で、liの始めにimg要素を置きます。このimg要素の幅は<code>24px</code>で、右に<code>8px</code>の<code>margin</code>が取られています。つまり、これらを合計した<code>32px</code>のスペースは、画像とその右マージンが占めることになります。これに続けてテキストが配置されるため、結果として、アイコン画像が左に飛び出しているような結果を得ることができます。</p>

<p><img src="/wp-content/uploads/2015/03/indent.png" alt="indent" width="640" height="308" class="alignnone size-full wp-image-13610" srcset="/wp-content/uploads/2015/03/indent.png 640w, /wp-content/uploads/2015/03/indent-300x144.png 300w, /wp-content/uploads/2015/03/indent-207x100.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>もう一つの問題、「img要素の高さが大きい場合に行の高さが広くなってしまう」については、img要素の上下のネガティブマージン（上<code>-14px</code>、下<code>-10px</code>）で解決しています。このようにマージンを指定すると、画像の上端が上に<code>14px</code>、下端が下に<code>10px</code>ずれる形となり、画像の高さが<code>24px</code>なので、結果として高さが<code>0</code>の要素を配置しているかのように扱われます。また、<code>middle</code>の位置からすると、上に<code>2px</code>ずれた位置に配置されます。</p>

<p><img src="/wp-content/uploads/2015/03/tbmargin.png" alt="tbmargin" width="640" height="206" class="alignnone size-full wp-image-13614" srcset="/wp-content/uploads/2015/03/tbmargin.png 640w, /wp-content/uploads/2015/03/tbmargin-300x97.png 300w, /wp-content/uploads/2015/03/tbmargin-207x67.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>こういった実装は、本来であれば<code>list-style-image</code>で行いたいところですが、いろいろと融通が効かないため、筆者はこのような方法を採用しています。</p>

<p>ほか、テンプレート設計のテクニックとしては、アイコンの幅高さを揃えてしまうという点も、一つ重要なように思われます。余白をギリギリまで削れば画像サイズを最小にできるでしょうが、そこまではせず、ある程度の余白をもたせ、高さ24px、幅24pxで作るよう統一したりなどします。そうすれば、一つ一つのアイコンのサイズを考慮し、細かく微調節せずに済むでしょう。そのサイズのアイコンがうまい位置に配置されるよう、今回解説してきたような調整を行えば、大体において、うまい具合にアイコンを配置することができるのではないでしょうか。</p>

<p>次回は<code>display: inline-block</code>の利用について解説します。</p>

<h2>CodeGridについて</h2>

<p>この連載の内容は、弊社、株式会社PixelGridが運営するフロントエンドの技術情報を配信するサービス、<a href="http://www.codegrid.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CodeGrid</a>にて連載された内容を元にしています。ご興味があれば、こちらもチェックしていただけると幸いです。</p>

<h2>イベント動画</h2>

<p>イベントの模様はYoutubeで公開されています。よろしければ、ご覧ください。</p>

<div class="aligncenter">
<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/tDJR9KoIsZA" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>
</div>
]]></content:encoded>
		
		<series:name><![CDATA[Frontrend Conference 特集]]></series:name>
	</item>
	</channel>
</rss>
