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

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

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

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

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

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

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

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

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

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

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

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

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

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

<h2>Functional Reactive Programming</h2>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>本記事では限られた範囲での紹介でしたが、セッションの動画も公開されていますので、もっと知りたい方はそちらもご覧いただけると幸いです。2015年に入ってからReactive ExtensionsまたはRxJS関係の情報も増えてきていますので、今後より一層注目されるようになるかもしれません。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Frontrend Conference 特集]]></series:name>
	</item>
		<item>
		<title>理解しておきたい、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>
		<item>
		<title>理解しておきたい、CSSによるインラインレイアウトの仕組み（vertical-align編その1）Inline Layout─Frontrend Conference</title>
		<link>/takazudo/13464/</link>
		<pubDate>Tue, 10 Mar 2015 00:00:33 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[CSS]]></category>

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

<h2>なぜ画像の下部にスペースができてしまうのか？</h2>

<p>今回の記事では、<code>vertical-align</code>について解説していきます。<a href="https://html5experts.jp/takazudo/13339/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">前回</a>は、行のレイアウトが、<code>font-size</code>と<code>line-height</code>によりどう変わるのかを見てきました。この行の中で、要素を縦位置のどこに配置するかを決定するのが<code>vertical-align</code>です。これを理解すると、前回の疑問、「なぜ画像の下部にスペースができてしまうのか」が分かります。</p>

<p>行の中に<code>display</code>が<code>inline</code>であるimg要素が登場したときのことを考えていきましょう。このときのimg要素は、その<code>vertical-align</code>の値により、配置される場所が異なります。順に見ていきます。</p>

<h2>top, bottom</h2>

<p>まずは<code>top</code>、<code>bottom</code>の場合です。</p>

<p><img src="/wp-content/uploads/2015/03/11.png" alt="1" width="640" height="200" class="alignnone size-full wp-image-13465" srcset="/wp-content/uploads/2015/03/11.png 640w, /wp-content/uploads/2015/03/11-300x94.png 300w, /wp-content/uploads/2015/03/11-207x65.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>top</code>の場合は、行の上端であるbefore-edgeに画像の上端が合わせられるように配置されます（A）。<code>bottom</code>の場合は逆で、行の下端であるafter-edgeに画像の下端が合わせられるように配置されます（B）。つまり、<code>top</code>であれば上端にくっつくよう、<code>bottom</code>であれば下端にくっつくように配置されるのです。そして、行の高さはその内容にあわせて高くなります。</p>

<p>以下が<code>top</code>の場合です。</p>

<p><img src="/wp-content/uploads/2015/03/6-top.png" alt="6-top" width="640" height="257" class="alignnone size-full wp-image-13476" srcset="/wp-content/uploads/2015/03/6-top.png 640w, /wp-content/uploads/2015/03/6-top-300x120.png 300w, /wp-content/uploads/2015/03/6-top-207x83.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>行の上端に画像の上端が合わせられ、下部に行が拡張されます。</p>

<p>以下が<code>bottom</code>の場合です。</p>

<p><img src="/wp-content/uploads/2015/03/6-bottom.png" alt="6-bottom" width="640" height="258" class="alignnone size-full wp-image-13471" srcset="/wp-content/uploads/2015/03/6-bottom.png 640w, /wp-content/uploads/2015/03/6-bottom-300x121.png 300w, /wp-content/uploads/2015/03/6-bottom-207x83.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>top</code>の時とは逆で、行の下端に画像の下端が合わせられ、上部に行が拡張されます。</p>

<p>では、前回はじめに上げた例、<code>&lt;div&gt;&lt;img&gt;&lt;/div&gt;</code>のimg要素の<code>vertical-align</code>を変更してみます。ここでは、わかりやすさのために、<code>&lt;div&gt;&lt;img&gt; xAhy 鈴&lt;/div&gt;</code>と、テキストを後ろに足しています。まずは<code>top</code>の場合です。</p>

<p><img src="/wp-content/uploads/2015/03/x-top.png" alt="x-top" width="640" height="342" class="alignnone size-full wp-image-13483" srcset="/wp-content/uploads/2015/03/x-top.png 640w, /wp-content/uploads/2015/03/x-top-300x160.png 300w, /wp-content/uploads/2015/03/x-top-207x111.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>行の上端に画像の上端が揃えられ、下部に行が拡張されています。</p>

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

<p><img src="/wp-content/uploads/2015/03/x-bottom.png" alt="x-bottom" width="640" height="342" class="alignnone size-full wp-image-13478" srcset="/wp-content/uploads/2015/03/x-bottom.png 640w, /wp-content/uploads/2015/03/x-bottom-300x160.png 300w, /wp-content/uploads/2015/03/x-bottom-207x111.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>今度は逆で、行の下端に画像の下端が揃えられ、上部に行が拡張されています。</p>

<h2>text-top, text-bottom</h2>

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

<p><img src="/wp-content/uploads/2015/03/21.png" alt="2" width="640" height="200" class="alignnone size-full wp-image-13466" srcset="/wp-content/uploads/2015/03/21.png 640w, /wp-content/uploads/2015/03/21-300x94.png 300w, /wp-content/uploads/2015/03/21-207x65.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>text-top</code>の場合は、text-before-edgeに画像の上端が合わせられるように配置されます（C）。<code>text-bottom</code>の場合は逆で、text-after-edgeに画像の下端が合わせられるように配置されます（D）。<code>font-size</code>により確保される領域の上端がtext-before-edge、下端がtext-after-edgeでした。この位置というのは、<code>line-height</code>がいくら高くても関係ありません。簡単にいえば、文字のちょっと上にくっつくのが<code>text-top</code>、文字のちょっと下にくっつくのが<code>text-bottom</code>です。</p>

<p>そして、先程と同様、行の高さはその内容により高くなります。</p>

<p>以下が<code>text-top</code>の場合です。</p>

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

<p><code>font-size</code>により確保される領域の上端、text-before-edgeに画像の上端が合わせられ、下部に行が拡張されます。</p>

<p>以下が<code>text-bottom</code>の場合です。</p>

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

<p><code>text-top</code>の時とは逆で、text-before-edgeに画像の下端が合わせられ、上部に行が拡張されます。</p>

<p>この2つのパターンの時、図の青矢印で示した部分、つまり、before-edgeとtext-before-edgeの間、text-after-edgeとafter-edgeの間には、画像が侵入しないことに注目してください。この部分はどのようになっているか、先の例と同様、色を付けたサンプルで見てみましょう。まずは<code>text-top</code>の場合です。</p>

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

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

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

<p>先の図で、青矢印で示した箇所がスペースとして確保されているのが分かります。</p>

<h2>baseline, middle</h2>

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

<p><img src="/wp-content/uploads/2015/03/31.png" alt="3" width="640" height="200" class="alignnone size-full wp-image-13467" srcset="/wp-content/uploads/2015/03/31.png 640w, /wp-content/uploads/2015/03/31-300x94.png 300w, /wp-content/uploads/2015/03/31-207x65.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>baseline</code>の場合は、baseline（alphabetical baseline）に画像の下端が合わせられるように配置されます（E）。<code>middle</code>の場合は、img要素の高さの中央が、baselineからx-heightの高さの半分上の位置に揃うように配置されます（F）。</p>

<p>これまでと同様、行の高さはその内容により高くなりますので、その様子を見てみます。</p>

<p>以下が<code>baseline</code>の場合です。</p>

<p><img src="/wp-content/uploads/2015/03/6-baseline.png" alt="6-baseline" width="640" height="270" class="alignnone size-full wp-image-13470" srcset="/wp-content/uploads/2015/03/6-baseline.png 640w, /wp-content/uploads/2015/03/6-baseline-300x127.png 300w, /wp-content/uploads/2015/03/6-baseline-207x87.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>baselineに画像の下端が揃えられるため、行は上に拡張されます。ということは、baselineよりも下に画像が侵入することはありません。</p>

<p>以下が<code>middle</code>の場合です。</p>

<p><img src="/wp-content/uploads/2015/03/6-middle.png" alt="6-middle" width="640" height="258" class="alignnone size-full wp-image-13473" srcset="/wp-content/uploads/2015/03/6-middle.png 640w, /wp-content/uploads/2015/03/6-middle-300x121.png 300w, /wp-content/uploads/2015/03/6-middle-207x83.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>middle</code>の場合は、画像の中央のラインで揃えられるため、画像の高さが高くなった場合、上下に行が拡張されます。</p>

<p>では、先程と同様、色を付けたサンプルで見てみましょう。</p>

<p>以下が<code>baseline</code>の場合です。</p>

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

<p>ベースラインよりも下に画像が侵入することはありませんが、ベースラインより下も行の一部です。よって、このように画像下部にスペースが確保された状態になります。先の図で青矢印で示した箇所です。</p>

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

<p><img src="/wp-content/uploads/2015/03/x-middle.png" alt="x-middle" width="640" height="342" class="alignnone size-full wp-image-13480" srcset="/wp-content/uploads/2015/03/x-middle.png 640w, /wp-content/uploads/2015/03/x-middle-300x160.png 300w, /wp-content/uploads/2015/03/x-middle-207x111.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>画像の高さが高くなれば、行は上下にどんどん広がります。この時に余計なスペースは発生していません。</p>

<h2>&lt;length&gt;</h2>

<p>最後は<code>length</code>の場合です。<code>3px</code>とか<code>0.3em</code>等が指定された場合です。</p>

<p><img src="/wp-content/uploads/2015/03/41.png" alt="4" width="640" height="239" class="alignnone size-full wp-image-13468" srcset="/wp-content/uploads/2015/03/41.png 640w, /wp-content/uploads/2015/03/41-300x112.png 300w, /wp-content/uploads/2015/03/41-207x77.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>length</code>が指定された場合は、baselineよりその長さ分だけ上のラインに画像の下端が揃えられるわけですから、それよりも下側の部分が余白となります。</p>

<p><img src="/wp-content/uploads/2015/03/6-length.png" alt="6-length" width="640" height="304" class="alignnone size-full wp-image-13472" srcset="/wp-content/uploads/2015/03/6-length.png 640w, /wp-content/uploads/2015/03/6-length-300x143.png 300w, /wp-content/uploads/2015/03/6-length-207x98.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>色を付けたサンプルで見てみましょう。</p>

<p><img src="/wp-content/uploads/2015/03/x-length.png" alt="x-length" width="640" height="369" class="alignnone size-full wp-image-13479" srcset="/wp-content/uploads/2015/03/x-length.png 640w, /wp-content/uploads/2015/03/x-length-300x173.png 300w, /wp-content/uploads/2015/03/x-length-207x119.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>baseline</code>を指定したときよりも、広いスペースが下に確保されているのが分かります。</p>

<h2>画像下部のスペースの謎</h2>

<p>今回は、img要素の<code>vertical-align</code>に様々な値を指定してみた場合を詳しく見てきました。もう既にお気づきかと思いますが、画像下部のスペースというのは、行として確保される領域の一部です。img要素の初期<code>vertical-align</code>値は<code>baseline</code>です。よって、その場合に発生する画像下部のスペースというのは、baselineからafter-edgeまでの領域のこととなります。</p>

<p>これが、画像下部に発生する余分なスペースの謎でした。ただimg要素を置いただけだと、インライン要素が配置されただけなので、それは、行ボックスの中に配置されることになります。そうなると、行各部の領域が確保されてしまうこととなりますので、意図しない余白に悩まされてしまうかもしれません。</p>

<p>こんな時はどうすればいいかといいますと、行ボックスを作らなければよいのです。早い話、img要素に<code>display: block</code>を指定してやるのが一番でしょう。ブロックとして表示させたい要素にはちゃんと<code>display: block</code>を指定する……と、考えて見れば当たり前の話ではありますが。</p>

<p>次回は、今回までの連載内容を活かし、リストのビュレットをうまく配置する方法を解説します。</p>

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

<p>この連載の内容は、弊社、株式会社PixelGridが運営するフロントエンドの技術情報を配信するサービス、<a href="http://www.codegrid.net/" target="_blank" data-wpel-link="external" 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>「StyleStats」を活用してCSSを評価する、Evaluating CSS─Frontrend Conference</title>
		<link>/t32k/13504/</link>
		<pubDate>Fri, 06 Mar 2015 03:00:08 +0000</pubDate>
		<dc:creator><![CDATA[石本 光司]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[StyleStats]]></category>

		<guid isPermaLink="false">/?p=13504</guid>
		<description><![CDATA[連載： Frontrend Conference 特集 (5)本記事は、2015年2月21日に行われたFrontrend Conferenceの「Evaluating CSS」の内容を紹介します。 はじめに こんにちは、...]]></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> (5)</div><p>本記事は、2015年2月21日に行われた<a href="http://frontrend.github.io/conference/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Frontrend Conference</a>の「Evaluating CSS」の内容を紹介します。</p>

<h2>はじめに</h2>

<p><a href="https://speakerdeck.com/t32k/evaluating-css" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/03/01.png" alt="Evaluating CSS" /></a></p>

<p>こんにちは、<a href="https://twitter.com/t32k" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@t32k</a>です。今日はEvaluating CSSというタイトルでCSSの解析ツール、<a href="https://github.com/t32k/stylestats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">StyleStats</a>に関して説明したいと思います。ちなみにEvaluateというのは『評価する、価値を見極める』といった意味の単語です。</p>

<p>宣伝ですが、今年から<a href="https://frontendweekly.tokyo/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Frontend Weekly</a>という無料のメールマガジンというか、海外の役立つリソースを紹介するウィークリーメールをやってますので、こちらも登録いただけると大変私嬉しいです。</p>

<h2>なぜCSSはそんなに難しいのか？</h2>

<p>では、まずなぜCSSはこんなに難しいのか考えてみましょう？いやいや、CSSってすごく、すごく単純ですよね。</p>

<p><img src="/wp-content/uploads/2015/03/02.png" alt="CSSの構造" /></p>

<p>こういったひとつのRuleがあります。divとsectionというSelectorがあります。その中にDeclarationをしていきます。DeclarationはPropertyとValueから成り立っています。</p>

<p>どうですか、これだけ見るには、すごく簡単ですよね。これのどこが難しいのでしょうか？ちょっと冷静に考えてみてください。ただ単純にCSSを書き連ねていくのは、誰でもできます。しかし、それのメンテンナンス性を維持しつつ、スケーラブル性も保ちながら管理していくのは非常に難しいです。</p>

<p>なぜならCSSにはスコープもなければ、抽象化する術も持たないので、どうしても冗長に書かざるを得なくなってしまいますし、現状はセレクタの命名規則でなんとかまかなうしかないのです。</p>

<p>JavaScriptサイドはよいですね。ES6などでどんどんと強力な機能が追加されていっています。しかし、CSSはプロパティは増えれども構造的にはなにも進化してません。SassなどのCSSプリプロセッサーなどは登場してきてますが、結局コンパイルしてしまえば、ただのCSSです。CSSには頑張ってほしいところです。</p>

<h3>CSSサイズファイルの増加</h3>

<p><img src="/wp-content/uploads/2015/03/03.png" alt="CSSのサイズの変遷" /></p>

<p>CSSは冗長的にしか書けませんので、時と共にじわじわと増加していきます。上記のグラフは、私が制作していたWebアプリケーションのデプロイ毎にCSSファイルサイズを記録しています。2回ほど大きく減少していますが、これは私が不慣れな書き方をしていたのをリファクタリングした結果でして、そのようなコードがなくなれば、あとはじわじわとファイルサイズが増加していくだけです。</p>

<p>私はこれが非常に怖い問題だと思っています。例えば、CSSのせいでレイアウトが崩れた！といったバグなどありますが、そういったものは探せば原因が見つかってすぐに直せます。たいした問題ではありません。しかし、このようにゆっくりとファイルサイズが増加していく場合は、それが問題だと認識しづらいという点が問題です。</p>

<p><a href="https://developers.google.com/web/fundamentals/performance/critical-rendering-path/index?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">クリティカルレンダリングパス</a>の観点から言えば、CSSファイルサイズがダウンロード・パースされるまでレンダリングはブロックされます。つまり、レンダリング遅延の問題が懸念されます。では表示遅延が問題（体感できるように）になってから、解決にリファクタリングしようとしても、スパゲッティ化したコードを一体どこから手を付けていいのかわからない状況に陥ります。</p>

<h3>デザインに依存</h3>

<p>また、CSSはデザインに大きく依存します。いくらあなたがスーパーCSSハッカーであろうとも、どうしようもないデザインをベースにコーディングすれば、どうしようもないスタイルシートができ上がります。</p>

<p><img src="/wp-content/uploads/2015/03/04.png" alt="Webデザインの3つのレイヤー" /></p>

<p><strong>Contents(HTML)</strong>、<strong>Presentation(CSS)</strong>、<strong>Behavior(JavaScript)</strong>といったWebデザインの3つのレイヤーがありますが、結局、HTML/CSSコーディングというのはビジュアルデザイン（PSD）から、ContentsとPresentationを分離させる作業ともいえます。</p>

<p>イレギュラーなデザインパターンを、CSS側で吸収するのは限度があります。そのため、最近ではページをデザインするのではなく、システムをデザインする考え方がよいです。つまり、ひとつひとつのコンポーネント（部品）から成り立つCSSであれば、部品を組み合わせることで、CSSの増加させずにさまざまなビジュアルパターンを制作することができます。</p>

<p>そのためには、スタイル（コンポーネント）ガイドのようなものを日常的に管理し、デザイナーとそれを参照しながらデザインをしてもらうといった制作スタイルも考えられます。</p>

<h3>CSSエンジニアになる</h3>

<p>しかしデザインもまた、突発的なデザイン変更やクライアントの希望などで、一貫性を保つことが難しい場合もあります。それを『デザイナーの責任だー！』と言っていれば、私たちはただのコーダーで終わるしかありません。私たち側でもよりよいものを作るために努力しなければなりません。</p>

<p>個人的にはエンジニアとはそういう存在だと思っています。だから私はCSSエンジニアになりたいと思いました。</p>

<blockquote>エンジニアとは、主に工学（エンジニアリング）分野の専門的な技術を持った実践者のことである。</blockquote>

<ul>
<li><a href="http://ja.wikipedia.org/wiki/%E6%8A%80%E8%A1%93%E8%80%85" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">技術者 &#8211; Wikipedia</a></li>
</ul>

<p>エンジニアとは上記のような人のことを言うそうです。さらにソフトウェアエンジニアリングのWikipediaを見てみると、<a href="http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E5%B7%A5%E7%A8%8B" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ソフトウェアの開発プロセス</a>というものがありました。</p>

<p>CSSにおける <strong>要求 · 仕様</strong> は、デザイナーが出してくるPSDでしょう。ここに関しては今までどおりデザイナーと対話する必要があります。</p>

<p><strong>アーキテクチャ · 設計</strong> に関しては、HTML5エキスパートである谷さんの『<a href="http://www.amazon.co.jp/dp/B00M0ESXUI" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web制作者のためのCSS設計の教科書</a>』を読めば大丈夫でしょう。</p>

<p>問題は、<strong>実装 · テスト</strong> と <strong>展開 · 保守</strong> の2つの段階でコレといったモノがないことです。私はこの辺りを解決するモノがほしかったのです。</p>

<h2>CSSを評価してみましょう</h2>

<p>そういう理由で、私は<a href="http://www.stylestats.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">StyleStats</a>を作成しました。StyleStatsにスタイルシートに解析させることで、さまざまな指標が得られます。v5.0.1時点で29の指標を確認することができます。基本的な使い方と各種指標の意味は、以前書いた記事を参照してください。</p>

<ul>
<li><a href="https://html5experts.jp/t32k/5743/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">自分の書いたコードが即座に解析できる「StyleStats」でCSSを測ろう！ | HTML5Experts.jp</a></li>
</ul>

<p>v5.0.0でいろいろコマンドラインのオプション名が変わっていますので、ヘルプでご確認ください。
</p><pre class="crayon-plain-tag">$ stylestats -h

  Usage: stylestats [options] 

  Options:

    -h, --help             output usage information
    -V, --version          output the version number
    -c, --config [path]    set configurations
    -f, --format [format]  set the output format 
    -t, --template [path]  set the template path for output formant
    -s, --specs [path]     run test with your test specs file
    -n, --number           show only numeral metrics
    -m, --mobile           set the mobile user agent</pre><p>
CSSと十把一絡げにいっても、HTML5エキスパートの谷さんが書くCSSと、新卒エンジニアの書くそれとでは大きく違うことでしょう。しかし、違うフィールドの人が一見してみれば同じように見えるでしょう。そこでStyleStatsに解析させてみれば、数値的に比較できれば違いが分かります。エキスパートの書いたCSSであれば、CSSでバッドプラクティスと思われる指標の数値は低く、ファイルサイズもまた小さいことでしょう。そういったことがStyleStatsでは目視で確認するより圧倒的に速く理解できます。</p>

<h3>類似ツール</h3>

<p>まずは、<a href="http://cssdig.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Dig</a>というChrome拡張機能があります。解析したいページに行き、拡張ボタンを押すだけで解析できます。</p>

<p>次に<a href="http://cssstats.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Stats</a>というWebアプリケーションがあります。Specificity Graphなど、StyleStatsにはない機能もあります。</p>

<p>StyleStatsもCLIだけでなく、GUIとしてのWebアプリケーションが提供されています。</p>

<ul>
<li><a href="http://www.stylestats.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">StyleStats &#8211; Useful tool to collect CSS statistics</a></li>
</ul>

<p>また、npmモジュールとしてProgrammaticalに利用することもできるため、他にGruntやGulpからも利用することができます。また、解析が終わったらSlackに結果を投稿するなどのインテグレーションも考えられます。</p>

<p><img src="/wp-content/uploads/2015/03/05.png" alt="Slack Integration" /></p>

<p>おかげさまで、<a href="https://moniteur.herokuapp.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">FT Labs</a>や<a href="http://ianfeather.co.uk/css-at-lonely-planet/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Lonely Planet</a>などの世界的な企業でStyleStatsは使われております。</p>

<p>結局、私が欲しかったのはエンジニアリングとしてのツールで、それを継続的インテグレーションに組み込みたかったという点があります。</p>

<p><img src="/wp-content/uploads/2015/03/06.png" alt="CI" /></p>

<p>CIプロセスにCSSの評価を組み込めば、CSSを書く人だけでなく、デザイナーやバックエンドのエンジニアも今のCSSの状態が分かるようになります。その中で、StyleStatsでどのようにモニターとテストをすればよいか説明します。</p>

<h3>モニター</h3>

<p>前述のとおり、CSSは徐々に徐々に増えていきます。気づいたら手遅れになっていた、ということのないように常日頃から監視しておく必要性があります。StyleStatsを使えば、Jenkins上から実行させ、それをグラフとしてプロットすることができます。これは<a href="https://html5experts.jp/t32k/5743/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">前回の記事</a>でも紹介したとおりです。</p>

<p><img src="/wp-content/uploads/2015/03/07.png" alt="moniteur" /></p>

<p>また、最近ではFT Labsの方が<a href="https://github.com/kaelig/moniteur" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">kaelig/moniteur</a>というモニタリングWebアプリケーションを作成してくれました。<code>git clone</code>してきて、ローカルでも動作させることが可能です。Webアプリケーションのとして動かすにはRedisサーバーを使うことになるのですが、そこまで難しくはないので試してみてください。</p>

<h4>User Specified Selectors</h4>

<p>v5.0.0で追加された新規指標のUser Specified Selectorsは、ユーザー指定のセレクタ数をカウントすることができます。config.jsonで<code>"userSpecifiedSelectors"</code>の値に任意の正規表現を記述することで、指標を表示させることができます。</p>

<p>これにより、例えばBEMでのModifierの数やElementの数などカウントするこもできますし、CSSを記述する人が独自の命名規則（独自の接頭辞を持つクラスセレクタ等）さえ、守っていればいろいろ計測することができます。</p>

<h3>テスト</h3>

<p>次にテストですが、CSSには古くから<a href="http://csslint.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Lint</a>があります。これはさまざまなエディタのプラグインが揃っていたりGrunt/Gulpのプラグインもあるので、多くの人が使われているかと思います。</p>

<p>しかし、これは単純に使ってたらエラーが出るだけのものです。例えば、古くから運用しているサイトのCSSを解析したい場合、昔にIDセレクタを使っていたといったことがあります。そこで、StyleStatsでは5個以上あったらエラーとするなど、任意の値でCSSをテストすることできます。
</p><pre class="crayon-plain-tag">{
  "defaults": {
    "suiteName": "StyleStats Test Suite for sample.css",
    "text": "{metric}: {actual} should be {operation} {expected}",
    "operation": "&lt;",
    "reporter": "spec"
  },
  "results": {
    "simplicity": {
      "min": 0.4
    },
    "size": 20000,
    "dataUriSize": 8000,
    "idSelectors": 20,
    "importantKeywords": {
      "min": 2,
      "max": 8
    },
    "javascriptSpecificSelectors": 1
  }
}</pre><p>
上記のコードのようにtest-specs.jsonでテストのしきい値を設定します。例えば上記の条件だと、IDセレクタが20個以上だったらエラーでビルドが中止されます。</p>

<p>StyleStatsでテストできる指標は数値的なものであれば何でもできますので、例えば単純にsizeに着目してもいいですし、先ほど説明したUser Specified Selectorsを使って、独自の基準を設けてもらっても大丈夫です。大事なのは皆の前でテストを失敗させる（エラーにならないほうが良いのですが）ことでCSSの問題をプロジェクトチーム全体の問題にすることです。</p>

<p><img src="/wp-content/uploads/2015/03/08.png" alt="test" /></p>

<h2>まとめ</h2>

<p>そういうわけで、CSSはいまだにどうしようもないですが、CSSを扱う人間までがどうしようもないわけではありません。CSSの問題は一人で解決できないので、その問題をチームで共有しましょう。</p>

<p>現状のCSSを状態を常に確認し、ある程度のしきい値をあらかじめ決めておく。肥大化してエラーが出る度になぜクリアできないのか皆で話し合う。そうすることによって、CSSを扱う私たちの価値も上がっていくのではないでしょうか。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Frontrend Conference 特集]]></series:name>
	</item>
		<item>
		<title>理解しておきたい、CSSによるインラインレイアウトの仕組み（font-size／line-height編）Inline Layout─Frontrend Conference</title>
		<link>/takazudo/13339/</link>
		<pubDate>Thu, 05 Mar 2015 01:00:35 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">/?p=13339</guid>
		<description><![CDATA[連載： Frontrend Conference 特集 (4)この記事は、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> (4)</div><p>この記事は、<a href="http://frontrend.github.io/conference/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Frontrend Conference</a>のセッション「Inline layout」でお話させていただいた内容を基に、連載記事（全4回）として書き起こしたものです。今回は第１回目です。</p>

<h2 id="はじめに">はじめに</h2>

<p>Frontrend Conferenceでは、皆さんが新しい技術について話していた中、私からはCSS2.1のお話をさせていただきました。私が解説したのは、CSSを書く上で欠かせない、以下の4つについてです。</p>

<ul>
<li>font-size</li>
<li>line-height</li>
<li>vertical-align</li>
<li>inline-block</li>
</ul>

<p>トレンドとはほど遠い内容ではありますが、多くの人にとって、なんとなく感覚的に書いてしまっている部分だったという感想をいただきました。本記事の内容を理解すれば、日頃のコーディングの悩みがすっきりするかもしれません。</p>

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

<h2 id="レイアウトの仕組み、正しく理解できていますか？">レイアウトの仕組み、正しく理解できていますか？</h2>

<p>こんなHTMLがあったとします。</p>

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

<p>この時、以下のように画像が並べられますが、画像の下部には、何かわずかなスペースが発生してしまいます。</p>

<p><img src="/wp-content/uploads/2015/03/imgs2.png" alt="imgs2" width="530" height="640" class="alignnone size-full wp-image-13354" srcset="/wp-content/uploads/2015/03/imgs2.png 530w, /wp-content/uploads/2015/03/imgs2-248x300.png 248w, /wp-content/uploads/2015/03/imgs2-171x207.png 171w" sizes="(max-width: 530px) 100vw, 530px" /></p>

<p>このスペースは、以下の様なCSSを書くと、消すことができます。</p>

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

<p><img src="/wp-content/uploads/2015/03/imgs3.png" alt="imgs3" width="550" height="640" class="alignnone size-full wp-image-13355" srcset="/wp-content/uploads/2015/03/imgs3.png 550w, /wp-content/uploads/2015/03/imgs3-258x300.png 258w, /wp-content/uploads/2015/03/imgs3-178x207.png 178w" sizes="(max-width: 550px) 100vw, 550px" /></p>

<p>このスペースは一体何か。なぜ<code>vertical-align</code>を書くと消えたのか。私はなぜこのようなことになるのか、よく分かっていませんでした。</p>

<p>また、以下のようにアイコン画像やラジオボタン、チェックボックスをリストの頭に配置するのは、よくあることです。</p>

<p><img src="/wp-content/uploads/2015/03/bullets.png" alt="bullets" width="500" height="188" class="alignnone size-full wp-image-13353" srcset="/wp-content/uploads/2015/03/bullets.png 500w, /wp-content/uploads/2015/03/bullets-300x113.png 300w, /wp-content/uploads/2015/03/bullets-207x78.png 207w" sizes="(max-width: 500px) 100vw, 500px" /></p>

<p>しかし、このアイコン画像ら、なかなかうまい位置にレイアウトされないことがあります。上記画像のように、少し下や上にずれてしまったり。ここで<code>vertical-align</code>をいじったり、<code>position: relative</code>にしてわずかに上や下にずらしたりなどして調節したりする人は多いでしょう。ですが、そもそも、なぜこのようにうまくレイアウトされないのか。どうすればうまく調節できるのか。それを調べていったところ、結果として、インラインのレイアウトについて詳しく理解するに至りました。</p>

<p>普段何気なく使っているけれど、実は詳しくは知らない（かもしれない）、インラインのレイアウトについて解説していきます。</p>

<h2>font-sizeとline-height</h2>

<p>まずははじめに疑問として挙げた、画像下部に発生するスペースについて考えていきましょう。……と言いたいところですが、その前に、これを理解するにはまず<code>font-size</code>と<code>line-height</code>の理解が必須です。今回はこれを解説していきましょう。</p>

<p>次のようなHTMLとCSSがあるとします。</p>

<p></p><pre class="crayon-plain-tag">&lt;p&gt;&lt;span&gt;The quick brown fox jumps over the lazy dog. ...&lt;/span&gt;&lt;/p&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">p {
  font-size: 16px;
  line-height: 16px;
  background: #a6dbbe; /* green */
}
span {
  background: #f197f1; /* purple */
}</pre><p></p>

<p>これは、以下のように描画されます。</p>

<p><img src="/wp-content/uploads/2015/03/x2.png" alt="x2" width="640" height="494" class="alignnone size-full wp-image-13350" srcset="/wp-content/uploads/2015/03/x2.png 640w, /wp-content/uploads/2015/03/x2-300x232.png 300w, /wp-content/uploads/2015/03/x2-207x160.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このとき、文字の大きさは16pxで、行の高さも16pxです。それぞれの行を枠で囲んでみると、以下のようになるでしょう。</p>

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

<p>ここで、<code>line-height</code>を広げてみます。</p>

<p></p><pre class="crayon-plain-tag">p {
  font-size: 16px;
  line-height: 24px;
}</pre><p></p>

<p>すると、以下のように行の間にスペースが発生します。</p>

<p><img src="/wp-content/uploads/2015/03/x3.png" alt="x3" width="565" height="640" class="alignnone size-full wp-image-13351" srcset="/wp-content/uploads/2015/03/x3.png 565w, /wp-content/uploads/2015/03/x3-265x300.png 265w, /wp-content/uploads/2015/03/x3-183x207.png 183w" sizes="(max-width: 565px) 100vw, 565px" /></p>

<p>この時の文字の大きさと行の高さについて、詳しく見ていきましょう。</p>

<p>ピンクの間に見える背景のグリーンの部分が、<code>line-height</code>を指定することで広げられた「行間」となりますが、この部分のことをleadingといいます。</p>

<p><img src="/wp-content/uploads/2015/03/2.png" alt="2" width="640" height="303" class="alignnone size-full wp-image-13341" srcset="/wp-content/uploads/2015/03/2.png 640w, /wp-content/uploads/2015/03/2-300x142.png 300w, /wp-content/uploads/2015/03/2-207x98.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このleading、次のように、真ん中で半分に分割されます。このように半分に分割されたleadingをhalf-leadingと呼びます。</p>

<p><img src="/wp-content/uploads/2015/03/3.png" alt="3" width="640" height="303" class="alignnone size-full wp-image-13342" srcset="/wp-content/uploads/2015/03/3.png 640w, /wp-content/uploads/2015/03/3-300x142.png 300w, /wp-content/uploads/2015/03/3-207x98.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>1行というのは<code>font-size</code>分の高さを持った基本領域（inline box）の上下にhalf-leading分のスペースが加わり、成り立っています。このとき、1行の高さは<code>line-height</code>が示す値、この場合でいうと24pxです。この値から基本領域の高さ16pxを引いた8pxがleadingの高さとなり、half-leadingの高さは4pxとなります。図にすると以下のような形です。</p>

<p><img src="/wp-content/uploads/2015/03/4.png" alt="4" width="640" height="280" class="alignnone size-full wp-image-13343" srcset="/wp-content/uploads/2015/03/4.png 640w, /wp-content/uploads/2015/03/4-300x131.png 300w, /wp-content/uploads/2015/03/4-207x91.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>line-height</code>を変えると、この緑で示したleading部分の高さが変化することとなります。</p>

<h2>行内の各部名称</h2>

<p>行の中では、このように文字上下のスペースが確保されるようになっています。各部には、以下のように名前がつけられています。</p>

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

<p>テキストが配置される場合、まず始めに、それを配置するための箱が用意されると考えます。この箱のことをinline boxと呼びます。上図にて、紫で色を付けた領域です。テキストが配置される場合、このinline boxの高さが、1em分の高さです。</p>

<p>例えば<code>font-size: 16px</code>と指定したら、このinline boxの高さが16pxとなり、16pxが1emとして扱われるようになるという具合です。</p>

<p>そして、その上下にhalf-leading分の余白が加わり、1行の高さとなります。この高さが<code>line-height</code>が示す高さとなります。こうして拡張されたinline boxのことを、extended inline boxと呼びます。<code>line-height</code>が24pxなら、extended inline boxの高さが24pxとなります。</p>

<p>このinline boxの上端をtext-before-edge、下端をtext-after-edge。extended inline boxの上端をbefore-edge、下端をafter-edgeと呼びます。</p>

<p>インラインのレイアウトを考える上で重要なのが、baselineです。</p>

<p><img src="/wp-content/uploads/2015/03/6.png" alt="6" width="640" height="261" class="alignnone size-full wp-image-13345" srcset="/wp-content/uploads/2015/03/6.png 640w, /wp-content/uploads/2015/03/6-300x122.png 300w, /wp-content/uploads/2015/03/6-207x84.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>baselineとは、その名が示す通り、文字の土台となるラインです。アルファベットの文字は通常、このbaselineを基準としてデザインされます。そして、ここから一定の距離のラインで、小文字の高さを揃えます。この高さがx-heightです（この高さは、CSS内で1exとして利用できます）。</p>

<p>ちなみに、このbaselineはアルファベットを基準に考えた場合で、日本語などのbaselineは、これよりもちょっと下がbaseline（ideographical baseline）となります。</p>

<p><img src="/wp-content/uploads/2015/03/7.png" alt="7" width="640" height="251" class="alignnone size-full wp-image-13346" srcset="/wp-content/uploads/2015/03/7.png 640w, /wp-content/uploads/2015/03/7-300x118.png 300w, /wp-content/uploads/2015/03/7-207x81.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>CSS3の仕様を見ると、将来的には、このideographical baselineも<code>vertical-align</code>などの基準位置として利用できるようになるようです。</p>

<h3>行の高さ</h3>

<p>行というのは、テキストを配置するのに必要な分だけ作られます。そして、その高さは、各行それぞれにおいて決定されます。以下のようなHTMLとCSSがあったとします。</p>

<p></p><pre class="crayon-plain-tag">&lt;p&gt;The &lt;b&gt;quick&lt;/b&gt; &lt;em&gt;brown&lt;/em&gt; &lt;i&gt;fox&lt;/i&gt; jumps...&lt;/p&gt;</pre><p></p>

<p>そして、各要素に異なるfont-size、line-heightと色を指定します。
</p><pre class="crayon-plain-tag">p  { font-size: 12px; line-height: 18px; }
b  { font-size: 20px; line-height: 30px; }
em { font-size: 30px; line-height: 40px; }
i  { font-size: 40px; line-height: 50px; }</pre><p></p>

<p>すると、以下の様な描画結果となり、当たり前のことですが、pの中にたくさんの行が発生していることが分かります。</p>

<p><img src="/wp-content/uploads/2015/03/x4.png" alt="x4" width="640" height="580" class="alignnone size-full wp-image-13352" srcset="/wp-content/uploads/2015/03/x4.png 640w, /wp-content/uploads/2015/03/x4-300x272.png 300w, /wp-content/uploads/2015/03/x4-207x188.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ここで、1行目を詳しく見てみると、以下の様にレイアウトが行われています。</p>

<p><img src="/wp-content/uploads/2015/03/8.png" alt="8" width="640" height="131" class="alignnone size-full wp-image-13347" srcset="/wp-content/uploads/2015/03/8.png 640w, /wp-content/uploads/2015/03/8-300x61.png 300w, /wp-content/uploads/2015/03/8-207x42.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>b</code>、<code>em</code>、<code>i</code>それぞれの要素は、それぞれに指定された<code>line-height</code>の分だけの高さを持つextended inline boxを形成します。その前後のテキストは、<code>p</code>の<code>line-height</code>が適用されます。こうして、複数のextended inline boxが一つの行の中に存在する場合、その中で最も高さの高いボックスの高さが、行の高さとなります。この場合は、<code>&lt;i&gt;fox&lt;/i&gt;</code>が50pxで一番高いので、この高さが行の高さとなっています。これが基本的な行レイアウトの仕組みです。そして、これらのボックスは、ベースラインに沿って揃えられます。この揃え位置をいろいろと変更できるのが<code>vertical-align</code>です。</p>

<p>今回は、<code>font-size</code>と<code>line-height</code>により、どのように行がレイアウトされるのかを解説しました。次回は<code>vertical-align</code>について解説していきます。</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>今話題のReact.jsはどのようなWebアプリケーションに適しているか？ Introduction To React─ Frontrend Conference</title>
		<link>/hokaccha/13301/</link>
		<pubDate>Wed, 04 Mar 2015 00:00:55 +0000</pubDate>
		<dc:creator><![CDATA[外村 和仁]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[React.js]]></category>

		<guid isPermaLink="false">/?p=13301</guid>
		<description><![CDATA[連載： Frontrend Conference 特集 (3)本記事は、2015/2/21に行われたFrontrend Conferenceの「Introduction To React」の内容を紹介します。 当日の資料...]]></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> (3)</div><p>本記事は、2015/2/21に行われた<a href="http://frontrend.github.io/conference/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Frontrend Conference</a>の「Introduction To React」の内容を紹介します。</p>

<p>当日の資料は以下にアップされていますので、こちらも参照してください。</p>

<p><a href="https://speakerdeck.com/hokaccha/introduction-to-react" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Introduction To React // Speaker Deck</a></p>

<h2>React.jsとは何か</h2>

<p>React.jsはFacebook製のJavaScriptライブラリです。</p>

<p><a href="http://facebook.github.io/react/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://facebook.github.io/react/</a></p>

<p>公式サイトに、「A JavaScript library for building user interfaces」とあるように、React.jsはUIを構築するためのライブラリです。フレームワークでなくあくまでUIを構築するだけのライブラリで、MVCでいうところのVのみの機能を提供します。</p>

<p>開発を行っているFacebookやInstagramはもちろん、YahooやAirbnbなど多くの採用事例があり、現在注目を集めているライブラリの一つです。</p>

<h2>React.jsの特徴</h2>

<p>React.jsの特徴を知るために、まずは他のライブラリやフレームワークの問題点について見ていきましょう。例えば<a href="http://todomvc.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Todo MVC</a>のような、フォームを送信したらリストに項目が追加されるようなUIの実装を考えてみましょう。</p>

<h3>jQuery</h3>

<p>単純にjQueryだけで実装すると次のようになるでしょう。</p>

<p></p><pre class="crayon-plain-tag">// Submitされたら
$('form').on('submit', functino() {
  // 要素作って
  var $li = $('&lt;li&gt;');
  // ...

  // リストに追加
  $('ul').append($li);
});</pre><p></p>

<p>しかし、これだとデータがDOMにしかないので、何か機能を追加しようとしたときに非常にやりづらいですし、テストも書きにくいコードになります。</p>

<h3>Backbone.js</h3>

<p>Backbone.jsを使うとこの問題をある程度解決することができます。Backbone.jsはデータは管理するModelと、表示を管理するViewに分け、さらにViewをコンポーネントごとに分けるという設計を提案します。例えば次のようになります。</p>

<p></p><pre class="crayon-plain-tag">var FormView = Backbone.View.extend({
  onSubmit: function() {
    // dataを作ってモデルに追加するだけ
    this.collection.add(data)
  }
});

var ListView = Backbone.View.extend({
  initialize: function() {
    // モデルが更新されたらリストを更新
    this.collection.on('add', this.render);
  }
});</pre><p></p>

<p>FormViewやListViewといった、UIの部品ごとに機能を分けていますが、このようなものをここではコンポーネントと呼ぶことにします。</p>

<p>Backbone.jsでデータやコンポーネントを分けて管理できるようになるとある程度の規模ではうまくいきますが、Viewの更新処理を手動で書かないといけない面倒さがあったり、ModelとView間のイベント管理が煩雑になるなど、規模が大きくなった時にスケールしづらいという問題があります。（Backbone.jsのラッパーライブラリである<a href="http://marionettejs.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Marionette</a>や<a href="http://chaplinjs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chaplin</a>といったものもありますが、本質的な問題は同じです）</p>

<h3>Angular.js、Vue.js</h3>

<p>Angular.js、Vue.jsなどに代表される、いわゆるMVVM系のライブラリの特徴はデータが変更されたら自動的に表示が変わる、という考え方です。</p>

<p></p><pre class="crayon-plain-tag">&lt;form ng-submit="onSubmit()"&gt;
  &lt;input type="text" ng-model="text"&gt;
&lt;/form&gt;

&lt;ul&gt;
  &lt;li ng-repeat="item in list"&gt;
    {{item.text}}
  &lt;/li&gt;
&lt;/ul&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">// Controller
$scope.onSubmit = function() {
  // データを更新したら勝手にViewが変わる
  $scope.list.push(newItem);
};</pre><p></p>

<p>このように、HTMLに描画されるデータを記述し、JavaScript側ではデータを更新するだけで自動的に表示が更新されます。しかし、これらのライブラリも、規模が大きくなってきた時に状態を管理するのが難しくなってきます。</p>

<h3>React.js</h3>

<p>jQueryやBackbone.js、Angular.jsは規模が大きくなったときに管理するのが難しくなる、と述べましたが、きちんと設計すれば管理しやすいアプリケーションにすることは可能でしょう。しかし、それらは元々そのような目的のためのライブラリではないので、規模が大きくなっても管理可能に設計するというのは簡単なことではありません。</p>

<p>React.jsは、規模が大きくなっても管理できるような仕組みを提供してくれるライブラリです。逆に言えば、小さいアプリケーションを高速に開発するためのライブラリではないので、そういった場合はBackbone.jsやVue.jsを使ったほうがいいケースが多いと思います。</p>

<p>React.jsの特徴として、コンポーネントを極力ステートレスにすることで、コンポーネントを管理しやすくするというものがあります。</p>

<p></p><pre class="crayon-plain-tag">var Form = React.createClass({
  onSubmit: function() {
    // 親にデータの更新を通知
  },
  render: function() {
    return &lt;form onSubmit={this.onSubmit}&gt;...&lt;/form&gt;;
  }
});

var List = React.createClass({
  render: function() {
    // 親からもらったデータを元に構築するだけ
    return &lt;ul&gt;{this.props.list.map(...)&lt;/ul&gt;;
  }
});</pre><p></p>

<p>各コンポーネントは親からデータをもらい、それを元にViewを構築します。ここで重要なのは、コンポーネント自身は状態を持たないということです。常に外部（多くの場合は親コンポーネント）からの入力によって一意な表示を出力することでテストしやすく、管理可能で再利用性の高いコンポーネントにすることができます。</p>

<p>もちろん、全てのコンポーネントが状態を持たないと単なる静的なHTMLと同じですので、状態を持つコンポーネントも必要になりますが、そのようなコンポーネントを最小限にし、基本的にはステートレスなコンポーネントを作って組み合わせていくのがReact.jsにおけるプログラミングの考え方です。</p>

<p>普通はツリーのルートのコンポーネントだけに状態を持たせ、その状態を子のコンポーネントに伝え、ツリーを構築します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.03.29-PM.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.03.29-PM-640x442.png" alt="ツリーのルートだけがStatefullで子コンポーネントは全てStateless" width="480" height="331" class="alignnone size-large wp-image-13315" srcset="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.03.29-PM.png 640w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.03.29-PM-300x207.png 300w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.03.29-PM-207x143.png 207w" sizes="(max-width: 480px) 100vw, 480px" /></a></p>

<p>また、コンポーネントの状態が変更すると自動的にツリーは再構築されるので、表示の更新を手動でやる必要がありません。これはAngular.jsなどのような、データが変わったら自動的に表示が変わるという考え方と同じです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.58.25-PM.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.58.25-PM-640x482.png" alt="1.末端のコンポーネントでユーザーアクションが起きる、2.ルートコンポーネントに変更を通知、3.子のコンポーネントを再構築する" width="480" height="361" class="alignnone size-large wp-image-13311" srcset="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.58.25-PM.png 640w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.58.25-PM-300x226.png 300w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.58.25-PM-207x156.png 207w" sizes="(max-width: 480px) 100vw, 480px" /></a></p>

<p>基本的にはルートのコンポーネント以外は状態を持たないようにするのがよいですが、input要素などはユーザーアクションによって自身のデータを変更する必要があるので状態を持ちます。</p>

<h2>Virtual DOM</h2>

<p>ルートのコンポーネントだけで状態を持ち、その状態が変更したらツリーを再構築するというのは、非常に設計を単純にしますが、一部分の変更だけで毎回全てのDOMツリーを再構築するのは速度的な面で問題になります。そこでReact.jsはVirtual DOMという仕組みを導入しました。</p>

<p>Virtual DOMはざっくり言うと、JavaScriptのオブジェクトとしてDOMツリーのようなものを持っておき、データに変更があった場合にそのオブジェクトの差分を計算し、実際のDOMへの再レンダリングを最小限にするという仕組みです。</p>

<p>React.jsでは<code>React.createClass</code>でコンポーネントを作成し、renderメソッドの返り値にVirtual DOMの定義を返します。Virtual DOMは<code>React.createElement</code>によって作成します。</p>

<p></p><pre class="crayon-plain-tag">var MyComponent = React.createClass({
  render: function() {
    return React.createElement("div", {className: "foo"}, 
      React.createElement("div", {className: "bar"},
        "Hello ", this.props.name
      )
    );
});</pre><p></p>

<p>また、JSXという独自シンタックスを使うことで、XMLのようなシンタックスでVirtual DOMを表現することができます。</p>

<p></p><pre class="crayon-plain-tag">var MyComponent = React.createClass({
  render: function() {
    return (
      &lt;div className="foo"&gt;
        &lt;div className="bar"&gt;
          Hello {this.props.name}
        &lt;/div&gt;
      &lt;/div&gt;
    );
  }
});</pre><p></p>

<p>これは<a href="https://www.npmjs.com/package/react-tools" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">react-tools</a>や<a href="https://www.npmjs.com/package/babel" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">babel</a>のようなツールで実行可能なJavaScriptのコードに変換することができます。</p>

<h2>React.jsの速度について</h2>

<p>React.jsは速い、と聞いたことがある人もいるかもしれませんが、はたして本当でしょうか。Virtual DOMという仕組みを導入し、ルートのデータを変更してもDOMへの変更が最小限になるので、高速になりますが、それはあくまでも全てのDOMを再構築する場合と比べた場合の話です。ここでは以下の3つのケースについて速度を計測しました。</p>

<ol>
<li>Backbone.jsで変更があった部分だけDOMを再構築</li>
<li>Backbone.jsで何か変更があった場合全てのDOMを再構築</li>
<li>React.jsで何か変更があった場合Virtual DOMの仕組みを通して差分のみDOMを再構築</li>
</ol>

<p>結果は次のようになります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.49.24-PM.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.49.24-PM-640x402.png" alt="Screen Shot 2015-02-28 at 3.49.24 PM" width="640" height="402" class="alignnone size-large wp-image-13307" srcset="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.49.24-PM.png 640w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.49.24-PM-300x188.png 300w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.49.24-PM-207x130.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>※ <a href="http://hokaccha.github.io/todomvc-perf-comparison/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TodoMVC Benchmark</a></p>

<p>このように、React.jsは、Backbone.jsで部分的に再構築するよりは遅いが、全てのDOMを再構築するよりははるかに速いことがわかります。</p>

<p>前述したように、状態をルートのコンポーネントだけに持つというのは非常に設計を単純にできます。そのような設計と速度を両立できるのがReact.jsの一番の特徴といえるでしょう。</p>

<h2>Flux</h2>

<p>Fluxはアプリケーションの設計手法の一つとしてFacebookが提唱しているものです。よくMVCと比較され、MVCと比べてデータの流れが一方通行であるという特徴があります。</p>

<div id="attachment_13317" style="width: 650px" class="wp-caption right"><a href="https://html5experts.jp/wp-content/uploads/2015/02/flux-simple-f8-diagram-with-client-action-1300w.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/flux-simple-f8-diagram-with-client-action-1300w-640x193.png" alt="Action→Dispacher→Store→View→Action→（繰り返し）" width="640" height="193" class="size-large wp-image-13317" srcset="/wp-content/uploads/2015/02/flux-simple-f8-diagram-with-client-action-1300w.png 640w, /wp-content/uploads/2015/02/flux-simple-f8-diagram-with-client-action-1300w-300x90.png 300w, /wp-content/uploads/2015/02/flux-simple-f8-diagram-with-client-action-1300w-207x62.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">引用元：<a href="http://facebook.github.io/flux/docs/overview.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://facebook.github.io/flux/docs/overview.html</a></p></div>

<p>ここまでで、React.jsの基本的な設計として、状態をルートコンポーネントに持ち、何か変更があったらその状態を変更すると述べてきましたが、どのようにその変更を通知するかについては触れませんでした。</p>

<p>例えば、ツリーの末端のコンポーネントで何かユーザーのアクションを検知し、状態の変更が必要になったとします。このとき、React.jsではこの末端のコンポーネントはステートレスなので、変更を外に通知する必要があります。このとき、変更があった場合のイベントを公開しておき、直接の親のコンポーネントにイベントハンドラを通して通知する方法があります。</p>

<p></p><pre class="crayon-plain-tag">var Parent = React.createClass({
  handleChange: function(changedData) {
    // 子で何か変更があった時の処理
  },
  render: function() {
    // 子のコンポーネントのイベントにハンドラを設定
    return &lt;Child onChange={this.handleChange}&gt;a&lt;/Child&gt;;
  }
});

var Child = React.createClass({
  handleSubmit: function() {
    // 親から受け取ったイベントハンドラを実行
    this.props.onChange(changedData);
  },
  render: function() {
    // formのDOMイベントにハンドラを設定
    return &lt;form onSubmit={this.handleSubmit}&gt;...&lt;/form&gt;;
  }
});</pre><p></p>

<p>しかし、この方法だと、ネストが深いところのコンポーネントの変更を状態を持っているルートコンポーネントに伝えるのは非常に面倒です。そこで、FluxではViewで起こった変更を一括でActionに通知し、Dispatcherを通じてStoreに変更を通知します。</p>

<p>Storeというのはデータを管理する層で、MVCでいうMにあたる部分です。ViewのルートコンポーネントはこのStoreの変更を購読しており、Storeが変更されると自動的に状態が変更されます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.12.38-PM.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.12.38-PM-640x479.png" alt="View（ツリー）→Action→Disptacher→Store→View" width="480" height="359" class="alignnone size-large wp-image-13319" srcset="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.12.38-PM.png 640w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.12.38-PM-300x225.png 300w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.12.38-PM-207x155.png 207w" sizes="(max-width: 480px) 100vw, 480px" /></a></p>

<p>Flux自体は、設計の考え方なので、色々な実装があります。Fluxの考案元であるFacebookにも<a href="https://github.com/facebook/flux" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">facebook/flux</a>という実装がありますが、これはDispacherのみを提供するかなりミニマムな実装です。他には、例えば次のようなものがあります。</p>

<ul>
<li><a href="https://github.com/spoike/refluxjs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">spoike/refluxjs</a></li>
<li><a href="https://github.com/jmreidy/fluxy" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">jmreidy/fluxy</a></li>
<li><a href="https://github.com/yoshuawuyts/barracks" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">yoshuawuyts/barracks</a></li>
<li><a href="https://github.com/BinaryMuse/fluxxor/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">BinaryMuse/fluxxor</a></li>
<li><a href="https://github.com/deloreanjs/delorean" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">deloreanjs/delorean</a></li>
</ul>

<h2>まとめ</h2>

<p>React.jsやFluxの思想・特徴について説明しました。文中でも述べたように、React.jsが提供するのは規模が大きくなってもスケールできるような仕組みで、小さいアプリケーションを高速に開発するためのライブラリではありません。そのようなアプリケーションはAngular.jsやVue.jsのほうが向いている場合も多いですし、静的なページにちょっとしたUIをつけるだけならjQueryだけで十分なケースもあります。</p>

<p>実際にReact.jsとFluxでアプリケーションを書いてみるとわかりますが、ステートレスなコンポネートを組み合わせていくというのは面倒だと感じることも多いです。しかし、その面倒な制限と引き換えに得られるのが堅牢でメンテナンス可能なアプリケーションです。</p>

<p>もしそのような仕組みがほしいと思っている方がいればReact.jsも採用の候補に考えてみてはいかがでしょうか。</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/Biam884qSjg" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>
</div>
]]></content:encoded>
		
		<series:name><![CDATA[Frontrend Conference 特集]]></series:name>
	</item>
		<item>
		<title>とてもHackable！Styling Atom(Editor)─Frontrend Conference</title>
		<link>/yusuke-naka/13137/</link>
		<pubDate>Fri, 27 Feb 2015 00:00:52 +0000</pubDate>
		<dc:creator><![CDATA[仲 裕介]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Atom Editor]]></category>
		<category><![CDATA[LESS]]></category>

		<guid isPermaLink="false">/?p=13137</guid>
		<description><![CDATA[連載： Frontrend Conference 特集 (2)本記事は、2015/2/21に行われた「Frontrend Conference」のファイナルセッション「Styling Atom(Editor)」の内容を紹...]]></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> (2)</div><p>本記事は、2015/2/21に行われた<a href="http://frontrend.github.io/conference/" target="_blanl" data-wpel-link="external" rel="follow external noopener noreferrer">「Frontrend Conference」</a>のファイナルセッション「Styling Atom(Editor)」の内容を紹介します。</p>

<h1>オーバービュー</h1>

<p>スピーカーはスイス生まれで、現在札幌で受託開発を行っている、<a href="http://simurai.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Simon（ニックネーム：Simurai）</a>さん、逐次通訳をHTML5 Experts.jpのエキスパートである<a href="https://html5experts.jp/cssradar/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">斉藤祐也</a>さんが努めました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/2shot.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/2shot.jpg" alt="2shot" width="640" height="480" class="aligncenter size-full wp-image-13144" srcset="/wp-content/uploads/2015/02/2shot.jpg 640w, /wp-content/uploads/2015/02/2shot-300x225.jpg 300w, /wp-content/uploads/2015/02/2shot-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>昨今、様々な企業サイトでのCSSの利用方法が公開されるようになってきました。<a href="http://css-tricks.com/css/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">CSS-Tricks（http://css-tricks.com/css/）</a>に代表的なサイトの一覧が紹介されています。このセッションについても、CSS-Tricksに習って、Atom EditorでどのようにCSSが利用されているかを紹介します。</p>

<p>尚、本記事は、セッションの内容をそのままレポートにしているのではなく、Simuraiさんのセッション内容を基に私の方で再構成した、イベントレポートとなっています。</p>

<h1>Atom Editorとは</h1>

<p>Atom Editorは、GitHubが中心となりオープンソースで開発されているhackable text editorです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/atom.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/atom.png" alt="atom" width="640" height="143" class="aligncenter size-full wp-image-13154" srcset="/wp-content/uploads/2015/02/atom.png 640w, /wp-content/uploads/2015/02/atom-300x67.png 300w, /wp-content/uploads/2015/02/atom-207x46.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<div style="text-align: right;"><small>引用元：<a href="https://atom.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://atom.io/</a></small></div>

<p><BR>
Atom EditorはWindowsやMac上で動作するデスクトップアプリケーションであり、普通にインストールして利用することができます。しかし、内部的には、HTML/CSS/JavaScriptで全て実装されていて、いわゆるハイブリッドアプリケーションになっています。</p>

<p>特徴は以下のとおり。</p>

<ul>
<li>Atom ShellとAtom Coreによるデスクトップアプリケーションである</li>
<li>アプリケーション自体はHTML/CSS/JavaScriptで実装されている</li>
<li>開発はGitHub上で行われている</li>
</ul>

<h3>Atom Shellについて</h3>

<p>Atom ShellはChromeのオープンソースプロジェクトであるChromiumと、Node.jsのForkプロジェクトであるio.js（もともはNode.jsを利用していたが、最近変わった）で構成された、ネイティブアプリケーションプラットフォームです。
Atom Shellの概念図は以下のとおり。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/atom-shell.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/atom-shell.png" alt="atom-shell" width="640" height="461" class="aligncenter size-full wp-image-13164" srcset="/wp-content/uploads/2015/02/atom-shell.png 640w, /wp-content/uploads/2015/02/atom-shell-300x216.png 300w, /wp-content/uploads/2015/02/atom-shell-207x149.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<div style="text-align: right;"><small>引用元：<a href="https://speakerdeck.com/zcbenz/practice-on-embedding-node-dot-js-into-atom-editor" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Practice on embedding Node.js into Atom Editor</a></small></div>

<p><BR>
BrowserというところがChromiumをベースにした部分であり、ネイティブアプリに必要なメニュー構築やダイアログ生成などを担当しています。また、Node.jsにてBrowserのネイティブAPIにアクセスできるインターフェースが用意されています。Renderer部分は、実際にアプリケーションの画面を描画したり、ロジックを組み込む部分であり、通常のWebアプリケーションと同じく、HTML、CSS、JavaScriptで実装することができます。JavaScriptについては、こちらもNode.jsが利用できます。</p>

<h3>Atom Coreについて</h3>

<p>Atom Shellの上にAtom Coreというメインのアプリケーションが存在します。Atom CoreはPackageというかたちで様々な機能を追加することができます。また、見た目についても、Themeというかたちで、様々に変更することが可能になっています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/packages_themes.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/packages_themes.png" alt="packages_themes" width="640" height="379" class="aligncenter size-full wp-image-13193" srcset="/wp-content/uploads/2015/02/packages_themes.png 640w, /wp-content/uploads/2015/02/packages_themes-300x178.png 300w, /wp-content/uploads/2015/02/packages_themes-207x123.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<div style="text-align: right;"><small>引用元：Simurai氏セッション映像より</small></div>

<p><BR>
PackageやThemeの開発を含めたAtomの開発は、GitHub上で行われていて、だれでも自由にCommitすることができます。</p>

<h1>ThemeでどのようにCSSが利用されているのか</h1>

<p>さて、ここから、セッションの本題に入っていきます。</p>

<h3>HEADエレメント</h3>

<p>まずは、<code>&lt;head&gt;</code>エレメントの中をご紹介します。このソースはAtom CoreのベースとなるHTMLファイルを簡略化したものです。</p>

<p></p><pre class="crayon-plain-tag">&lt;html&gt;
	&lt;head&gt;
		
		&lt;style source-path="bootstrap.less"&gt;&lt;/style&gt;
		&lt;style source-path="atom.less"&gt;&lt;/style&gt;
		
		&lt;style source-path="tree-view.less" priority="0"&gt;&lt;/style&gt;
		&lt;style source-path="tabs.less" priority="0"&gt;&lt;/style&gt;
		&lt;style source-path="status-bar.less" priority="0"&gt;&lt;/style&gt;
		&lt;!-- Many many more packages --&gt;
		
		&lt;style source-path="ui-theme.less" priority="1"&gt;&lt;/style&gt;
		
		&lt;style source-path=".atom/style.less" priority="2"&gt;&lt;/style&gt;

	&lt;/head&gt;
	&lt;body&gt;&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<div style="text-align: right;"><small>引用元：Simurai氏セッション資料</small></div>

<p><BR>
はじめに、<code>bootstrap.less（normalize.css含む）</code>を読み込み、次にCoreスタイルである<code>atom.less</code>、Packageのlessファイル（<code>tree-view.less</code>等）を読み込み、そして、Themeを構成する<code>ui-styles.less</code>を読み込みます。実際には、それぞれのLESSファイルはCSSにプロセスされて挿入されることになります。</p>

<p>これは、Atom Editorの画面上でインスペクタ（開発者コンソール）を表示させて確認したところです。CSSのコードが挿入されていることがわかると思います。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/head.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/head.png" alt="head" width="640" height="404" class="aligncenter size-full wp-image-13207" srcset="/wp-content/uploads/2015/02/head.png 640w, /wp-content/uploads/2015/02/head-300x189.png 300w, /wp-content/uploads/2015/02/head-207x131.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h3>UI Theme と Syntax Theme</h3>

<p>次に、Themeについて詳しく見ていきます。Themeには、UIとSyntaxの2つがあります。UI Themeはアプリ全体のスタイルを規定し、Syntax Themeはエディタ部分のスタイルやコードのシンタックスハイライトなどを規定しています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/ui_syntax.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/ui_syntax.png" alt="ui_syntax" width="640" height="354" class="aligncenter size-full wp-image-13221" srcset="/wp-content/uploads/2015/02/ui_syntax.png 640w, /wp-content/uploads/2015/02/ui_syntax-300x166.png 300w, /wp-content/uploads/2015/02/ui_syntax-207x114.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<div style="text-align: right;"><small>引用元：Simurai氏セッション資料</small></div>

<p><BR>
Themeのマークアップサンプルを見てみましょう。</p>

<p></p><pre class="crayon-plain-tag">&lt;html&gt;
	&lt;head&gt;
		&lt;style source-path="ui-theme.less" priority="1"&gt;&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;

		&lt;ol class="tree-view"&gt;&lt;/ol&gt;
		&lt;ul class="tab-bar"&gt;&lt;/ul&gt;
		&lt;status-bar&gt;&lt;/status-bar&gt;
		
		&lt;atom-text-editor&gt;
			#shadow-root ----
			&lt;style source-path="syntax-theme.less"&gt;&lt;/style&gt;
			&lt;div class="gutter"&gt;&lt;/div&gt;
			&lt;div class="lines"&gt;&lt;/div&gt;
			#end-of-shadow-root ---
		&lt;/atom-text-editor&gt;

	&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<div style="text-align: right;"><small>引用元：Simurai氏セッション資料</small></div>

<p><BR>
<code>ui-theme.less</code>としてUI ThemeのLESSファイルを読み込みます。そして、UIに必要なパーツを配置していきます。このサンプルでは、<code>tree-view</code>、<code>tab-bar</code>、<code>status-bar</code>、<code>atom-text-editor</code>というパーツが記載していますが、実際にはもっとたくさんのパーツがあります。</p>

<p>そして、<code>atom-text-editor</code>エレメントの中では、エディタ部分を構成するためのパーツと、コードのシンタックスハイライトのためのSyntax ThemeのLESSファイルを読み込んでいます。</p>

<p><code>atom-text-editor</code>エレメントはWeb Componentsの技術が利用されています。そのため、実際にはこのように<code>#shadow-root</code>が挿入されます。Web Componentsを利用することで、UI ThemeとSyntax Themeを明確に分ける構造になっています。これによって、スタイルの衝突やクラス名の衝突を避けることができます。</p>

<p><code>shadow-root</code>は実際には、以下のように挿入されます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/shadow-root.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/shadow-root.png" alt="shadow-root" width="640" height="174" class="aligncenter size-full wp-image-13227" srcset="/wp-content/uploads/2015/02/shadow-root.png 640w, /wp-content/uploads/2015/02/shadow-root-300x82.png 300w, /wp-content/uploads/2015/02/shadow-root-207x56.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h3>ONE Theme</h3>

<p>では、ONE Themeというテーマを例に、実際のThemeファイルの中身を少し見てみます。ONE Themeのソースコードは<a href="https://github.com/atom/one-dark-ui" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら（https://github.com/atom/one-dark-ui）</a>で確認できます。</p>

<p>Atom Editorはテーマを読み込む際に、<code>index.less</code>というファイルを最初に参照します。<code>index.less</code>は<code>@import</code>で関係するスタイルファイルを順次読み込んでいきます。いわゆる、ヘッダーファイルのような役割を担っています。この例ではフラットに記載されていますが、書き方は自由です。</p>

<p></p><pre class="crayon-plain-tag">// Atom UI Theme: One

@import (reference) "styles/ui-variables";
@import (reference) "styles/ui-mixins";
@import (reference) "octicon-mixins";

@import "styles/atom";
@import "styles/badges";
@import "styles/buttons";
@import "styles/editor";
@import "styles/git";
@import "styles/lists";
@import "styles/messages";
@import "styles/nav";
@import "styles/overlays";
@import "styles/panels";
@import "styles/panes";
@import "styles/progress";
@import "styles/tabs";
@import "styles/text";
@import "styles/tooltips";
@import "styles/tree-view";
@import "styles/utilities";

@import "styles/settings";
@import "styles/core";

@import "styles/_deprecated";</pre><p></p>

<p>スタイルファイルの中で注目すべきところは、カラーコードがハードコードされているわけではなく、全て変数として切りだされていることです。以下の例であれば、<code>@tab-text-color</code>などがそれに当たります。</p>

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

  .tab {
    position: relative;
    top: @tab-top-padding;
    max-width: @tab-max-width;
    min-width: @tab-min-width;
    height: @tab-height;
    line-height: @tab-height;
    padding: 0;
    margin: 0;
    color: @tab-text-color;
    background: @tab-background-color;
    border-right: @tab-border;
    opacity: @tab-inactive-transparency;
    transition: opacity .3s;
 :
 :</pre><p></p>

<p>切り出されたカラーコードは、<code>ui-variables.less</code>というファイルにまとめて記述されています。</p>

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

// Component Colors -------------------------------------

@app-background-color:             darken(@level-3-color, 2%);

@tree-view-background-color:       @level-3-color;
@tree-view-border-color:           @base-border-color;

@tab-background-color:             @level-3-color;
@tab-background-color-active:      @level-2-color;
@tab-bar-background-color:         @level-3-color;
@tab-bar-border-color:             @base-border-color;
@tab-border-color:                 @base-border-color;

 :
 :</pre><p></p>

<p>これらの色情報同士は互いに連携。ある１箇所を変更すると関係する箇所が合わせて変更されると共に、色同士の関係性を見て、一体感のある色調になるように自動的に調整されるようになっています。</p>

<p></p><pre class="crayon-plain-tag">@import "syntax-variables"

 :
 :

@ui-a:       hsl(252, 11%, 18%); // fallback
@ui-a:       @syntax-background-color;

// Goal: use @syntax-background-color if it's dark enough, otherwise use same hue but stay dark
// The light up by 100% is done to trick contrast() into picking one of 2 dark colors
@ui-a-h:     hue(@ui-a);
@ui-a-s:     min( saturation(@ui-a), 12%);
@ui-a-l:     luma(@ui-a) + 100%; // (1) light up
@ui-a-light: hsl(@ui-a-h, @ui-a-s, @ui-a-l); // (2) flashed color
@ui-a-color: contrast(@ui-a-light, @ui-a, hsl(@ui-a-h, @ui-a-s, 24%) ); // (3) use @ui-a if darker than 24%

 :
 :</pre><p></p>

<p>また、<code>ui-variables.less</code>では、Atom Editorで標準定義されているシンタックスハイライトのための色情報を、<code>syntax-variables</code>から読み込むことで、<code>@syntax-background-color</code>という変数をこのテーマのシンタックスハイライトカラーとして利用しています。</p>

<h3>Style Guide</h3>

<p>Atom Editorでは、だれでも、EditorのThemeを作ることが可能です。新しく作ってもいいし、既存のThemeをフォークしても構いません。Themeを新作る際の便利な機能として、Style GuideというPackageが標準搭載されています。</p>

<p>Style Guideを利用することで、Themeの中で規定されている色情報やClassの定義など全てを、視覚的にリアルタイムに確認することができます。</p>

<p>&lt;起動方法>
Packages > StyleGuide > Show</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/styleguide.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/styleguide.png" alt="styleguide" width="640" height="531" class="aligncenter size-full wp-image-13243" srcset="/wp-content/uploads/2015/02/styleguide.png 640w, /wp-content/uploads/2015/02/styleguide-300x249.png 300w, /wp-content/uploads/2015/02/styleguide-207x172.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/class.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/class.png" alt="class" width="640" height="502" class="aligncenter size-full wp-image-13244" srcset="/wp-content/uploads/2015/02/class.png 640w, /wp-content/uploads/2015/02/class-300x235.png 300w, /wp-content/uploads/2015/02/class-207x162.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Themeの作成やカスタマイズにはなくてはならないツールです。</p>

<h1>Atom Editorの悪い部分</h1>

<p>冒頭に紹介したCSS-Tricksのブログでは、よい点だけではなく、問題点なども合わせて取り上げられているため、とても参考になります。Atom Editorについても、それに習って、あえて悪い部分を取り上げてみます。</p>

<h3>1. どこにソースファイルがあるか分からない</h3>

<p>Atom Editorのインスペクタを表示するとわかると思いますが、CSSそのものへのリンクはありません。これは、LESSを動的にCSSに変換しているので、そもそもCSSファイルが存在しないためです。</p>

<p>また、以下のように、同じセレクタが複数存在するところがあります。それぞれPackageとThemeで定義されているのですが、どちらがどちらに定義されているのか、インスペクタを見ただけではわかりません。これは、Source mapを使えば解決できるかもしれませんが、現在のAtom Editorには含まれていません。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/same-selector.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/same-selector.png" alt="same-selector" width="640" height="173" class="aligncenter size-full wp-image-13249" srcset="/wp-content/uploads/2015/02/same-selector.png 640w, /wp-content/uploads/2015/02/same-selector-300x81.png 300w, /wp-content/uploads/2015/02/same-selector-207x56.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h3>2. CSSのネストが深い</h3>

<p>上記画像を見ると、Classのネストが3階層になっている事がわかると思います。このように、ネストが深い部分が多々あります。そのため、特定の属性を上書きしたい場合などは、Classのセレクタをネストの数だけ記載する必要が出てきます。</p>

<p>これは、セレクタを以下のように記載することで解決することができます。</p>

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

.Tabs {}
.Tabs-item {}
.Tabs-title {
	color: white;
}

// Benefit ----

.Tabs-title {
	color: red;

}</pre><p></p>

<div style="text-align: right;"><small>引用元：Simurai氏セッション資料</small></div>

<p><BR>
このようにセレクタを記載することで、以下の様な利点が生まれます。</p>

<ul>
<li>シングルClassでその値を上書きすることができる（上記Benefit参照）</li>
<li>名前空間を最小限にできるため、上位Classの変更に対する影響が下位Classに及ばない</li>
<li>マークアップの際にClassのネストの順番を意識しなくてよくなる</li>
<li>Classの検索性がよくなる</li>
</ul>

<h3>3. Atom Editor Version 1.0ローンチ間近…</h3>

<p>ではなぜ、Atom EditorでこのようなSUIT CSSやBEM CSSなどの設計ルールを取り入れないのか。実際に、GitHubのIssueでもそのような問い合わせがきています。</p>

<p>取り入れない理由は、Atom Editor Version 1.0のローンチが間近に迫っており、近々仕様凍結が予定されているためです。仕様が凍結されると、Classの命名規則含めてAPI仕様の大幅な変更ができなくなります。そのため、SUITやBEMなどの導入はVersion 2.0に向けて行う必要が出てきているのです。</p>

<h1>Atom Editorの未来</h1>

<p>Atom Editorに将来実装したい機能の１つとして、UIテーマのコントラストを周辺光に合わせて自動的に調整する機能が考えられています。</p>

<p>例えば、部屋の明かりが暗い時は、このように見やすいThemeですが…</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/dark.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/dark.png" alt="dark" width="640" height="386" class="aligncenter size-full wp-image-13255" srcset="/wp-content/uploads/2015/02/dark.png 640w, /wp-content/uploads/2015/02/dark-300x181.png 300w, /wp-content/uploads/2015/02/dark-207x125.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<div style="text-align: right;"><small>引用元：Simurai氏セッション映像より</small></div>

<p><BR>
部屋が明るくなると、画面への光の映り込みが起こり、見難くなりますよね。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/light.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/light.png" alt="light" width="640" height="381" class="aligncenter size-full wp-image-13256" srcset="/wp-content/uploads/2015/02/light.png 640w, /wp-content/uploads/2015/02/light-300x179.png 300w, /wp-content/uploads/2015/02/light-207x123.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<div style="text-align: right;"><small>引用元：Simurai氏セッション映像より</small></div>

<p><BR>
これを解決したいのです。</p>

<p>周辺光に合わせたUIテーマの自動調整は、W3Cで標準化が進んでいるlight-level MediaQueryを利用することで、実現することができると考えています。</p>

<p></p><pre class="crayon-plain-tag">// default
body {
	color: hsl(0,0%,70%);
}

// gets dark
@media {light-level: dim} {
	body {
		color: hsl(0,0%,48%);
	}
}

// gets bright
@media {light-level: washed} {
	body {
		color: hsl(0,0%,100%);
	}
}

// other pattern
@media {light-level: washed}{
	body {
	-webkit-filter: contrast(1,25) brightness(2);
	}

}</pre><p></p>

<div style="text-align: right;"><small>引用元：Simurai氏セッション映像より</small></div>

<p><BR>
このように記載することで、デバイスに搭載されている光学センサで周辺光を測定し、その値に応じて<code>body</code>エレメントの明るさを調整することができます。</p>

<p>また、明るくなった場合の別の調整手段として（上記other pattern参照）、<code>contrast</code>と<code>brightness</code>を利用して、画面全体のコントラストや明るさを一気に調整することもできます。しかしながら、これはパフォーマンスがよくない可能性もあるので、実装する際には注意が必要です。</p>

<h1>まとめ</h1>

<p>Simurai氏のセッションは、Atom Editorが『なぜhackable text editorなのか？』を、わかりやすく伝える面白い内容でした。興味を持たれた方は、是非、Atom Editorを自分色にカスタマイズしてみてください！</p>

<p>もっと詳しくAtom Editorについて聞きたい！知りたい！という方は、Twitterなどでご本人に質問してみるとよいでしょう。</p>

<div style="text-align: center;">
<a href="https://twitter.com/simurai" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@simurai &#8211; https://twitter.com/simurai</a>
<BR>
<a href="https://html5experts.jp/wp-content/uploads/2015/02/simurai-card.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/simurai-card-259x300.jpg" alt="simurai-card" width="259" height="300" class="aligncenter size-medium wp-image-13261" srcset="/wp-content/uploads/2015/02/simurai-card-259x300.jpg 259w, /wp-content/uploads/2015/02/simurai-card.jpg 552w, /wp-content/uploads/2015/02/simurai-card-179x207.jpg 179w" sizes="(max-width: 259px) 100vw, 259px" /></a>
</div>

<p><BR>
<BR>
Frontrend Conference特集はまだまだ続きます！</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/y_pkHOBy1Jc" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>
</div>
]]></content:encoded>
		
		<series:name><![CDATA[Frontrend Conference 特集]]></series:name>
	</item>
		<item>
		<title>キーワードは「CARE」！実践的なフロントエンドエンジニアを目指せ！─Frontrend Conference the Final基調講演レポート</title>
		<link>/shumpei-shiraishi/13130/</link>
		<pubDate>Thu, 26 Feb 2015 00:00:56 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[プロトタイピング]]></category>

		<guid isPermaLink="false">/?p=13130</guid>
		<description><![CDATA[連載： Frontrend Conference 特集 (1)この記事は、「Frontrend Conference The Final」の基調講演「Pragmatic Front-end Developer: From...]]></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> (1)</div><p>この記事は、「Frontrend Conference The Final」の基調講演「Pragmatic Front-end Developer: From Artisan to Expert」についてのレポートです。</p>

<p>登壇されていたのはリッチメディアの斉藤祐也さん。<a href="https://html5experts.jp/cssradar/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Experts.jpでも、No.10のエキスパートとして何度もご執筆いただいている</a>ので、ご存じの方も多いかと思います。</p>

<p><img src="/wp-content/uploads/2015/02/ssDSC00145.jpg" alt="" width="600" height="413" class="aligncenter size-full wp-image-13189" srcset="/wp-content/uploads/2015/02/ssDSC00145.jpg 600w, /wp-content/uploads/2015/02/ssDSC00145-300x207.jpg 300w, /wp-content/uploads/2015/02/ssDSC00145-207x142.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p>この講演タイトルは、アンドリュー・ハント氏の著作「<a href="https://pragprog.com/the-pragmatic-programmer" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">The Pragmatic Programmer</a>」をオマージュしたとのこと。「Pragmatic」というのは「実践的」という意味の単語で、フロントエンドという広大な分野における道標となるような、実践的なノウハウをたくさん紹介していました。</p>

<p>この記事は、斉藤さんの講演を聴講した筆者が、自分なりの言葉で内容をまとめてみたものになります（斉藤さんの言葉をそのまま書き起こしたわけではありません）。この講演のスライドは<a href="https://speakerdeck.com/studiomohawk/pragmatic-front-end-developer-from-artisan-to-expert" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Speaker Deckにて公開中</a>です。そちらも合わせてご覧いただければ、より理解が深まるかと思います。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/c5e938306ec698fa5803cc4f8bc59caa.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/c5e938306ec698fa5803cc4f8bc59caa-640x480.jpg" alt="pragamatic-frontend-developer.frontrend.yuya-saito_ページ_001" width="600" height="450" class="aligncenter size-large wp-image-13169" srcset="/wp-content/uploads/2015/02/c5e938306ec698fa5803cc4f8bc59caa.jpg 640w, /wp-content/uploads/2015/02/c5e938306ec698fa5803cc4f8bc59caa-300x225.jpg 300w, /wp-content/uploads/2015/02/c5e938306ec698fa5803cc4f8bc59caa-207x155.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<h2>キーワードは「CARE」！</h2>

<p>この講演におけるキーワードは、以下のトピックの頭文字を取って「<strong>CARE</strong>」。講演自体も、以下のトピックの順番に沿って進められていましたので、この記事もその流れに沿って書いていきたいと思います。</p>

<ul>
<li>Be Collaborative (問題は人と人の間にある)</li>
<li>Be Adaptive (変化に対して寛容に)</li>
<li>Be Responsible (作ったものに対して責任を持つ)</li>
<li>Be (an) Expert (知ることに対して貪欲に)</li>
</ul>

<h2>Be Collaborative (問題は人と人の間にある)</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/f5856151fe698c647dc436b83ef47226.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/f5856151fe698c647dc436b83ef47226-640x480.jpg" alt="pragamatic-frontend-developer.frontrend.yuya-saito_ページ_007" width="600" height="450" class="aligncenter size-large wp-image-13170" srcset="/wp-content/uploads/2015/02/f5856151fe698c647dc436b83ef47226.jpg 640w, /wp-content/uploads/2015/02/f5856151fe698c647dc436b83ef47226-300x225.jpg 300w, /wp-content/uploads/2015/02/f5856151fe698c647dc436b83ef47226-207x155.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>HTML, CSS, JavaScriptといった技術は、専門家でなくても書けてしまうという気軽さがある代わりに、メンテナンス性に優れているとは言えません。ただ、そうしたテクノロジーは日進月歩です。メンテナンス性に欠ける、という弱点を補足すべく、様々な進化を続けています。そうした状況においては、コラボレーションにおける問題はテクノロジーそのものではなく、人と人の間にあるのです。</p>

<p>例えばコラボレーションを円滑に行うためには、コードスタイルのガイドラインが必要です。理想は、一つのコードベース上のコードは、一人の人間がタイプしたかのように見えること。そうした理想を追求するためのスタイルガイドとして、以下のようなことが挙げられます。</p>

<h3>JavaScriptのコードスタイルガイド</h3>

<p>JavaScriptのコードスタイルガイドについては、以下を参照するとよいでしょう。</p>

<ul>
<li><a href="https://github.com/rwaldron/idiomatic.js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">idiomatic.js</a></li>
<li><a href="http://contribute.jquery.org/style-guide/js/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">jQuery Core Style Guidline</a></li>
<li><a href="https://github.com/airbnb/javascript" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Airbnb JavaScript Style Guide</a></li>
</ul>

<h3>CSSのコードスタイルガイド</h3>

<p>CSSのコードスタイルガイドは、以下に挙げられたことが参考になります。これらのうち、どのガイドラインが優れているか、は問うべきものではありません。「自分たちのプロジェクトに、スタイルガイドが存在する」ということがまずは大事なのです（実際、セッション参加者に「コードスタイルガイドラインをお持ちの方」を聞いたら、1割程度だったそうです）。もしないのなら、これらを元に自分たちなりのガイドラインを定義するとよいでしょう。</p>

<ul>
<li><a href="https://github.com/necolas/idiomatic-css" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">idiomatic.css</a></li>
<li><a href="http://cssguidelin.es/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Guidelines</a></li>
<li><a href="http://sass-guidelin.es/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Sass Guidelines</a></li>
<li><a href="http://codeguide.co/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Code Guide</a></li>
</ul>

<h3>コードスタイルチェックを自動化するツールたち</h3>

<p>上記のようなコードスタイルガイドラインに準拠しているかどうかを、人間が目で見てチェックするのは容易ではありませんし、時間の無駄です。「貴重なレビューの時間を、コードスタイルチェックに費やしてはいけない」という斉藤さんの言葉は、非常に重みがありました。</p>

<ul>
<li><a href="http://editorconfig.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">EditorConfig</a></li>
<li><a href="http://jscs.info/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JSCS</a></li>
<li><a href="http://csslint.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS LINT</a></li>
<li><a href="http://csscomb.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSScomb</a></li>
</ul>

<h3>包括的なスタイルガイド</h3>

<p>また様々な企業が、自分たちが使っている包括的なスタイルガイドを公開しています。上記のコードスタイルガイドよりもより粒度が粗く、実際のユースケースに沿った形で定義されていることも多いので、参考にするとよいでしょう。</p>

<ul>
<li><a href="https://github.com/styleguide" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GitHub styleguide</a></li>
<li><a href="http://www.starbucks.com/static/reference/styleguide/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Starbucks style guide</a></li>
<li><a href="http://mailchimp.com/about/style-guide/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MailChimp Style Guide</a></li>
<li><a href="http://styleguides.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Website Style Guide Resources</a></li>
</ul>

<h3>ドキュメンテーションのためのツール</h3>

<p>また開発者であれば、「ドキュメントは嘘をつく」という言葉には、深く同意せざるを得ないでしょう。
日々変更されていくソースコードに対して、ドキュメントはどうしても更新が追いつかないという状況に陥りがちです。以下のツールは、CSSのドキュメンテーションツールのうち代表的なものです。これらのツールを使えば、コードとドキュメントが、常に同期されているという理想的な状況を目指すことができます。</p>

<ul>
<li><a href="http://warpspire.com/kss/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">KSS</a></li>
<li><a href="https://github.com/kss-node/kss-node" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">KSS Node</a></li>
<li><a href="http://trulia.github.io/hologram/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">hologram</a></li>
</ul>

<h3>プロトタイピングに役立つツール</h3>

<p>また、コラボレーションを行う上で重要なのは「実際に見えるもの、動くものに対しての意見は言いやすい」ということです。貴重な時間をムダにしないためにも、まずはさっさと動くプロトタイプを作ってしまい、それを元に議論を進めましょう。</p>

<p>斉藤さんがオススメする「プロトタイピングに役立つツール」は以下になります。</p>

<ul>
<li><a href="http://www.browsersync.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">BrowserSync</a>・・・コードとブラウザ、もしくは異なるデバイス上で実行中のブラウザの状態を同期してくれます。開発時の結果確認が非常に迅速になるだけではなく、デバッグやプロトタイピングの用途にも活躍します。</li>
<li><a href="http://jsbin.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JS Bin</a>・・・HTML/CSS/JavaScriptのコードをWebブラウザ上で記述し、共有できるサービスです。</li>
<li><a href="https://www.google.co.jp/chrome/browser/canary.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Chrome Canary</a>・・・言わずと知れた、Google Chromeの最新＆安定性が保証されていないバージョン。斉藤さんによれば、「打ち合わせ中、ブラウザでダイレクトにお客様のご要望をコーディングしていき、その反応を得るのはとても楽しい時間」とのこと。</li>
</ul>

<h2>Be Adaptive(変化に対して寛容に)</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/4e818ac1f8037a1182f041c02cf047f4.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/4e818ac1f8037a1182f041c02cf047f4-640x480.jpg" alt="pragamatic-frontend-developer.frontrend.yuya-saito_ページ_055" width="600" height="450" class="aligncenter size-large wp-image-13171" srcset="/wp-content/uploads/2015/02/4e818ac1f8037a1182f041c02cf047f4.jpg 640w, /wp-content/uploads/2015/02/4e818ac1f8037a1182f041c02cf047f4-300x225.jpg 300w, /wp-content/uploads/2015/02/4e818ac1f8037a1182f041c02cf047f4-207x155.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>様々なスクリーンサイズやデバイス上でWebサイトが利用されることは既に当たり前で、プログレッシブ・エンハンスメントの重要性はこれまでも何度も取り沙汰されてきました。</p>

<p>斉藤さんはプログレッシブ・エンハンスメントの考え方について、エスカレーターの例えを用いて説明されていました（とてもわかりやすい！）。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/c7a8a1315e93006c17345d8d4b30b420.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/c7a8a1315e93006c17345d8d4b30b420-640x480.jpg" alt="pragamatic-frontend-developer.frontrend.yuya-saito_ページ_057" width="600" height="450" class="aligncenter size-large wp-image-13172" srcset="/wp-content/uploads/2015/02/c7a8a1315e93006c17345d8d4b30b420.jpg 640w, /wp-content/uploads/2015/02/c7a8a1315e93006c17345d8d4b30b420-300x225.jpg 300w, /wp-content/uploads/2015/02/c7a8a1315e93006c17345d8d4b30b420-207x155.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>エスカレーターは、例え止まってしまったとしても階段として機能するため、「違う階に人を運ぶ」という機能自体が失われることはありません。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/7dabe12f4a6b81ef9917fc52a61109a9.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/7dabe12f4a6b81ef9917fc52a61109a9-640x480.jpg" alt="pragamatic-frontend-developer.frontrend.yuya-saito_ページ_058" width="600" height="450" class="aligncenter size-large wp-image-13173" srcset="/wp-content/uploads/2015/02/7dabe12f4a6b81ef9917fc52a61109a9.jpg 640w, /wp-content/uploads/2015/02/7dabe12f4a6b81ef9917fc52a61109a9-300x225.jpg 300w, /wp-content/uploads/2015/02/7dabe12f4a6b81ef9917fc52a61109a9-207x155.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>一方エレベーターは、止まってしまうとただの箱。この違いが、プログレッシブ・エンハンスメントを実践しているサイトとそうでないサイトの差に近いものがあります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/724ce3db0cc07fff482f7603255b14ff.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/724ce3db0cc07fff482f7603255b14ff-640x480.jpg" alt="pragamatic-frontend-developer.frontrend.yuya-saito_ページ_059" width="600" height="450" class="aligncenter size-large wp-image-13174" srcset="/wp-content/uploads/2015/02/724ce3db0cc07fff482f7603255b14ff.jpg 640w, /wp-content/uploads/2015/02/724ce3db0cc07fff482f7603255b14ff-300x225.jpg 300w, /wp-content/uploads/2015/02/724ce3db0cc07fff482f7603255b14ff-207x155.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>なぜこれほどまでにプログレッシブ・エンハンスメントが重要かというと、Webは（ある形の決まった）プラットフォームではなく、継続して変化し続けているあやふやなものだからです。ブラウザも、デバイスも、ネットワークも、将来的には全く違ったものになっているかもしれないのです。</p>

<p>この変化し続けている環境では、しっかりと自分の哲学を持ってディテールにこだわりを持ちつつも、前提条件が変わった時にそのこだわりを潔く捨て去ることが、優秀なエンジニアには求められているのです。</p>

<h2>Be Responsible(作ったものに対して責任を持つ)</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/b05481924456678624ec5ab09998a4ad.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/b05481924456678624ec5ab09998a4ad-640x480.jpg" alt="pragamatic-frontend-developer.frontrend.yuya-saito_ページ_086" width="600" height="450" class="aligncenter size-large wp-image-13175" srcset="/wp-content/uploads/2015/02/b05481924456678624ec5ab09998a4ad.jpg 640w, /wp-content/uploads/2015/02/b05481924456678624ec5ab09998a4ad-300x225.jpg 300w, /wp-content/uploads/2015/02/b05481924456678624ec5ab09998a4ad-207x155.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>そして、これまで紹介してきた様々なスタイルガイド、ツール、プログレッシブ・エンハンスメントといったものは、技術者が自分の作ったものに対して責任を持つために必要不可欠なものです。</p>

<p>Webという常に進化し続ける環境において堅牢なプロダクトを作ること、そしてその堅牢さに常に疑問を抱き、「もし」をしつこいくらい重ねること。それらを手助けするのが上記のツールだというわけです。</p>

<p>また、プロダクトの堅牢さという点では、パフォーマンスは非常に重要です。例えば<a href="http://www.filamentgroup.com/lab/mv-initial-load-times.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">著名なMVCフレームワークがパフォーマンスに与える影響を調べたこちらの記事</a>によれば、初回ロードにかかる時間が1,000msを下回ったものはなかったそうです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/6985196edd93dc3369438bc682c37fc4.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/6985196edd93dc3369438bc682c37fc4-640x480.jpg" alt="pragamatic-frontend-developer.frontrend.yuya-saito_ページ_105" width="600" height="450" class="aligncenter size-large wp-image-13176" srcset="/wp-content/uploads/2015/02/6985196edd93dc3369438bc682c37fc4.jpg 640w, /wp-content/uploads/2015/02/6985196edd93dc3369438bc682c37fc4-300x225.jpg 300w, /wp-content/uploads/2015/02/6985196edd93dc3369438bc682c37fc4-207x155.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>Webアプリのパフォーマンス改善に関する取り組みは、様々なところで行われていて、例えば<a href="http://emberjs.com/blog/2014/12/22/inside-fastboot-the-road-to-server-side-rendering.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ember.jsはfastboot</a>という仕組みを提唱していたり、Flipboardが採用した<a href="https://github.com/Flipboard/react-canvas" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">React-Canvas</a>は、ReactによってDOMではなくCanvasにレンダリングするという仕組みで、ネイティブと比べても遜色ないくらい高速な描画を実現しているそうです（ただし、当然ながらアクセシビリティは一切考慮されておらず、それが議論を呼んでいるとのこと）。</p>

<h2>Be (an) Expert(知ることに対して貪欲に)</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/6fad2dbb6004bf4777e0ffba0c5a83fe.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/6fad2dbb6004bf4777e0ffba0c5a83fe-640x480.jpg" alt="pragamatic-frontend-developer.frontrend.yuya-saito_ページ_112" width="600" height="450" class="aligncenter size-large wp-image-13177" srcset="/wp-content/uploads/2015/02/6fad2dbb6004bf4777e0ffba0c5a83fe.jpg 640w, /wp-content/uploads/2015/02/6fad2dbb6004bf4777e0ffba0c5a83fe-300x225.jpg 300w, /wp-content/uploads/2015/02/6fad2dbb6004bf4777e0ffba0c5a83fe-207x155.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>「CARE」の最後は、「エキスパートになろう」ということ（HTML5 Experts.jpとしては、応援すべきフレーズとしか言いようがありません）。以下の様なことを普段から心がけて常に知識を取り込み、エキスパートを目指しましょう。</p>

<ul>
<li>「できない」と言わない。オプションを提示する。</li>
<li><a href="http://ja.wikipedia.org/wiki/%E5%89%B2%E3%82%8C%E7%AA%93%E7%90%86%E8%AB%96" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">壊れ窓</a>の中で仕事をしない</li>
<li>「十分」がいつなのかを知る</li>
<li>知識を増やすための時間を定常的に設ける</li>
</ul>

<h2>フロントエンドはこれからも重要であり続ける！</h2>

<p>講演の最後に、斉藤さんは「フロントエンドはこれからもWebに必要とされるのか？」という問いかけに対して「YES!」と力強く答えていました。</p>

<p>Webという環境は変化しますし、ビジネスの世界もめまぐるしく動いている中、フロントエンド技術者の仕事もどんどん変化していくことは避けられません。ですが、「フロントエンド」という分野の重要性そのものは、これからも高まり続けることでしょう。</p>

<div id="attachment_13178" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/02/7b7ed4a53ba8c517dfde08b6ef0f6f60.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/7b7ed4a53ba8c517dfde08b6ef0f6f60-640x480.jpg" alt="フロントエンドはどこにもいかない！" width="600" height="450" class="size-large wp-image-13178" srcset="/wp-content/uploads/2015/02/7b7ed4a53ba8c517dfde08b6ef0f6f60.jpg 640w, /wp-content/uploads/2015/02/7b7ed4a53ba8c517dfde08b6ef0f6f60-300x225.jpg 300w, /wp-content/uploads/2015/02/7b7ed4a53ba8c517dfde08b6ef0f6f60-207x155.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a><p class="wp-caption-text">フロントエンドはどこにもいかない！</p></div>

<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/1aG11H476rg" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>
</div>
]]></content:encoded>
		
		<series:name><![CDATA[Frontrend Conference 特集]]></series:name>
	</item>
	</channel>
</rss>
