<?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>CSSグリッドレイアウト &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/CSSグリッドレイアウト/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>これからのCSSはmargin禁止！？CSSグリッドレイアウトやコンポーネント指向なCSSについて、矢倉さんに聞いてきた！</title>
		<link>/shumpei-shiraishi/24439/</link>
		<pubDate>Thu, 26 Oct 2017 01:00:56 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSSグリッドレイアウト]]></category>
		<category><![CDATA[コンポーネント指向]]></category>

		<guid isPermaLink="false">/?p=24439</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (1)こんにちは、編集長の白石です。 この記事は、9月24日に開催されたHTML5 Conference 2017に登壇したエキスパートに、お話されたセッションのト...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (1)</div><p>こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催された<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇したエキスパートに、お話されたセッションのトピックを中心に語っていただこうとういものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、ピクセルグリッドの矢倉眞隆さんです。</p>

<p><img src="/wp-content/uploads/2017/10/42A5186.jpg" alt="" width="640" height="407" class="alignnone size-full wp-image-24601" srcset="/wp-content/uploads/2017/10/42A5186.jpg 640w, /wp-content/uploads/2017/10/42A5186-300x191.jpg 300w, /wp-content/uploads/2017/10/42A5186-207x132.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>矢倉さんのセッション「まあまあ最近のCSSとつらくならないための書き方」に関するスライド資料は、<a href="https://www.icloud.com/keynote/0Tm2zsT-akCttR18KadkNjkbA#html5j_2017_CSS" rel="noopener follow external noreferrer" target="_blank" data-wpel-link="external">こちら</a>で公開されています。</p>

<h2>インパクト大！CSSグリッドレイアウト概要</h2>

<p><b class="speaker siraisi">白石:</b> では、まずは簡単に自己紹介をお願いできますか？</p>

<p><b class="speaker yakura">矢倉:</b> 昨年（2016年）から、<a href="https://www.pxgrid.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ピクセルグリッド</a> という会社で働いています。役割としては、<a href="https://www.codegrid.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CodeGrid</a>というフロントエンド向けメディアの運営を担当しています。</p>

<p>CodeGridは自社のメディアなので、技術的なチャレンジなどを行いやすいんです。なので今回のHTML5 Conferenceのセッションでは、CodeGridでの経験を基に、<strong>今後のWeb制作においてCSSの書き方がどう変わっていくか</strong>をお話ししました。</p>

<p><b class="speaker siraisi">白石:</b> 具体的には、どんなチャレンジを行ったんですか？</p>

<p><b class="speaker yakura">矢倉:</b> <strong>CSSグリッドレイアウト</strong>を使ってみたんです。</p>

<p>ページのレイアウトを行う方法は、古くはtableを使ったものからfloatを使った手法、最近だとFlexboxを使ったものまで、様々な手法が使われてきました。グリッドレイアウトは、そうしたレイアウトテクニックの中でも最も新しくて、CSSの書き方を一変させる可能性のある仕様だと思います。</p>

<p><b class="speaker siraisi">白石:</b> それほどインパクトのある仕様なんですね。CSSグリッドレイアウトについて、まずは概要を教えていただけますか？</p>

<p><b class="speaker yakura">矢倉:</b> グリッドレイアウト自体は、実は結構古くから提案されている仕様なんです。2000年代前半にマイクロソフトが提案していて、ベンダープレフィックス付きの実装はInternet Explorer 10から提供されていました。</p>

<p>どのような仕様かというと、名前の通り、CSSでグリッドベース（格子状）のレイアウトを可能にするものです。</p>

<p>CSSでグリッドレイアウトを行うためのフレームワークは、これまでも数え切れないほど提案されてきました。ニーズは非常に高かったんですね。ただ、標準として提供されている機能はなかったため、いろいろと不便なシーンもありました。グリッドを実現するために不要な<code>div</code>要素を数多く書く必要があったり、機能が高くなかったり…。</p>

<p>Sketchなどのプロトタイピングツールで行ったデザインを、Webデザインで再現するのが難しいのも、グリッドの機能がWebに足りなかったという理由が大きいと思っています。</p>

<p>そうしたグリッドレイアウトの機能を標準で提供するのがCSSグリッドレイアウトなんです。</p>

<p><b class="speaker siraisi">白石:</b> なるほど。歴史もニーズもある、待ち望まれた機能ということですね。ブラウザが標準でサポートすることで、どういうメリットがあるんでしょうか？</p>

<p><b class="speaker yakura">矢倉:</b> まず、レイアウト用の余計な<code>div</code>が減ります。またこれは憶測でしかないのですが、ブラウザがグリッドレイアウトの処理を最適化できれば、floatなどのレイアウトなどと比べ、パフォーマンスの向上も期待できるかもしれません。</p>

<p>あと、マークアップもよりシンプルになると思いますね。要素をグリッド内に自在に配置できるので、<strong>DOMの順序にそれほど左右されずにレイアウトができる</strong>んです。</p>

<p><b class="speaker siraisi">白石:</b> それは素晴らしい。今までは、どうしてもマークアップがどうしてもUIデザインに引きずられちゃう場面もありましたものね。</p>

<p><b class="speaker yakura">矢倉:</b> 実際には、グリッドのアイテムに指定できるのはグリッドコンテナ直下の要素に限られていたりするので、マークアップ上の制約が全くないわけではないですけどね。ただ、レイアウト用の<code>div</code>要素を記述する場面はかなり減って、より素直なマークアップがやりやすくはなったな、と思います。</p>

<p><b class="speaker siraisi">白石:</b> CSSグリッドレイアウトは、現在どれくらいのブラウザが対応しているんですか？</p>

<p><b class="speaker yakura">矢倉:</b> メジャーブラウザはほとんど対応済みで、Firefox, Chrome, Safariの最新版は全て対応しています。Edgeは、先日のWindows 10 Fall Creators Updateで対応しました。IE/Edgeは、古いプレフィックス付きのバージョンをサポートしていますで対応しています。</p>

<p>特に、Safariが10.1から対応したのは大きいですね。iOSでもかなりの割合で使えるようになったので、モバイルブラウザでの対応が大きく進みました。</p>

<p><b class="speaker siraisi">白石:</b> かなり新しい技術かと思ってましたが、もう使えるブラウザはかなり多いんですね。</p>

<p><b class="speaker yakura">矢倉:</b> はい、<a href="https://caniuse.com/#feat=css-grid" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Can I Useの結果</a>を見ると、世界全体で見ると75% (プレフィックス付きを除くと69%) のブラウザで利用できるようです。</p>

<p>ちなみに<strong>Can I Useには、Google Analyticsと連動させる機能がある</strong>んです。そうすると、サイトを利用しているブラウザの統計から、そのサイトに限定した結果を得ることができます。</p>

<p>私が担当しているCodeGridは開発者向けの媒体で、新しめのデバイスやOSを利用してらっしゃる方が多いので、グリッドレイアウトが利用可能なユーザーの割合が実に95%以上に上りました。これが、私がCodeGridでグリッドレイアウトを試してみようと思った理由の一つでもあります。</p>

<div id="attachment_24440" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/18c7a981d2115a93a1396e63ac8949ad-640x360.png" alt="Can I UseでのCSSグリッドレイアウト利用可能率" width="640" height="360" class="size-large wp-image-24440" srcset="/wp-content/uploads/2017/10/18c7a981d2115a93a1396e63ac8949ad.png 640w, /wp-content/uploads/2017/10/18c7a981d2115a93a1396e63ac8949ad-300x169.png 300w, /wp-content/uploads/2017/10/18c7a981d2115a93a1396e63ac8949ad-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Can I UseでのCSSグリッドレイアウト利用可能率</p></div>

<p><b class="speaker siraisi">白石:</b> Can I Use、そんな機能あったんですね…！知りませんでした。</p>

<h2>CSSグリッドレイアウトのつかいかた</h2>

<p><b class="speaker siraisi">白石:</b> では、グリッドレイアウトを使ったスタイリングの方法を教えてください。</p>

<p><b class="speaker yakura">矢倉:</b> はい。実は、基本的な使い方はかなり簡単です。</p>

<p>まず基本的な考え方としては、グリッドレイアウトは<strong>まずグリッドの線を引いてから、そこに要素をあてがっていく</strong>という流れになります。</p>

<p>例えば、ヘッダー領域とコンテンツ領域を持つ、以下のようなレイアウトを行いたいとしますよね。</p>

<p><img src="/wp-content/uploads/2017/10/27339001b8780733fea899fad178dbdd-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24441" srcset="/wp-content/uploads/2017/10/27339001b8780733fea899fad178dbdd.png 640w, /wp-content/uploads/2017/10/27339001b8780733fea899fad178dbdd-300x169.png 300w, /wp-content/uploads/2017/10/27339001b8780733fea899fad178dbdd-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>で、このようにマークアップされていたとします。</p>

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

<p>まずグリッドレイアウトを行うには、レイアウトのコンテナとなる要素に対して<code>display: grid;</code>を指定します。</p>

<p></p><pre class="crayon-plain-tag">.layout {
  display: grid;
}</pre><p></p>

<p>次にグリッド線を引いていきましょう。まずは縦線（列）の定義です。今回は、左右に固定で50pxを確保し、残りがコンテンツの幅になるように指定します。</p>

<p>以下のように指定します。</p>

<p></p><pre class="crayon-plain-tag">.layout {
  grid-template-columns: 50px 1fr 50px;
}</pre><p></p>

<p>これで、以下のようなグリッド線を定義したことになります。</p>

<p><img src="/wp-content/uploads/2017/10/315ecb8c1d48292a2863a530ea365fa3-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24443" srcset="/wp-content/uploads/2017/10/315ecb8c1d48292a2863a530ea365fa3.png 640w, /wp-content/uploads/2017/10/315ecb8c1d48292a2863a530ea365fa3-300x169.png 300w, /wp-content/uploads/2017/10/315ecb8c1d48292a2863a530ea365fa3-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>次は横線（行）を引いていきましょう。ヘッダーに30px、フッターに150pxを確保して、残りがコンテンツの高さになるようにします。</p>

<p></p><pre class="crayon-plain-tag">.layout {
  grid-template-rows: 30px 1fr 150px;
}</pre><p></p>

<p>これで、横方向のグリッド線も引くことができました。</p>

<p><img src="/wp-content/uploads/2017/10/3cdbdf8855ffaf001d5c8937be66b7ab-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24442" srcset="/wp-content/uploads/2017/10/3cdbdf8855ffaf001d5c8937be66b7ab.png 640w, /wp-content/uploads/2017/10/3cdbdf8855ffaf001d5c8937be66b7ab-300x169.png 300w, /wp-content/uploads/2017/10/3cdbdf8855ffaf001d5c8937be66b7ab-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>あとは、完成したグリッドに要素を割り当てていきます。グリッド線にはそれぞれ1から始まる（末尾から数える場合は-1から始まる）番号が自動で割り振られるので、それぞれの要素の開始位置と終了位置を指定します。</p>

<p><img src="/wp-content/uploads/2017/10/e4dc8deb662f4870d06125dd64cee6b1-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24444" srcset="/wp-content/uploads/2017/10/e4dc8deb662f4870d06125dd64cee6b1.png 640w, /wp-content/uploads/2017/10/e4dc8deb662f4870d06125dd64cee6b1-300x169.png 300w, /wp-content/uploads/2017/10/e4dc8deb662f4870d06125dd64cee6b1-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p></p><pre class="crayon-plain-tag">/* 1行目はヘッダー */
.header {
  grid-row-start: 1;
  grid-row-end: 2;
  grid-column: 1 / -1;
}
/* 2行目の真ん中がコンテンツ */
.content {
  grid-row: 2 / 3;
  grid-column: 2 / -2;
}</pre><p></p>

<p>これが基本的な使い方で、他にも、グリッドの範囲に名前を付けて要素を配置することもできたりします。</p>

<h2>コンポーネント指向の時代に備えてスタイリングしよう！</h2>

<p><b class="speaker siraisi">白石:</b> では、先ほどおっしゃっていた <strong>今後のWeb制作においてCSSの書き方がどう変わっていくか</strong>というのは、具体的にはどのようなことでしょうか？</p>

<p><b class="speaker yakura">矢倉:</b> 結論から言うと、<strong>グリッドレイアウトを使ってみた結果、コンポーネント指向なWebアプリ開発に通じるところがとても大きい</strong>と感じたんです。</p>

<p><b class="speaker siraisi">白石:</b> コンポーネント指向というと、Web ComponentsやReactでいうコンポーネントでしょうか？</p>

<p><b class="speaker yakura">矢倉:</b> はい、そうです。順を追ってお話しますね。</p>

<p>まず、私は既存のWebページ（CodeGrid）を修正してグリッドレイアウトを使うように見直していました。つまり、既存のスタイル定義がたくさん存在する状態です。</p>

<p>そしてグリッドレイアウトを行うには、先ほどお話ししたように、グリッドを先に定義してそこに要素を当てはめていきます。</p>

<p>ただ、<strong>グリッドに要素をぴったり沿わせるためには、個々の要素に既に当たっているマージンが邪魔だった</strong>んですよ。</p>

<p><b class="speaker siraisi">白石:</b> なるほど。個々の要素がそれぞれバラバラにマージンを持っていたら、グリッド内の余白もチグハグになってしまいそう。</p>

<p><b class="speaker yakura">矢倉:</b> そうなんです。</p>

<p>グリッド内の個々の要素がマージンを持つんじゃなくて、グリッドのセルにあたる要素がパディングを使って余白を指定するほうが柔軟だし、管理もしやすいんです。</p>

<p>ただ、既存のWebページ上にはマージンの指定って至るところにあって、それらを見直していくのはなかなか大変な作業になるなと気づきました。</p>

<p><img src="/wp-content/uploads/2017/10/42A5192.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24615" srcset="/wp-content/uploads/2017/10/42A5192.jpg 640w, /wp-content/uploads/2017/10/42A5192-300x200.jpg 300w, /wp-content/uploads/2017/10/42A5192-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> 確かに、マージンって位置合わせのために、結構カジュアルに使いますものね。</p>

<p><b class="speaker yakura">矢倉:</b> ここから得た学びが、「グリッドレイアウトを使う際には、個々の要素にマージンを指定するのは良くない」ということでした。</p>

<p>でも、そこからさらに考えを進めると、グリッドレイアウトだけではなく、コンポーネント指向なWebデザイン全般にも適用できる考え方じゃないかと思えてきたんです。つまり、「<strong>個々のコンポーネントにマージンを指定するのは良くない</strong>」ということです。</p>

<p><b class="speaker siraisi">白石:</b> グリッドレイアウトにすると、DOMの順序からも解き放たれるくらい、グリッドの要素の独立性が高まる。だから結局それらが「コンポーネント」として独立したものと見なせるようになったということかもしれませんね。</p>

<p><b class="speaker yakura">矢倉:</b> そうです。グリッドの要素それぞれをコンポーネントと見なすようになると、要素間の空白も含めて、その配置はコンポーネントのコンテナに全て任せるべきなんです。コンポーネントの責任範囲はその内側だけに絞るべきで、その「外側」であるマージンをコンポーネント自身がコントロールすべきじゃない。</p>

<p><b class="speaker siraisi">白石:</b> なるほど…つまり、<strong>コンポーネント時代のCSSではマージンの指定を禁止する</strong>というくらいやっちゃってもいいのかもしれませんね。</p>

<p><b class="speaker yakura">矢倉:</b> はい、そこまで徹底したルールにして、CSS Lint (CSSスタイルのチェックツール)とかで禁止しちゃってもいいかな、位に思っています。</p>

<p>コンポーネント間の空白については、その外側の要素がパディングで指定するようにすればいい。実際には<code>p</code>要素の空白など、<code>margin</code>を使わないとうまく指定できないものも存在しますので、「コンポーネントの外側にマージンを指定するのは禁止」くらいのルールになるかな、とは思いますけどね。</p>

<p>ついでに言うと、<strong>メディアクエリもコンポーネント指向には向きません</strong>。メディアクエリを使うと、「コンポーネント自身がメディアに応じてスタイルを変える」というCSSをカジュアルに書けすぎてしまうんです。それだと、コンポーネントを別の場面で再利用しようと思った時に、使いづらいものになってしまいがちです。</p>

<p>コンポーネント自身は、（コンテナに）流し込まれるものであるべき。自身が幅いっぱいに広がるものとしてデザインすべきだと思います。</p>

<p><b class="speaker siraisi">白石:</b> 確かに、理にかなってますね。でも、ぼく今でもマージン使いまくりだなあ…(汗)。</p>

<p><b class="speaker yakura">矢倉:</b> 今までは「マージン禁止」なんて誰も言いませんでしたものね(笑) 。でも今後はそういうスタイリングが一般的になっていくんじゃないかな、と思います。</p>

<p>あと、今までCSSの文脈で話していましたが、こういう考え方は、ReactやVue.jsなどのコンポーネント指向フレームワークとも通ずるものがあると思うんです。</p>

<p>そうしたフレームワークを使ってコンポーネント設計を行う時のベストプラクティスとして、コンテナ・コンポーネントとプレゼンテーショナル・コンポーネントに分けるという考え方も主流になりつつありますし（※）。</p>

<p>※コンポーネントを二種類に分け、プレゼンテーショナル・コンポーネントは単純な表示のみを行い、それらが配置された不可視のコンテナ・コンポーネントが振る舞いを一括で管理する、という設計思想のこと。<a href="https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">出自はこちら</a></p>

<p><b class="speaker siraisi">白石:</b> 確かに、そうした考え方とも非常に良くマッチしそうですね。CSSにおいても、コンポーネント間の責務を真剣に考えるときが来たということでしょうね。</p>

<p>本日は興味深いお話、どうもありがとうございました！</p>

<p><DIV align=right>（写真提供：html5j、撮影：刑部友康）</div></p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
	</channel>
</rss>
