<?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>太田良典さん、原一成さんに聞いた「UIデザインとアクセシビリティ」──HTML5 Conference 2017☆番外編</title>
		<link>/djkato/25035/</link>
		<pubDate>Fri, 12 Jan 2018 01:30:10 +0000</pubDate>
		<dc:creator><![CDATA[加藤拓明]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[サイト制作]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[アクセシビリティ]]></category>

		<guid isPermaLink="false">/?p=25035</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (17)今年もHTML5 Conference 2017の展示ブースでは、私ことDJ KATOの特別ラジオをお届けしていました。今回はビジネス・アーキテクツ太田良典...]]></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> (17)</div><p>今年もHTML5 Conference 2017の展示ブースでは、私ことDJ KATOの特別ラジオをお届けしていました。今回はビジネス・アーキテクツ太田良典さんとサイバーエージェント原一成さんをゲストに迎え、「UIデザインとアクセシビリティ」テーマに語っていただきました。その再現レポートをお届けします。ぜひ、カンファレンスレポートの番外編としてお楽しみください！</p>

<p><img src="/wp-content/uploads/2017/12/42A5445.jpg" alt="" width="640" height="400" class="alignnone size-full wp-image-25048" srcset="/wp-content/uploads/2017/12/42A5445.jpg 640w, /wp-content/uploads/2017/12/42A5445-300x188.jpg 300w, /wp-content/uploads/2017/12/42A5445-207x129.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>まずは、どんな講演内容だったのか教えてください</h2>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「ビジネス・アーキテクツの太田です。普段はWebアクセシビリティ関連の活動を主に行っています。『多様なユーザーニーズに応えるフロントエンドデザインパターン』というタイトルで講演させていただきました。よろしくお願いいたします」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「サイバーエージェントの原です。アメブロのフロントエンド開発を中心に行っています。『“モダン” ウェブアプリケーション ～アメブロ5ヶ年計画～』という講演タイトルで、アメブロの “モダン化” 実例に沿った考え方や技術採用事例、今後の展望などをお話しました」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「お二人とも先ほど同じ時間に講演されてきたんですよね。どちらかのお話を聞いた人は、どちらかが聞けなかったと思うので、どのような話をされたか教えていただけますか」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「私は、11月4日発売の『<a href="https://www.amazon.co.jp/dp/4862463878" rel="noopener follow external noreferrer" target="_blank" data-wpel-link="external">インクルーシブHTML+CSS &amp; JavaScript 多様なユーザーニーズに応えるフロントエンドデザインパターン</a>』という書籍で紹介されている、アクセシビリティに配慮した実装手法について、例を挙げて紹介しました」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「どのような実例でご説明されたのでしょうか？」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「先ほどのセッションではサイトでの操作など、使いやすくするためにはどうするかという話をしました。例えば、商品のリストを値段の高い順や安い順に並べたり、最新順に並び替えるなどの機能も、基本的な要素を使ってマークアップしましょうという話ですね。絞り込みの機能を選択するのは高い順・低い順・古い順・新しい順が多いのですが、それは4個の中から1つを選ぶ機能なので、ラジオボタンで実装すればいいとか。</p>

<p>よくある問題は見た目がきれいになるからと、ラジオボタンじゃなくて<code>&lt;span&gt;</code>とか<code>&lt;div&gt;</code>で実装して、JavaScriptでクリックイベントをつけて操作できるようにするとか。それは、ラジオボタンで実装することによってキーボード操作であっても使いやすくすることができます。でもソフトキーボードでちゃんと使えるのか、スクリーンリーダーでアクセスしたときにちゃんと読まれるのかなど、いろんな問題があるわけです。なので、基本的にはちゃんと機能に合った要素を使って、見た目は後からがんばりましょうという話ですね」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「先に知っておけば、そういう落とし穴には落ちないということですね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「HTMLをやってる人なら誰でも知ってるはずなんですけど、なぜか<code>&lt;div&gt;</code>とか<code>&lt;span&gt;</code>を使ってしまうんですよね。知っていることと実践できているかというのは別なんです」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「そうなってしまうのは、楽だからなんでしょうか」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「というか、『見た目から入ってしまう』からそうなるんですよね。見た目から入ると『枠で囲まれているから<code>&lt;div&gt;</code>かな』という考え方になりがち。後から結構スクリプトでできちゃうので、それなりに動くものができるんですよね。ただ、それがどんな環境でも使えるかというと、結構使えないことがあるのが問題です」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「そういったことをいろいろご紹介されていたんですね。チェックボックス以外のトピックも聞いてみたいです」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「リストや見出しをちゃんと使うことですね。あとJavaScriptやXHRを使ったパフォーマンス改善やアクセシビリティの話を中心にしていました。</p>

<p>アクセシビリティは『JavaScriptをできるだけ使うな』という議論になることが結構多いんです。でも、今普及してるUIはJavaScriptで動かしていることが多いのに、そんなこと言われても困るんですよね。今回ご紹介してる本ではこうすればできるという技法を紹介しています」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「ありがたいですよね。僕もJavaScriptを使いまくりなんですけど、実際のサービスを作る上ではやっぱり使わざるを得ない。さらに、ネイティブアプリとの差をなくしていったり、使いやすさを向上させるには必要な技法です。ピンク本と呼ばれる「<a href="https://www.amazon.co.jp/dp/4862462650" rel="noopener follow external noreferrer" target="_blank" data-wpel-link="external">デザイニング Web アクセシビリティ</a>」という本があるんですが、毎週チームで読み会をしています」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「そのピンク本、ありがたいことに私の著書なんです(笑)」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「うちの会社にもあります。みんなは読んでいる本なんですけど、僕はどっちかっていうとエンジニアというよりディレクター寄りということもあって、まだ読んでいませんでした。すみません…」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「ディレクターさんにもすごくいい本ですよ」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「というか、ディレクターさんにもぜひ読んでいただきたいと思って書いた本です(笑)」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「なるほど！読みます！」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「実装だけじゃなくて、その上流から踏まえていきましょう、ということも結構書いているので、ぜひ読んでください」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「さっきのサイト制作の話に戻るんですけど、見た目から入っちゃうことが結構多くて。特にビジネスで評価する人って、この見た目がかっこいいとかから入っていきがちなんですよね」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「見た目と動きだけでしか評価できない人が多いという問題もありますね。見た目と動きがちゃんとしてればOKになってしまうことも多いんですよ」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「例えばディレクターがアクセシビリティを知らなくて、スクリーンリーダーなどの存在を知らなかったら、それだけで話が通じなくなりますよね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「そうですね。それを解消するためにも、ぜひ！」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「まずこれを読むことで、関係者全員のしなくてもいい紛争が減ると」</p>

<h2>モダンなウェブとアクセシビリティは両立できますか？</h2>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「原さんはモダンなウェブというテーマで講演されていましたが、アクセシビリティと両立するのは難しくないんですか？」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「難しくはないんですけど、ワークフローの中に組み込むのが結構大変ですね。プロジェクトは企画から始まって、デザインを作って…というように、見た目が前提なフローが多いので、どうしてもコードがわかる人はフロントエンドエンジニアくらいになるんですよ。評価できる人も」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「自然と優先度が下がっちゃう、というかんじですね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「そうなんです。先程も言ったように『コードを知らない』って方もいるので、ピンク本は『JavaScript使うな』とは書いていないので、その辺もありがたいです」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「そういうことですか！」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「昔ながらのアクセシビリティをやってる人だと、『JavaScriptは使うな！』と言っちゃう人もいるんですよね。現場ではそう言われても困るので、なんとかしたいって思ってたんです。今回の本はそういう内容がたくさん書かれているので、いいなと思っているんですよね」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「極端ですけど例えば『危険だから家から出るな』みたいな話になっているんですかね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「そうそう。何かあった時に『これとこれとこれを準備して』とか『こういうことに気をつけて』というのを示してくれるかんじなんです」</p>

<h2>ところで、普段はどんなお仕事しているんですか？</h2>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「話は変わるんですけど、太田さんは普段どんなお仕事されてるんでしょうか？」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「ビジネス・アーキテクツという会社で、Webの仕事をしています。主に大きな会社のWebサイトを受託で作ることが多いです」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「企業の公式Webサイトですね」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「そうなんです。グローバル展開している日本の大手企業が多いのですが、そうした企業はアクセシビリティのガイドラインを持っていて、各国に配布したりしてるんですよね。各国にもそれぞれサテライトサイトがあって、全部統一させようと取り組んでいます。そういうアクセシビリティのデザインガイドラインの配布や取り組みに対して、お手伝いをしています。ひと言で言うと、Web制作ですけど」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「ひと言だとそうなんですけど、大変そうというか、慎重にやってかないと…。なんか、あまり軽いノリで作れないサイトってかんじですね」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「重すぎるノリっていうのも問題で、これやるなって言いすぎてもガイドライン無視されるだけなので、やっぱり現場で使えるようにしていかないと。実際に使えるものを作って、かつ運用できるようにしていくということがすごく大事なんですね」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「そうすると、基本のWebだけではなく、モダンな開発手法も知らないといけないですね」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「最近だとモバイル用のページをレスポンシブで作るのが当たり前になっていると思うのですが、そういうところも考えないといけないことがありますね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「スマートフォンのモバイル用のページのことや、PC用ページではどうかとか、デスクトップのリーダーではどうかというのも書いてあって便利です」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「原さんは、どんなお仕事をされているのですか？」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「私は完全に開発者で、2004年からずっとアメーバブログを作っています」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「長いですね！」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「2015年にリニューアルをしていますが、サービスの歴史も長いですね。主にフロントエンドを担当しています」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「歴史が長いと今までに積み上げてきたものも多いと思います。社内で設計が大きく変わったりすると、かなり大変だと思いますが」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「その辺はエンジニアと協力しながらやっていますね。iOSならiOSの、AndroidならAndroidのエコシステムっていうか開発環境と作り方の基本があるんですけど、その上で他の人と会話しながら、モダン、モダンって言いながら開発してます。閉じこもった自分たちだけのライブラリばかりでは、存続が危うくなると思うので」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「お二人ともなんというか共通するところがあるっていうか、戦っているポイントが結構似ているかんじがします」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「かなり」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「そうですね」</p>

<h2>お二人の情報収集や勉強方法を聞かせてください</h2>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「お二人はどのように情報収集や勉強されているんですか？」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「今まさに勉強しているつもりです」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「そうそう。かなり勉強してます(笑)」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「気がついたら置いていかれてた…っていうのは一番避けたいのですが、そのためにどんなことをしたらいいのでしょうか。ニュースサイトを見るとか？」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「それもありますが、周りの人と会話をすることも大事なんじゃないかと。最先端の技術者たちとコミュニケーションをとったり、彼らがTwitterなどで何をシェアしているのかを見ることで、どういうものが流行っているかを知ったりすることが多いですね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「僕も一番簡単な情報収集はTwitterですね。フォローしておいて、その人がリツイートしているものを見るだけでも参考になります。あと、海外の情報も重要なので、英語が読めるだけでも大分可能性は広がります。ちょっと時間差はあるかもしれませんが、日本語に訳してくれる人をフォローするという手もありますね」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「Twitterはすごい情報数があふれているので、普段あまり使ってないんですけど…。どうやって情報の絞り込みをするんですか？」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「もちろん、全部を読むわけではないですよ」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「技術系のカンファレンスで気になったものをフォローしているので、そこからとか」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「良質なツイートをしている人が発信している情報を集めて、どんどんその濃度を上げていくみたいなかんじなんですね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「あとは情報を発信している人のところに実際に行ってみるとか。そういう会社に入っちゃうというのもありますね」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「なるほど！」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「簡単に希望したところに行けるかはわからないですけど」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「そういう意味では、サイバーエージェントさんは大変いい環境ですよね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「うちは情報が自然に入ってくる環境なので、勉強する必要がないっていうか。極論ですけどね(笑)」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「自然にっていうのがすごいですよね。周りの人との雑談がなんかマークアップの話になるとか？」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「ちょっと気持ち悪いかもしれないですね、普通の人からすると(笑)。技術に興味がある人が集まっている場所というか」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「でも、マークアップの話で盛り上がれるってすごく楽しいですよね。いや、『それ変態だ』って言われそうですけど(笑)」</p>

<h2>アクセシブルなサイト設計・制作について教えてください</h2>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「簡単なアプリケーションだったら自分で作ったりもするんですけど、実際に開発始めてみると<code>&lt;div&gt;</code>とか<code>&lt;section&gt;</code>とか、途中で<code>&lt;h3&gt;</code>や<code>&lt;h4&gt;</code>がだんだん適当になってくんです。100行超えてくると『あれ？もともとどんなかんじに作りたかったんだっけ』というかんじになって、全体のことがあやふやになってくるんですけど、どうすればいいんでしょうか」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「それはいい質問だと思いますね！早い段階から見た目を気にして、その段階で増やそうと考えちゃってるんですよね」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「はい。で、書きながら実行してるんですよ」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「それは自然ではあるんですよね。悪いことではないんですが、基本的にオススメなのは、まずCSSを一切適用しない状態でHTMLだけで作ってしまうこと。結構しっかりした構造が作れると思います」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「完全に素のやつですよね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「さらに言うと、見出しから作っていくとか。それがマークダウンなんですが、逆に難しいかな」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「以前僕が経験したものだと、先にデザインが決まり、デザインカンプが上がってきて、スライスしてCSSをあてる。で、インタラクションとかをJavaScriptでやるという順番でした。ちゃんと考えたつもりなのに、だんだん破綻していくんですよね。いきなりフロートからやるとか、順番がおかしいとは思ってたんですけど(笑)」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「もしかすると、デザイナーさんもあまり整理できてないのかもしれないですね。うちではコンポーネント思考で、デザインから作っています。Webコンテンツをコンポーネントっていう単位で分割するんですよ。例えば見出しなら見出し、本文なら本文、リストならリストみたいなパーツに分割してデザインしてくんです。</p>

<p>それを組み合わせてWebページを作るというシステマティックなやり方をしています。ページごとにデザインするのではなく、パーツごとにデザインしたものを組み合わせてページを作るという考え方をデザインの段階からやっているんです」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「最初はみんな紙ベースというか、ペライチみたいなデザインで始めることが多いんですよね。紙って自由度が高いけど、文字や画像などのコンテンツをバラバラにすることはできなかったり、うまく区切れなかったりとか、Webとは考え方ややり方が違いますよね」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「逆にWebのやり方がわかっているデザイナーさんだと、『これは<code>&lt;h1&gt;</code>で』とか言ってくれたりするんですよ」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「あとは自分たちで共通部分を見つけてコンポーネント化していくとか」</p>

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

<h2>サイトの構造やレイアウトデザイン、昔と今ではどう変わってますか？</h2>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「以前、コーディングは全然やらない人で完全にデザインだけやっている外部の人が、『こんな感じでよろしく』って送ってきたデザインが最悪だったことがあります。一方で、フロントエンジニア兼デザイナーをやっている人とやった時はすごくて、まずデザインの前にきちんと要件をはっきりさせてくれました。自分がちゃんと考えきれてなかったサイトの構造やボタンの位置にツッコミを入れてくれたりとか。みんながそれできるかっていうと厳しいですけど」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「今日登壇してる方たちもみんな通っている道ですね(笑)。めちゃくちゃのところからスタートして、だんだん良くなっていくという」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「それはあると思いますね。我々なんかの世代だとHTML3.2の時代からやっている人もいるので。以前はテーブルレイアウトというのがあって…」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「あー知ってます！昔やってましたよ、それ。一番最初にWebサイト作ったときに全部テーブルやりましたね」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「構造も何もあったもんじゃない(笑)」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「完全に見た目だけですよね。最近入社してきた若手なんかはテーブルレイアウト知らない世代でしたけど」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「ある意味うらやましいですね(笑)」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「昔はありだったんでしょうか」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「あるかなしかっていうと、なしだったんですけど。仕方がなかったっていうか」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「あれはフロートがなかったからとかそういうことだったんでしょうか」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「フロートがいつからあったかというのは難しい議論なんですけど、昔はブラウザのCSS周りの実装がボロボロだった時があって、IEでフロートすると横マージンが2倍になるとかありましたね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「まぁ環境が整ってなかったというかんじですよね。だから一概にさっきの話も悪いとは言えないというか」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「Web標準が流行り出して、ブラウザの実装が統一されてきたのも、もう10年前くらいですね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「モバイルが出てきてWebkitベースで確認できるようになって…」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「それ以前はもうぐっちゃぐちゃですよね」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「昔はできたデザインとマークアップした結果を重ねて、透過して1ピクセルもずれちゃいけないみたいな」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「ピクセルパーフェクトってやつですね！」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「聞いたことあります」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「昔は『全部のブラウザで同じ見た目にならないといけない』って時代があったんですよ。でも今はそういう時代じゃないですね、『デバイスによってちょっと違いますよね』ってのが当たり前になっているので」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「今はデバイスの種類がたくさんあるので、ピクセルよりも文字サイズはremとか、高さも%じゃなくてvwとか使うんでしょうか」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「状況によりますよね、使うべきときは使います。ちなみにそういう単位をどういうときにどれを使うのかという議論も、『インクルーシブHTML+CSS &amp; JavaScript 多様なユーザーニーズに応えるフロントエンドデザインパターン』に書いてありますので、もしご興味があればぜひ！」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「ぜひ、勉強します！」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「CSSが一番難しいですよね」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「同じことを実現する方法が結構いくつもあって、でもやり方によって結果がかなり違ってくるとか」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「僕CSS書いたら1万行くらいいってしまったことがあって…。さすがにディレクターの人に『俺でも3分の1にはできるぞ、書き方おかしい！っていうか、全部に対してCSS書いてるじゃん』って言われたことがあるんです。その辺のベストプラクティスもあるんでしょうか」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「今はセレクターの値の設定やファイルの指定とか、いろいろな方法が考えられてます」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「CSSについても書いてありますか？」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「そこまで深くはないかもしれないですけど、それなりにCSSについての議論は書いてあります。楽しい本ですよ」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「ありがとうございます！個人的にはすっきりしてきました。なんかもやもやしてたことに明確に答えが返ってきて、なんだか気持ちいいです」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「そうですよね。他の人ととりとめない話をすることがすごく勉強になるみたいなこと、結構あると思うんですよ」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「いろんなカンファレンスありますが、純粋に技術の話できるというのは面白かったなあと思います」</p>

<h2>UIを考える時に一番気をつけるべきことは何ですか？</h2>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「そろそろまとめというか『オチ』に入っていきたいので、最後に質問をさせていただきます。UIを考える時に一番気をつけないといけないことって何でしょうか」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><br>
「ユーザーのことを考えるというのが一番重要だと思います。これでユーザーが実際に使えるのか、どんなユーザーがいてどんな環境でどう使うのかを意識することが大事なことなんじゃないでしょうか」</p>

<p><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「僕もユーザーですね。いろんなユーザーがいるということを、いかに自分の中で学ぶかということだと思います。一番いいのは、いろんなサービス使ってみたりして、自分がいろんなユーザーになれることですね。例えば、日本だと回線は速いけど海外だと遅いとか、性能の低いデバイスしか売ってないとか。こんな良い端末でこんないい回線使っている人は世界中にはそんなにいないですよと。そういったことを想像して、自分がユーザーとして変化できることも必要だと思っています」</p>

<p><img src="/wp-content/uploads/2017/12/kato.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25052" /><br>
「そのとおりですね！今日はとても勉強になりました。本当にありがとうございました！」</p>

<p><img src="/wp-content/uploads/2017/12/ota.jpg" alt="" width="100" height="100" class="alignnone size-full wp-image-25054" /><img src="/wp-content/uploads/2017/12/hara.jpg" alt="" width="96" height="96" class="alignnone size-full wp-image-25056" /><br>
「ありがとうございました！」</p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
		<item>
		<title>CSSでバーティカルリズムを実現しよう！line-height-stepを使ってみる</title>
		<link>/kojii/24718/</link>
		<pubDate>Tue, 14 Nov 2017 01:00:42 +0000</pubDate>
		<dc:creator><![CDATA[石井宏治]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[デザイン]]></category>
		<category><![CDATA[サイト制作]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[line-height-step]]></category>
		<category><![CDATA[バーティカルリズム]]></category>

		<guid isPermaLink="false">/?p=24718</guid>
		<description><![CDATA[「バーティカルリズム」（Vertical Rhythm）と呼ばれるデザイン手法があります。最近は関連記事も増えてきたので聞いたことがある、という方もいらっしゃるかもしれません。日本語本来のタイポグラフィでは「行取り」と呼...]]></description>
				<content:encoded><![CDATA[<p>「バーティカルリズム」（Vertical Rhythm）と呼ばれるデザイン手法があります。最近は関連記事も増えてきたので聞いたことがある、という方もいらっしゃるかもしれません。日本語本来のタイポグラフィでは「行取り」と呼ばれる類似の手法があり、ほぼ全ての印刷物やワープロで使われています。</p>

<p>「行取り」あるいは「バーティカルリズム」とは、要素の配置に一定のリズムを取り入れることで、デザイン上の安定感や、可読性の向上などの効果が見込るデザイン手法です。通常は、本文の行の高さをリズムの単位として、要素間の余白を調整します。ノートの罫線や、原稿用紙をイメージするとわかりやすいと思います。</p>

<div style="text-align: center">
<img src="/wp-content/uploads/2017/11/rhythm-off-1-300x169.png" alt="" width="300" height="169" class="alignnone size-medium wp-image-24722" srcset="/wp-content/uploads/2017/11/rhythm-off-1-300x169.png 300w, /wp-content/uploads/2017/11/rhythm-off-1-207x117.png 207w, /wp-content/uploads/2017/11/rhythm-off-1.png 328w" sizes="(max-width: 300px) 100vw, 300px" />
<img src="/wp-content/uploads/2017/11/rhythm-on-300x132.png" alt="" width="300" height="132" class="alignnone size-medium wp-image-24721" srcset="/wp-content/uploads/2017/11/rhythm-on-300x132.png 300w, /wp-content/uploads/2017/11/rhythm-on-207x91.png 207w, /wp-content/uploads/2017/11/rhythm-on.png 328w" sizes="(max-width: 300px) 100vw, 300px" />
</div>

<p>上の例のように、CSSで<code>line-height</code>や<code>margin</code>を適切に設定すれば実現可能ですが、メンテナンスが煩雑になる、レスポンシブにするのが難しい、見出しが複数行になるとうまくいかない、などの課題が残ります。</p>

<p>現在W3Cでは、この問題を改善するために、<code>line-height-step</code>という新しいプロパティを議論しています。まだ異論や技術的課題が残っていますが、Chrome、Edge、Safariは賛同しており、Chromeでは試験運用機能として実装もされています。この記事では、このプロパティを使って、バーティカルリズムを実装する方法について解説します。</p>

<h2>二つのスタイル：強いリズムと弱いリズム</h2>

<p>まずは、どこにどのように適用するかを考えます。「バーティカルリズム」にもメリットとデメリットがあります。メリットとデメリットを理解して、適切に適用する方法を考えてみましょう。</p>

<p>一つ目のメリットは、行や要素が一定の間隔を持つことで、デザイン上の安定感が生まれることです。規則的に並んでいるデザインは、洗練、安定、安心、といった印象を与えます。</p>

<p>二つ目のメリットは、脳が一定のリズムをパターン認識することで、可読性を上げることです。目線が次の行頭に移動する時は、可読性が一番妨げられる時でもあります。脳が次の行頭位置を予測することで、目線の移動を助け、より早く、より楽に読めることで、内容の理解力も高まるとされています。</p>

<p>残念ながら、デメリットもあります。一つ目は、スペースを消費することです。余白を広げて調整するため、適用しない場合と比べて、より広いスペースが必要になります。モバイルでは画面の大きさが限られているため、本文の行の高さの半分をリズムの単位にするなどの工夫もあるようです。</p>

<p>デメリットの二つ目は、余白が一定でなくなることです。これはちょっとわかりにくいので、例を挙げて説明します。</p>

<p>画像や表、引用文、コード、コラムなど、大き目のブロックが入った場合を考えてみます。「バーティカルリズム」を適用するなら、これらのブロックの高さを本文行の高さの整数倍に揃えることになります。雑誌などデザイン重視の印刷物では、通常は画像や表の大きさを調整して揃えますが、Webでは画像のサイズを変えたくないため、余白で調整することになります。この結果、画像が複数ある時に、画像と本文の間の余白が一定にならない、という副作用が生まれます。</p>

<p>二つの画像の間に、一行の本文がある場合がわかりやすいかと思います。</p>

<p><img src="/wp-content/uploads/2017/11/image-space-uneven-300x126.png" alt="" width="300" height="126" class="aligncenter size-medium wp-image-24723" srcset="/wp-content/uploads/2017/11/image-space-uneven-300x126.png 300w, /wp-content/uploads/2017/11/image-space-uneven-207x87.png 207w, /wp-content/uploads/2017/11/image-space-uneven.png 363w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>一定のリズムを作るデザインを心がけているのに、この余白が一定で無いのは残念です。また、大きなブロックをまたいだ場合、上に挙げたメリットは小さくなってしまいます。脳が画像をまたいでパターン認識するのは困難ですし、目線が画像の次の行頭を見つけるのは簡単です。</p>

<p>この点から、大きな画像や表に対しては、画像をリサイズできない場合には「バーティカルリズム」を適用せず、余白を一定にする手法が一般的に使われる、と「<a href="https://www.w3.org/TR/jlreq/ja/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">日本語組版処理の要件</a>」および、JIS X 4051「日本語文書の行組版方法」では定めています。</p>

<p>W3Cでの議論を見ると、この点が、英語圏由来の「バーティカルリズム」と、日本語本来の「行取り」では大きく違うようで、英語圏由来の「バーティカルリズム」は、余白の調整は断念し、常に適用する場合が多いようです。対して「日本語組版処理の要件」では、<a href="https://www.w3.org/TR/jlreq/ja/#processing_of_gyoudori" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">行取りの処理例</a>は、見出しの説明の中でのみ出てきます。日本語は、文字の高さが一定のため、画像と本文の余白を、英語の場合よりも気にするのかもしれません。</p>

<p>本記事では、適用する場合と、空白を揃える場合の両方のパターンを使って、本文と見出しにのみ適用してみます。</p>

<h2>CSSコーディング</h2>

<p>提案中の <code>line-height-step</code> プロパティを設定すると、行の高さが設定値の倍数になるように切り上げられます。これを使って、CSSを書いてみましょう。便宜上、見出しは <code>&lt;h2&gt;</code> と <code>&lt;h3&gt;</code>、本文は <code>&lt;p&gt;</code>、画像やコラムは <code>&lt;div&gt;</code> タグを使っているとします。</p>

<p><code>line-height-step</code> プロパティはまだChromeの試験運用機能でしか使えないので、まずは <code>@supports</code> で囲みます。ブラウザで表示を確認する場合には、Chromeのアドレスバーに「chrome://flags」と入力し、表示された画面で「Experimental Web Platform features」を有効にしてください。
</p><pre class="crayon-plain-tag">article {
  font-size: 16px;
}

@supports (line-height-step: 1px) {
  article {
    --grid: 24px;
    line-height-step: var(--grid);
  }
}</pre><p></p>

<p>日本語の行間は、フォントサイズの1.5倍から1.8倍くらいが読みやすいとされていますので、ここでは <code>font-size</code> を1.5倍にした <code>24px</code> を基本のリズムとします。この値は他でも使うので、<a href="https://developer.mozilla.org/ja/docs/Web/CSS/Using_CSS_variables" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Custom Properties</a> で定義して、<code>line-height-step</code> プロパティを設定します。</p>

<p>基本のリズムを設定したら、本文の設定をします。
</p><pre class="crayon-plain-tag">article &gt; p {
    line-height: 1.2;
    margin: 0;
  }
  article &gt; p + p {
    margin: var(--grid) 0 0 0;
  }</pre><p> 
<code>line-height-step</code> を使う時には、<code>margin</code> をリズムの整数倍に揃える必要があります。個人的には日本語の段落間の空きはない方が好みなのですが、Webでは空ける場合も多いため、ここでは段落間を一行空きに設定しています。後で出てきますが、margin collapsingが使えない場合があるため、隣接セレクターを使っています。</p>

<p>また、<code>line-height-step</code> が行間を一定に揃えてくれるため、誤って余分な空白が入らないように <code>line-height</code> を小さめに設定しています。通常は問題ありませんが、複数のフォントが使われた時などには、CSSの仕組み上、行間が広がってしまう場合があるためです。</p>

<p>次に、画像や表は適用外とします。<code>margin</code> は見た目を確認しながら適当に設定してください。
</p><pre class="crayon-plain-tag">article &gt; div, article &gt; table {
    line-height-step: 0;
    margin: .2em 1em;
  }</pre><p> 
最後に、見出しを「行取り」で揃えてみましょう。
</p><pre class="crayon-plain-tag">article &gt; h2, article &gt; h3 {
    display: inline-block;
    width: 100%;
    line-height-step: 0;
    line-height: 1.2;
    margin: var(--grid) 0 0 0;
  }</pre><p> 
ちょっとおまじないが出てきました。実は、<code>line-height-step</code> は行の高さを揃えるだけで、ブロックを揃えることができません。ブロックを揃えるための仕様も議論には上がっているのですが、行の議論でもう二年近く経っているので、ブロックの議論や実装は残念ながらまだ先です。このため、現段階でブロックを揃えるには、ブロックを <code>inline-block</code> にして行の中に収め、その行を揃える、という手法を取ります。<code>width</code> は、この <code>inline-block</code> を含む行を幅いっぱいにするためです。</p>

<p>これで <code>&lt;h2&gt;</code> や <code>&lt;h3&gt;</code> の高さは常に <code>24px</code> の倍数になるように上下に余白が入ります。</p>

<p>モバイルなどの狭い画面では、見出しが複数行になる機会もあるので、このブロックの中では <code>line-height-step</code> をオフにし、小さめの <code>line-height</code> を設定します。見出しは、短めで、フォントも大きいので、通常は行間を詰めた方が見やすくなります。</p>

<p>最後に、見出しの上部の空きを、下部の空きより大きくするため、<code>margin-top</code> のみを一行分に設定します。これも好みですが、実際の空きは、「行取り」の調整のためにこれよりも大きくなるため、確認しつつ適切な値を探してみてください。上下の <code>margin</code> の合計値は <code>24px</code> の倍数になるようにする必要があります。また、<code>inline-block</code> にしたため、隣接したブロックとの間でmargin collapsingが働きません。<code>&lt;p&gt;</code> で隣接セレクターを使ったのはこのためです。</p>

<p>これで完成です。試験運用機能を有効にしたChromeで確認できるはずです。<a href="http://kojiishi.github.io/css-rhythm/sample.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">サンプルはこちら</a>にあります。確認が終わったら、試験運用機能は無効に戻しておいてください。</p>

<h2>最後に</h2>

<p>多くの方が、試されて最初に感じるのは「あんまり変わらないね」ということではないかと思います。ほぼすべての日本語ワープロにこの機能が入っていますが、気がついている人は多くはないのではないでしょうか。「行取り」「バーティカルリズム」のみならず、多くのタイポグラフィの改善は、一つ一つは非常に小さな変化ですが、積み重ねることで確実に読みやすくなります。ぜひ、お試しください。</p>
]]></content:encoded>
			</item>
		<item>
		<title>抽象化を避けるCSS設計方法論「Enduring CSS」 第4回</title>
		<link>/takazudo/24269/</link>
		<pubDate>Fri, 10 Nov 2017 01:26:21 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[ECSS]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>ECSSを取り入れるべきか否かは、プロジェクトの性質によって左右されるであろうと筆者は考えます。Webサイトは作って終わりではありません。サイトローンチ後も継続して変化しうるHTMLとCSSについての保守を考える場合、ECSS的な視点も考慮しつつCSSの設計を考えてみてはいかがでしょうか。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Enduring CSS]]></series:name>
	</item>
		<item>
		<title>これからのCSSは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>
		<item>
		<title>Windows Creators Update,Firefox 53,Chrome 58リリース──2017年4月のブラウザ関連ニュース</title>
		<link>/myakura/23905/</link>
		<pubDate>Thu, 29 Jun 2017 00:30:07 +0000</pubDate>
		<dc:creator><![CDATA[矢倉 眞隆]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Edge]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[ブラウザ]]></category>

		<guid isPermaLink="false">/?p=23905</guid>
		<description><![CDATA[連載： WEB標準化動向 (23)4月にはFirefox 53とChrome 58がリリースされました。そして、Windows Creators Updateが一般公開され、Edgeも新しいEdgeHTML 15が搭載さ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webstandards-news/" class="series-156" title="WEB標準化動向" data-wpel-link="internal">WEB標準化動向</a> (23)</div><p>4月にはFirefox 53とChrome 58がリリースされました。そして、Windows Creators Updateが一般公開され、Edgeも新しいEdgeHTML 15が搭載されたバージョンに更新されました。</p>

<p>また、Firefoxのリリースサイクルが変更され、新しい機能が実装されてからリリースされるまでの実装が短縮されることになりました。</p>

<h2>Windows Creators Updateリリース、EdgeもEdgeHTML 15に更新 <a id="edgehtml15" data-wpel-link="internal"></a></h2>

<p>4月11日にWindows Creators Updateが公開され、Microsoft Edgeも更新されました。</p>

<ul>
<li><a href="https://blogs.windows.com/msedgedev/2017/04/11/introducing-edgehtml-15/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">What’s new in Microsoft Edge in the Windows 10 Creators Update</a></li>
</ul>

<p>開いているタブをよけておく機能の追加や、タブのサムネイルを表示するなど、ブラウザとしての使い勝手にも手が入りました。</p>

<p>レンダリングエンジンであるEdgeHTMLもバージョンが15に更新されており、新機能が追加されています。開発ガイドが公開されています。</p>

<ul>
<li><a href="https://aka.ms/devguide_edgehtml_15" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Dev guide &#8211; Microsoft Edge Development</a></li>
</ul>

<p>Payment Request API、CSS Custom Propertiesなどは、Edgeのブログでも過去に取り上げられていますね。</p>

<ul>
<li><a href="https://blogs.windows.com/msedgedev/2016/12/15/payment-request-api-edge/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Simpler web payments: Introducing the Payment Request API</a></li>
<li><a href="https://blogs.windows.com/msedgedev/2017/03/24/css-custom-properties/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Custom Properties in Microsoft Edge</a></li>
</ul>

<p><a href="https://wicg.github.io/IntersectionObserver/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Intersection Observer</a>の実装はうれしいですね。これは要素とブラウザの表示領域が交差したことを検知するAPIで、画像などの遅延ロードやパララックス的な表現の実装に役立ちます。FRESH!のパフォーマンス改善手法のひとつとしても取り上げられました。</p>

<ul>
<li><a href="https://developers.cyberagent.co.jp/blog/archives/6057/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">FRESH! Web パフォーマンス改善 〜クライアントサイド編〜 | CyberAgent Developers Blog</a></li>
</ul>

<p>JavaScriptでは、Async Functions（<code>async</code>/<code>await</code>）の実装がうれしいです。今回Edgeがサポートしたので、主要ブラウザの最新バージョンすべてが対応しました。</p>

<h3>目立たない機能の実装も…あるかも</h3>

<p>Dev Guideの下に、実装されたAPIの一覧があったので、ブログなどでは取り上げられない機能のうち、気になったものをチェックしました。</p>

<ul>
<li><code>Element.closest()</code>、<code>Element.matches()</code>の実装</li>
<li><code>text-combine-upright</code>プロパティ（接頭辞なし）の実装</li>
<li><code>outline-offset</code>プロパティの実装</li>
<li><code>-webkit-text-stroke</code>プロパティとサブプロパティの実装</li>
<li><code>translate</code>、<code>scale</code>、<code>rotate</code>プロパティの実装</li>
</ul>

<p>最後の<code>translate</code>、<code>scale</code>、<code>rotate</code>プロパティですが、これはCSS Transformsの変換関数だった<code>translate()</code>、<code>scale()</code>、<code>rotate()</code>をプロパティ化したものです。プロパティになったので記述の短縮になりますし、書き順で結果が変わってしまうことのある<code>translate</code>プロパティでの指定よりも、意図した効果を実現しやすくなります。</p>

<p>すでにChromeで実装されており、Edgeでの実装もとてもうれしい…と書いていたのですが、手元でちょっと試したところ未知のプロパティとなってしまいました…秋の新しいバージョンに期待します。</p>

<h2>Firefoxのリリースプロセスに変更、Auroraチャンネルが廃止 <a id="firefox-dawn-project" data-wpel-link="internal"></a></h2>

<p>4月18日より、Firefoxのリリースサイクルが変更されました。</p>

<ul>
<li><a href="https://hacks.mozilla.org/2017/04/simplifying-firefox-release-channels/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Simplifying Firefox Release Channels and Improving Developer Edition’s Stability</a></li>
<li><a href="http://release.mozilla.org/firefox/release/2017/04/17/Dawn-Project-FAQ.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Dawn project or the end of Aurora</a></li>
</ul>

<p>これまでのFirefoxは、「Nightly → Aurora → Beta → Release」と4つのチャンネルに分かれていました。このうち、Auroraチャンネルが廃止され、「Nightly → Beta → Release」と、1サイクル短くなります。これにより、新しく実装された機能が手元に届くまでの期間が、これまでより1サイクルぶん（6〜8週）短くなります。</p>

<p>Auroraチャンネルはこれまで、Developer Editionという名前のビルドとして提供されていました。Developer Editionというシステムは廃止されないようですが、中身はBetaチャンネルになります。Beta版とのリリースとの違いは、Developer Editionはこれまで通り異なるプロファイルが作られることなどにあります。</p>

<p>Auroraチャンネルの廃止によって、4月19日にAuroraチャンネルに移行予定だったFirefox 55は次のサイクルまでNightlyに留まります。Nightlyが2サイクル分続くので、Firefox 55で導入される機能の数がいつもより増えるかもしれませんね。</p>

<h2>Firefox 53リリース <a id="firefox-53" data-wpel-link="internal"></a></h2>

<p>4月19日に、Firefox 53がリリースされました。</p>

<ul>
<li><a href="https://www.mozilla.org/en-US/firefox/53.0/releasenotes/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firefox — Notes (53.0) — Mozilla</a></li>
<li><a href="https://hacks.mozilla.org/2017/04/firefox-53-quantum-compositor-compact-themes-css-masks-and-more/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firefox 53: Quantum Compositor, Compact Themes, CSS Masks, and More ★ Mozilla Hacks</a></li>
</ul>

<p>今バージョンからWindows XPとVistaのサポートがされなくなった（Firefox 52 ESRのサポートに移行）ほか、Macでは64ビット版のみになったことでアプリケーションのファイルサイズが減少しました。UIまわりでは、パーミッション関連のUIが改善されています。</p>

<p>また、Firefox Developers Editionのテーマだった「Compact」テーマがリリース版にも同梱されました。</p>

<div id="attachment_23907" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/06/Screen-Shot-2017-06-26-at-17.04.08-640x327.png" alt="スクリーンショット：FirefoxのCompact Lightテーマ" width="640" height="327" class="size-large wp-image-23907" srcset="/wp-content/uploads/2017/06/Screen-Shot-2017-06-26-at-17.04.08-640x327.png 640w, /wp-content/uploads/2017/06/Screen-Shot-2017-06-26-at-17.04.08-300x153.png 300w, /wp-content/uploads/2017/06/Screen-Shot-2017-06-26-at-17.04.08-207x106.png 207w, /wp-content/uploads/2017/06/Screen-Shot-2017-06-26-at-17.04.08.png 724w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">グラデーションがなくなりフラットになった。画像はLightだがDarkテーマも。</p></div>

<p>レンダリングエンジン周りでは、以下のあたらしい機能がサポートされています。</p>

<ul>
<li><a href="https://developer.mozilla.org/en-US/Firefox/Releases/53" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firefox 53 for developers &#8211; Mozilla | MDN</a></li>
</ul>

<h3>CSS Textの実装で日本語の扱いが向上 <a id="text3-segbreak" data-wpel-link="internal"></a></h3>

<p>Firefox 52から部分的にサポートされていたのですが、CSS Text Level 3の「<a href="https://drafts.csswg.org/css-text/#line-break-transform" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Segment Break Transformation Rules</a>」が実装され、日本語や中国語の文字間などに改行がある際の処理が変更されました。</p>

<p>Webページを表示するとき、HTML中の改行は半角スペースに変換されて表示されます。</p>

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

<p>こういう風に、改行前後に空白がなくても、「HelloWorld」ではなく「Hello World」と表示されます。この処理、単語の区切りに空白を使う言語ではよいのですが、日本語などでは不自然な箇所で空白が入ってしまい煩わしいです。</p>

<p>CSS Text Level 3では、改行前後の文字を見て、それが日本語や中国語のものであれば、その改行を除去して扱うという仕様が加わりました。以下のエントリで細かくまとめられています。</p>

<ul>
<li><a href="http://maiha.hatenablog.jp/entry/2017/04/10/firefox52-segment-break-transformation-rules" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">区分分断の変換規則 &#8211; おいしい</a></li>
</ul>

<p>この仕様の実装によって日本語内での改行が省かれるので、改行がつくる空白に依存しているコンテンツがあれば、見た目に影響がでるかと思います。</p>

<h3>display: flow-root <a id="display-flow-root" data-wpel-link="internal"></a></h3>

<p><code>display</code>プロパティの値に<code>flow-root</code>が加わりました。<code>float</code>の解除には<code>::after</code>を使う、<code>display: table</code>を使うなどがありましたが、ちゃんとした方法になります。</p>

<h3><a id="css-alignment-place-props" data-wpel-link="internal"></a></h3>

<p>CSS Alignmnent Level 3の<code>place-items</code>, <code>place-self</code>, <code>place-content</code>がサポートされました。FlexboxやGridで使われる<code>align-items</code>/<code>align-self</code>/<code>align-content</code>と<code>justify-items</code>/<code>justify-self</code>/<code>justify-content</code>をまとめて指定するプロパティです。</p>

<h3>caret-colorプロパティ <a id="caret-color" data-wpel-link="internal"></a></h3>

<p>先月リリースされたChrome 57でサポートされた、<code>caret-color</code>プロパティがFirefoxにも導入されました。<a href="https://html5experts.jp/myakura/22818/#caret-color" data-wpel-link="internal">3月にリリースされたChrome 57でサポート</a>されており、そちらで簡単に取り上げています。</p>

<h3><a id="css-transition-events" data-wpel-link="internal"></a></h3>

<p>CSS Transitions仕様に追加された<code>transitionstart</code>, <code>transitionrun</code>, <code>transitioncancel</code>イベントがサポートされました。MozillaのBrian Birtlesさんのブログエントリで、導入の経緯も含め簡単に紹介されています。</p>

<ul>
<li><a href="https://birtles.wordpress.com/2016/12/27/mozanime-in-2016/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MozAnime in 2016 | Nothing new</a></li>
</ul>

<h3>その他 <a id="etc-in-firefox-53" data-wpel-link="internal"></a></h3>

<p>アルファチャンネルを持つWebMがサポートされました。<a href="https://simpl.info/videoalpha/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chromeチームがつくったデモ</a>で確認できます（だいぶ気味の悪いデモですが…）</p>

<p>ビデオ関連では、<code>video</code>要素などの<code>play()</code>メソッドが<code>Promise</code>を返すようになりました。</p>

<p><a href="https://w3c.github.io/uievents/#event-type-auxclick" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>auxclick</code>イベント</a>が実装されました。主要なボタン以外のボタンがクリックされたときなどに発火するイベントです。ChromeもChrome 55から実装しています。</p>

<ul>
<li><a href="https://developers.google.com/web/updates/2016/10/auxclick" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">auxclick is Coming to Chrome 55</a></li>
</ul>

<h2>Chrome 58リリース <a id="chrome-58" data-wpel-link="internal"></a></h2>

<h3>abbrのデフォルトスタイルが変更に <a id="abbr-text-decoration" data-wpel-link="internal"></a></h3>

<p>略語をマークアップする<code>abbr</code>要素のデフォルトスタイルが変更され、CSS3の<code>text-decoration</code>プロパティを使うようになりました。以下のスタイルが、ChromeのUAスタイルシートに追加されています。</p>

<p></p><pre class="crayon-plain-tag">abbr[title], acronym[title] {
    text-decoration: dotted underline;
}</pre><p></p>

<p>FirefoxもFirefox 40で変更されています。</p>

<ul>
<li><a href="https://www.mitsue.co.jp/knowledge/blog/frontend/201505/18_0954.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firefox 40 で abbr 要素のデフォルトスタイルが変更 | フロントエンドBlog | ミツエーリンクス</a></li>
</ul>

<p>多くはないと思いますが、使われているサイトでは、二重線になってしまうケースがあるかもしれません。</p>

<h3>color-gamut媒体特性のサポート <a id="color-gamut" data-wpel-link="internal"></a></h3>

<p>メディアクエリーの<code>color-gamut</code>媒体特性がサポートされました。</p>

<ul>
<li><a href="https://developers.google.com/web/updates/2017/03/chrome-58-media-updates#colorgamut" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">color-gamut media query ― Media Updates in Chrome 58</a></li>
</ul>

<p><code>color-gamut</code>はディスプレイの色域が特定ものにマッチするかを調べる媒体特性で、<a href="https://html5experts.jp/myakura/22818/#safari-css-wide-gamut-colors" data-wpel-link="internal">Safari 10.1でサポート</a>されています。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WEB標準化動向]]></series:name>
	</item>
		<item>
		<title>抽象化を避けるCSS設計方法論「Enduring CSS」 第3回</title>
		<link>/takazudo/22915/</link>
		<pubDate>Wed, 26 Apr 2017 01:00:05 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[ECSS]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<h3>autoprefixer</h3>

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

<h3>変数</h3>

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

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

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

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

<h3>mixinとextend</h3>

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>次回は、ECSSをどのように利用していったらよいか。実際に書いてみて気をつけたほうがよさそうなことを筆者なりにまとめて、締めとしたいと思います。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Enduring CSS]]></series:name>
	</item>
		<item>
		<title>「Web Componentsが来る！CSS設計はどうなる？」―CSSのエキスパートに聞いてみた！</title>
		<link>/shumpei-shiraishi/22820/</link>
		<pubDate>Mon, 17 Apr 2017 01:30:36 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[Bootstrap]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Compass]]></category>
		<category><![CDATA[WebComponents]]></category>

		<guid isPermaLink="false">/?p=22820</guid>
		<description><![CDATA[こんにちは、編集長の白石です。 Safari 10.1からCustom Elementsが使えるようになったり、Microsoft EdgeもWeb Componentsの実装を約束していたりと、Web Componen...]]></description>
				<content:encoded><![CDATA[<p>こんにちは、編集長の白石です。<br>
<a href="https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_1.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Safari 10.1からCustom Elementsが使える</a>ようになったり、<a href="https://blogs.msdn.microsoft.com/msedgedev_japan/2016/04/19/microsoft-edge-and-web-components/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Microsoft EdgeもWeb Componentsの実装を約束していたり</a>と、Web Componentsの足音は刻一刻と迫ってきています。</p>

<p>そんな時代に、Web開発はどう変わるのか？まずはCSS設計というところに着目して聞いてみたいと思い、先日「Web Components時代のCSS設計」という座談会を開催し、エキスパートの方々にお話を伺ってみました。</p>

<p><img src="/wp-content/uploads/2017/04/DSC00139.jpg" alt="" width="640" height="405" class="alignnone size-full wp-image-22884" srcset="/wp-content/uploads/2017/04/DSC00139.jpg 640w, /wp-content/uploads/2017/04/DSC00139-300x190.jpg 300w, /wp-content/uploads/2017/04/DSC00139-207x131.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>ゲストのエキスパート紹介</h2>

<h3>高津戸 壮さん</h3>

<p><img src="/wp-content/uploads/2017/04/6ec41b91e4d4403fc55b20ee707032df.jpg" alt="" width="300" height="240" class="alignleft size-full wp-image-22890" srcset="/wp-content/uploads/2017/04/6ec41b91e4d4403fc55b20ee707032df.jpg 300w, /wp-content/uploads/2017/04/6ec41b91e4d4403fc55b20ee707032df-207x166.jpg 207w" sizes="(max-width: 300px) 100vw, 300px" /><strong>株式会社ピクセルグリッド フロントエンドエンジニア</strong><br><br><span style="font-size: 90%;">Web制作会社、フリーランスを経て、株式会社ピクセルグリッドに入社。スケーラビリティを考慮したHTMLテンプレート設計・実装、JavaScriptを使った込み入ったUIの設計・実装を得意分野とする。著書に『改訂版 Webデザイナーのための jQuery入門』がある。CSS Nite 2011ベストセッションにおいて、全170セッションの中から、ベスト10セッションに、CSS Nite 2013ベストセッションでは、全278セッション中、ベスト20セッションに選出。</span></p>

<p><br></p>

<h3>小原 司さん</h3>

<p><img src="/wp-content/uploads/2017/04/076096f5cfa6bb724d6363f2fd4e7000.jpg" alt="" width="300" height="240" class="alignleft size-full wp-image-22891" srcset="/wp-content/uploads/2017/04/076096f5cfa6bb724d6363f2fd4e7000.jpg 300w, /wp-content/uploads/2017/04/076096f5cfa6bb724d6363f2fd4e7000-207x166.jpg 207w" sizes="(max-width: 300px) 100vw, 300px" /><strong>株式会社ピクセルグリッド UIデザイナー</strong><br><br><span style="font-size: 90%;">デザイン事務所で広告デザインの基礎を学び、2000年に独立。2007年頃からWebデザインにも取り組み、クロスプラットフォームアプリのデザイン、画面設計、実装に携わる。現在はその媒体の特長を活かしたグラフィックデザインに励む。マンセル色相環とムーン＆スペンサー配色理論を採用した配色アプリ『HUE360』の開発を行っている。著書に『改訂版 Webデザイナーのための jQuery入門』、『ノンデザイナーズ・デザインブック[第4版]』。</span></p>

<p><br></p>

<h3>榊原 昌彦さん</h3>

<p><img src="/wp-content/uploads/2017/04/DSC00022.jpg" alt="" width="300" height="240" class="alignleft size-full wp-image-22892" srcset="/wp-content/uploads/2017/04/DSC00022.jpg 300w, /wp-content/uploads/2017/04/DSC00022-207x166.jpg 207w" sizes="(max-width: 300px) 100vw, 300px" /><strong><strong>一般社団法人リレーションデザイン研究所 代表理事</strong></strong><br><br><span style="font-size: 90%;">大学院卒業後、一般社団法人リレーションデザイン研究所立ち上げ。その後、まちづくりの産業化を目指す一般社団法人エリア・イノベーション・アライアンスにも参画し、全国の様々なまちづくりの現場に携わる。事業の構造的転換を図り、Webを導入。事業で用いるWebアプリやシステムの開発を行っている。関西フロントエンドユーザーズグループを中心に活動し、CodeIgniter、Ionic2、Onsen UI 2についてもSlackやTwitterを通じて関わる。</span></p>

<p><br></p>

<h2>CSS設計の遍歴を探る…3年前、どうしてましたか？</h2>

<p><strong>白石</strong>: 今回の座談会は「Web Components時代のCSS設計」と題し、Web Componentsが一般的に普及した未来の話を主眼として、そこに至るまでの流れも重視したいと思っています。</p>

<p>過去のCSS設計から現在の皆さんのベストプラクティスの話をもとに、未来に向けた話も聞いていきます。 まずは3年前くらいから振り返っていきたいのですが、当時のCSS設計はどんなふうにしていましたか？</p>

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

<p><strong>榊原</strong>: ちょっと調べてみたのですが、3年前というとiOS7がフラットデザインを採用した年なんですよね。</p>

<p><strong>白石</strong>: おお！そう聞くとずい分昔な気がしますね。</p>

<p><strong>榊原</strong>: そう、そしてCSSまわりの話でいうと、Bootstrapがフラットデザインを採用しました。UIデザインの潮流が大きく変わった年でもあります。</p>

<p><strong>白石</strong>: なるほど。そういう状況下で、榊原さんはどのようにデザインを行っていましたか？ UIのビジュアルデザインも、設計という意味でのCSS設計も含めてお聞かせください。</p>

<p><strong>榊原</strong>:その頃は、デザイナーがPhotoshopなどで作ったデザインカンプを元に、「ピクセルパーフェクト」で書き起こしていました。 最近は、レスポンシブなWebサイトもわりと当たり前になったおかげで、ピクセルパーフェクトってあまり聞かなくなりましたよね。</p>

<p><strong>白石</strong>: なるほど。高津戸さんはいかがですか？</p>

<p><strong>高津戸</strong>: 実は私と小原は3年前も今も、やっている案件自体は変わらないので、やり方自体もそれほど変わっていないんです。どういうふうにCSS設計を行っているかというと、デザインを様々な単位に分割してCSSのクラスにまとめ、そうしたパーツを組み合わせたり再利用したりしながらサイトを構築していく。レゴブロックを組み立てるような要領です。</p>

<h2>やはり話題に上がります、OOCSS</h2>

<p><strong>白石</strong>: それは、OOCSS (オブジェクト指向CSS)の考え方と関係しているのでしょうか？</p>

<p><strong>高津戸</strong>: そうですね…。OOCSSについて話すと長くなるので、詳細は割愛します(笑)。OOCSSはヤフーのエンジニアだったニコール・サリバンが提唱した手法で、サイトを構成するパーツを、レゴのような小さい単位のモジュールの集まりで考えるというものです。その中で、オブジェクト指向プログラミングの考え方を応用して、似通ったモジュールをクラスの継承のような実装で実現するというものです。</p>

<p><strong>白石</strong>: なるほど。以前から誰かに聞きたかったのですが、例えば「テキストを右寄せにする」ための「align-right」というクラス、もっというと「8pxのマージン」をつけるための「margin-8」みたいなクラスを作って組み合わせる、というのもOOCSSと言えるんでしょうか？ 正直、あまり好みではないのですが…。</p>

<p><strong>高津戸</strong>: それがOOCSSかどうか、でいえば「そうだ」と言えるとは思います。ただ、OOCSSがCSSを構造的に扱おうという考え方が広く広まっていなかった時は、そういうUIパーツをモジュール化して効率的に設計しようとした点が重要なところでした。</p>

<p>その頃はそれを実現する手段として、複数のクラスを一つの要素に指定し、スタイルを当てるという方法を採用していたんです。なので、そういう複数クラスを利用することがOOCSSなのかと聞かれたら、否定することはできないですけれども、複数クラスの利用＝OOCSSというわけででもないですね。</p>

<p><img src="/wp-content/uploads/2017/04/98abd82c9eed3987bd54bee5e67b67cd.jpg" alt="" width="640" height="417" class="aligncenter size-full wp-image-22904" srcset="/wp-content/uploads/2017/04/98abd82c9eed3987bd54bee5e67b67cd.jpg 640w, /wp-content/uploads/2017/04/98abd82c9eed3987bd54bee5e67b67cd-300x195.jpg 300w, /wp-content/uploads/2017/04/98abd82c9eed3987bd54bee5e67b67cd-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>榊原</strong>: Bootstrapは、OOCSSの一つのかたちだとは思います。ただ、BootstrapなどのCSSフレームワークを使いはじめたばかりの頃に思ったのは、フレームワークの流儀に合わせるためにdivを追加していくのはどうなのかな、と。 本来不要なはずのdivじゃないですか。結果、HTMLの見通しが悪くなったりするので、こういう不満を解決するのも（後で論じる）Web Componentsの役割なのかなと思います。</p>

<p><strong>白石</strong>: 小原さんは、UIデザイナーの立場でいうと、3年前はどのようなかたちでデザインやワークフローを行っていましたか？ 例えばPhotoshopでカンプを作ったりするのでしょうか？</p>

<p><strong>小原</strong>: いえ、ぼくはそもそもPhotoshopは使っているわけではなくて、Illustratorを使ってます。Illustratorはキャンバスを広大に使えるので、状態違いを横に置いたり、引出線でメモを入れたりしていますね。Illustratorでデザインしたあと、そこにエンジニアにお願いすることもいろいろと書き込んだりします。</p>

<p><strong>高津戸</strong>: 小原のデザインは「エンジニアフレンドリー」と言いますか(笑)、指示が細かくて適切なんです。パディングの幅とかまで書いてあることもありますし、時にはCSSのコードが書かれたJSFiddleのURLが貼られていることもあります(笑)。</p>

<p><strong>小原</strong>: アニメーションなどは、実際に自分で試してみないとデザインできませんから。試してみた結果を参考として伝えるわけですが、そのまま（そのコードを）使ってくれという意味ではありません。同じような結果になる、より良いコードに書き換えてもらう前提ではあります。</p>

<h2>デザインのコンポーネント化、そして共通化</h2>

<p><strong>白石</strong>: 先ほど高津戸さんが言っていた「レゴブロックを組み立てるような」構築の仕方についてお聞きしたいのですが、そういう共通化や部品化、いわば「コンポーネント化」はUIデザインの段階から考えているものなのでしょうか？</p>

<p><strong>小原</strong>: いえ、UIデザインの段階では考えていませんね。その段階では全体で見ることが重要だと思っているので、パーツ単体でデザインするわけではありません。</p>

<p><img src="/wp-content/uploads/2017/04/afe58b3b7d24ed975e22ca24d862ab30.jpg" alt="" width="640" height="421" class="aligncenter size-full wp-image-22905" srcset="/wp-content/uploads/2017/04/afe58b3b7d24ed975e22ca24d862ab30.jpg 640w, /wp-content/uploads/2017/04/afe58b3b7d24ed975e22ca24d862ab30-300x197.jpg 300w, /wp-content/uploads/2017/04/afe58b3b7d24ed975e22ca24d862ab30-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>白石</strong>: なるほどー。UIデザインの段階で共通化が可能だと判明することも多々あるんじゃないかな、と思ってお聞きしたんですよね。ボタンのパディングだとかもそうでしょうし、色なども。</p>

<p><strong>高津戸</strong>: ああ、色はかなり重要ですね。色をSassの変数とかにして、共通化できるんじゃないか…というのは私たちも何度も検討しています。ただ、今はそうしていないですね。</p>

<p><strong>白石</strong>: プリプロセッサはSassを使ってらっしゃるんですね？LessやStylusなどもありますが。</p>

<p><strong>高津戸</strong>: はい、Sass一色ですね。</p>

<p><strong>榊原</strong>: <a href="https://github.com/Compass/compass" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Compass</a>とかも懐かしいですよね。</p>

<p><strong>高津戸</strong>: ああ、懐かしいですね。昔、ブラウザごとのベンダープレフィックスを付けていくのにCompassの関数を利用したりしていましたが、今はPostCSSにautoprefixerというプラグインがあって、それが自動的にベンダープレフィックスを付与してくれるので、めっきり使わなくなりました。CompassってRuby Sassを前提にしていましたが、今はぼくらはより高速なnode-sassを使っています。</p>

<p><strong>榊原</strong>: そうですね、そもそもCompass自体もうメンテナンスされていませんしね。</p>

<p><strong>白石</strong>: で、先ほどの話に戻りますが、色をSassの変数などで管理しようとしたけどまだやっていない、と。</p>

<p><strong>小原</strong>: そうですね、やっていないです。様々な場面で同じ印象を与えようとすると、色って一元的なものじゃなくなるんです。例えば同じ色のボタンでも、背景が暗い場合と明るい場合では、明るさが大きく違って見えてしまう場合があります。</p>

<p>そういうふうに、状況に応じて色合いの微調整を行うことを考えると、Sassの変数で一元管理するというやり方はうまく管理し続けられたことがありません。</p>

<p><strong>高津戸</strong>: エンジニア的な考え方でいくと色は常に同じに思えてしまうし、一元管理が望ましいとも思えるのですが、現実と照らし合わせると難しいところもあって、今はそうしていないということです。 ただ、Sassのlighten()やdarken()などの関数を使えば、ベースカラーを派生させた色合いの微調整が可能なので、それを活用して色を一元管理できるかも…とは考えています。</p>

<p><strong>白石</strong>: 最近、<a href="http://scg.ar-ch.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Sass Color Generator</a>という便利なものがあるのを発見して、重宝してます。</p>

<p><strong>高津戸</strong>: 色については、調整のための関数がCSSの標準でも提案されていますね（著者注: <a href="https://drafts.csswg.org/css-color/#modifying-colors" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Color Module Level4</a>）。</p>

<p><strong>白石</strong>: おお、そうなんですね。変数とかも、<a href="https://developer.mozilla.org/ja/docs/Web/CSS/Using_CSS_variables" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Variables</a>などの標準でサポートされつつありますし、CSS標準にも引き続き注目ですね。</p>

<p>では、過去の話はこれくらいにして、現在皆さんが行っているCSSデザインという話に移行しましょうか。</p>

<h2>CSSフレームワーク使う？インブラウザデザインする？</h2>

<p><strong>白石</strong>: 皆さんは、現在はどのようなワークフローでUIデザインからCSS設計まで行っていますか？ 榊原さんいかがでしょう。</p>

<p><strong>榊原</strong>: ぼくは手書きでワイヤー書いちゃったら、あとは直接ブラウザ上で確認してしまいますね。 そういう流れなので、CSSフレームワークは必須です。ざっとコードを組んでしまって、ブラウザ上で確認と修正を繰り返して調整していく感じです。</p>

<p>SketchとかAdobe XDとか、Webやアプリに特化したプロトタイピングツールも試して便利だとは思いましたが、まだ本格的に使ってはいません。</p>

<p><strong>白石</strong>: なるほど。榊原さんはインブラウザデザインが主だと。ちなみにCSSフレームワークは何を使うことが多いんでしょうか？</p>

<p><strong>榊原</strong>: ぼくは<a href="http://foundation.zurb.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Foundation</a>を使うことが多いですね。</p>

<p><strong>白石</strong>: ピクセルグリッドのお二人は、3年前とほぼ変わらない、ということでしたね。</p>

<p><strong>小原</strong>: そうですね。今のところSketchは使っていません。</p>

<p>インブラウザデザインは、最終的な成果物を確認しながらできるというのはとても良いのですが、デザインをより良くするという視点で考えると、確認と改善をするためにコードを書かないといけないので、その分時間がかかってしまうと感じています。</p>

<p>ある程度出来上がってからの調整を行うにはいい方法だと思いますが、UIデザインの初期段階だとやはりツールを使ったほうがデザインを素早く行えるかなと。使い分けが大事だと思います。</p>

<p><img src="/wp-content/uploads/2017/04/e47684ae098fd27a22bcf770a9381fc9.jpg" alt="" width="640" height="411" class="aligncenter size-full wp-image-22906" srcset="/wp-content/uploads/2017/04/e47684ae098fd27a22bcf770a9381fc9.jpg 640w, /wp-content/uploads/2017/04/e47684ae098fd27a22bcf770a9381fc9-300x193.jpg 300w, /wp-content/uploads/2017/04/e47684ae098fd27a22bcf770a9381fc9-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>高津戸</strong>: ぼくらは受託のお仕事が中心だから、というのもあると思います。お客様からの要望を聞いて、UIデザインを提案して…っていうフローが重要なので、可能な限り素早くUIデザインを改善できる形に落ち着くんだと思います。</p>

<p>あと、<strong>お客様からのニーズに細かく対応していくとなると、CSSフレームワークとかは邪魔になってしまうことが多い</strong>。</p>

<p><strong>小原</strong>: そうですね。CSSフレームワークはあるレベルまでは便利なのですが、そこを超えて「カスタマイズ」の域に達してしまうと、途端に作業が大変なものになってしまいます。</p>

<p><strong>白石</strong>: それはわかる。ぼくらが作っているTechFeedというサービスでも、現在IonicというUIフレームワークを使っているのですが、<strong>「<code>ionic-hack.scss</code>」っていうファイルに闇のようなコードを詰め込んでいます(笑)</strong>。</p>

<p><strong>榊原</strong>: 私もBootstrap使ってた時、「<code>bootstrap-override.scss</code>」ってファイルを作ってましたよ(笑)。</p>

<p><strong>白石</strong>: フレームワークを使うか使わないか、って話、些細なことのように思われがちですが、結構大事な話ですよね。</p>

<p><strong>高津戸</strong>: ぼくらも、社内だったりプロジェクト単位だったりでフレームワークのようなものを持ってはいるんです。先程申し上げたように、レゴブロックを組み合わせて作る要領で構築を行えるように、ですね。</p>

<p>一般的なCSSフレームワークを使うとなると、まずいらないコードが大量についてきて、そういうコードを捨てるところから始めたくなってしまいます。 不要なコードがたくさんある、というのはプロジェクト全体の見通しの点でも、コードのメンテナンスの上でもよくないですしね。</p>

<p><strong>白石</strong>: なるほど、プロジェクト内で再利用できる部分などについては、きちんとフレームワーク化、もっというとコンポーネント化しているという話ですね。 では、いよいよ最後のお題として、今日の主題である「Web Components時代のCSS設計」について話しましょうか。</p>

<h2>Web Componentsって…なに？</h2>

<p><strong>白石</strong>: ではまず、コンポーネント指向とWeb Componentsについて、榊原さんに簡単に説明をお願いしたいと思います。</p>

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

<p><strong>榊原</strong>: はい、では<a href="https://speakerdeck.com/rdlabo/web-components-css-design" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちらのスライド（Webコンポーネント時代のCSSデザイン）</a>をご覧ください。</p>

<p>これはHTML5 ExpertsのWebサイトなのですが、よくみると同じようなデザインパーツが使いまわされていますよね。そういったデザインパーツを共通規格化するのがコンポーネント指向です。使い回し、というとちょっと表現悪いので、「再利用性を高める」といったりしています。</p>

<p><img src="/wp-content/uploads/2017/04/webComponents-02.jpg" alt="" width="600" height="450" class="aligncenter size-full wp-image-22894" srcset="/wp-content/uploads/2017/04/webComponents-02.jpg 600w, /wp-content/uploads/2017/04/webComponents-02-300x225.jpg 300w, /wp-content/uploads/2017/04/webComponents-02-207x155.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p>例えば、そういう思想を理論化したものとして<a href="http://bradfrost.com/blog/post/atomic-web-design/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Atomic Design</a>があります。</p>

<p>デザインのパーツを原子、分子、生体、テンプレート、ページという粒度で構成していく。 コンポーネントの再利用については、こういったアイデアが提案されて、試行錯誤されてきました。</p>

<p>（榊原補足：厳密には、Atomic Designは粒度毎のコミュニケーションとワークフローデザイン論ですので、「コンポーネント指向の理論」という見方は一側面となります）</p>

<p><img src="/wp-content/uploads/2017/04/slide-3-640x480.png" alt="" width="600" height="450" class="aligncenter size-large wp-image-22824" srcset="/wp-content/uploads/2017/04/slide-3.png 640w, /wp-content/uploads/2017/04/slide-3-300x225.png 300w, /wp-content/uploads/2017/04/slide-3-207x155.png 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p>しかし、実際にコンポーネントの再利用を実践するにあたっては、これまではフレームワークや、CSSのクラス名などをやりくりして乗り切っていたわけです。</p>

<p><img src="/wp-content/uploads/2017/04/webComponents-03.jpg" alt="" width="600" height="369" class="aligncenter size-full wp-image-22895" srcset="/wp-content/uploads/2017/04/webComponents-03.jpg 600w, /wp-content/uploads/2017/04/webComponents-03-300x185.jpg 300w, /wp-content/uploads/2017/04/webComponents-03-207x127.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p>こうした問題を抜本的に解決すべく、標準技術として提案されているのがWeb Componentsです。 Web Componentsは、端的にいうと自作のタグを作れる技術です。</p>

<p><img src="/wp-content/uploads/2017/04/slide-5-640x480.png" alt="" width="600" height="450" class="aligncenter size-large wp-image-22826" srcset="/wp-content/uploads/2017/04/slide-5.png 640w, /wp-content/uploads/2017/04/slide-5-300x225.png 300w, /wp-content/uploads/2017/04/slide-5-207x155.png 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p>Web Componentsは、Custom Elements、Templates、HTML Imports、Shadow DOMと言った要素技術から成り立っています。</p>

<p><img src="/wp-content/uploads/2017/04/slide-6-640x480.png" alt="" width="600" height="450"class="aligncenter size-large wp-image-22827" srcset="/wp-content/uploads/2017/04/slide-6.png 640w, /wp-content/uploads/2017/04/slide-6-300x225.png 300w, /wp-content/uploads/2017/04/slide-6-207x155.png 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p>ブラウザによっても、要素技術によっても対応状況には差がありますが、着実に実装は進んでいますし、Polyfillを使うとほとんどの環境下で利用することができます。近い将来、あらゆる環境でWeb Componentsが利用できるようになるのは間違いないでしょう。</p>

<p><img src="/wp-content/uploads/2017/04/webComponents-04-1.jpg" alt="" width="600" height="432" class="aligncenter size-full wp-image-22898" srcset="/wp-content/uploads/2017/04/webComponents-04-1.jpg 600w, /wp-content/uploads/2017/04/webComponents-04-1-300x216.jpg 300w, /wp-content/uploads/2017/04/webComponents-04-1-207x149.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" />
<img src="/wp-content/uploads/2017/04/webComponents05.jpg" alt="" width="600" height="322" class="aligncenter size-full wp-image-22899" srcset="/wp-content/uploads/2017/04/webComponents05.jpg 600w, /wp-content/uploads/2017/04/webComponents05-300x161.jpg 300w, /wp-content/uploads/2017/04/webComponents05-207x111.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<h2>Web Components時代のCSS設計</h2>

<p><strong>白石</strong>: 榊原さん、簡潔なご説明、ありがとうございました。さて、こうして近い将来Web Componentsの普及が見込めるという状況において、CSS設計などにどう影響するかをお聞きしたいのですが…そもそもWeb Componentsってどう使われるんでしょうね。</p>

<p><strong>榊原</strong>: いきなり世界がすべてWeb Componentsになることはないと思うんです。例えば昔はやった「ブログパーツ」みたいなもの、以前はiframeで作られていましたが、そういうものがWeb Componentsという形で流通して使われるようになるとか、そういうところから使われ始めるんじゃないかと。</p>

<p><strong>白石</strong>: 広く再利用可能なパーツが、Web Componentsによって流通しやすくなるんじゃないかということですね。</p>

<p><strong>榊原</strong>: そうですね、例えば<a href="https://www.webcomponents.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WEBCOMPONENTS.ORG</a>というサイトでは、そういうコンポーネントが共有されていますので、これをサイト制作やアプリ開発に一部利用していくとか、そういうあたりから使われていくんじゃないかと。</p>

<p><img src="/wp-content/uploads/2017/04/985160f44912dcf9d52d8a3b71ee9a2e.jpg" alt="" width="640" height="423" class="aligncenter size-full wp-image-22907" srcset="/wp-content/uploads/2017/04/985160f44912dcf9d52d8a3b71ee9a2e.jpg 640w, /wp-content/uploads/2017/04/985160f44912dcf9d52d8a3b71ee9a2e-300x198.jpg 300w, /wp-content/uploads/2017/04/985160f44912dcf9d52d8a3b71ee9a2e-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>白石</strong>: では、Web ComponentsはCSS設計にどう影響を与えるでしょう？</p>

<p><strong>高津戸</strong>: Web Componentsになったからいきなり変わるということでもなくて、すでに変化は始まっているとは思うんですよね。</p>

<p>例えば<a href="http://getbem.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">BEM</a>や<a href="https://smacss.com/ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SMACSS</a>などは、クラスの命名規則やカテゴライズによって、スタイルの再利用性や独立性を高めています。こういう手法を採用してWebアプリを構築している場合、すでにそれはコンポーネント指向的なCSS設計を始めていると言ってもいいんじゃないかな、と思います。</p>

<p><strong>白石</strong>: HTML5Experts.jpに寄稿してくださった<a href="https://html5experts.jp/takazudo/21946/" data-wpel-link="internal">Enduring CSS</a>などもそうでしょうか？</p>

<p><strong>高津戸</strong>: そうですね。Enduring CSSは、NamespaceやModuleという考え方を取り入れており、Namespaceごとにアセットを分離するよう設計していくのが特徴です。</p>

<p>そうすることで、例えばあるページが不要になった場合、Namespaceに対応するディレクトリごとバッサリと削除してしまえる。そのように分離して管理するということがECSSの目指す設計です。</p>

<p><strong>白石</strong>: なるほど。ほかには、コンポーネント指向に関連して、どのようなアプローチが取られていると思いますか？</p>

<p><strong>高津戸</strong>: 私自身はまだあまり触っていないのですが、やはり、Reactなどのコンポーネント指向のJSフレームワークの存在を抜きにしては語れないと考えています。</p>

<p>例えば、<a href="https://speakerdeck.com/vjeux/react-css-in-js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS in JS</a>や<a href="https://github.com/css-modules/css-modules" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Modules</a>は、CSSのルールを全体に当てるのではなく、コンポーネント内だけに当てるのが第一であるという思想を実装に落としこんだ一つの形であると言っていいかなと。</p>

<p>現時点でも、こういった技術を取り入れることで、コンポーネントを意識した設計が行えるだろうとは思います。これらを例えばReactと合わせて使うことで、CSSが従来抱えていた問題を解決し、コンポーネント指向な開発と相性のいいCSS設計を進められるんじゃないかな、と期待しています。</p>

<p><img src="/wp-content/uploads/2017/04/d4da1a3c6453ef13a3cb52b9db93d971.jpg" alt="" width="640" height="397" class="aligncenter size-full wp-image-22909" srcset="/wp-content/uploads/2017/04/d4da1a3c6453ef13a3cb52b9db93d971.jpg 640w, /wp-content/uploads/2017/04/d4da1a3c6453ef13a3cb52b9db93d971-300x186.jpg 300w, /wp-content/uploads/2017/04/d4da1a3c6453ef13a3cb52b9db93d971-207x128.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>白石</strong>: Angularなんかも、フレームワークの機能として、コンポーネントごとにCSSを分離してくれますよね。私も使っていますが、BEMみたいに命名規約に頼らずにスタイルをカプセル化できるので、クラス名が短いままでも他の部分との衝突を考えなくてすむので気楽です。</p>

<p><strong>榊原</strong>: はい、Angularを普通に使うと、CSSがコンポーネントごとにカプセル化されますね。Shadow DOMと似たような分離の仕組みをフレームワークで実現していますね（筆者注: AngularはShadow DOMを直接扱うことも可能）。</p>

<p><strong>白石</strong>: 榊原さんは、<a href="http://ionicframework.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a> (AngularをベースとしたUIフレームワーク。解説記事は<a href="https://html5experts.jp/rdlabo/22296/" data-wpel-link="internal">こちら</a>)や<a href="https://ja.onsen.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>（ReactやAngularなど様々なフレームワークと合わせて使えるUIフレームワーク。解説記事は<a href="https://html5experts.jp/n_matagawa/20766/" data-wpel-link="internal">こちら</a>）などの、コンポーネント指向のUIフレームワークも活用されてらっしゃいますよね。</p>

<p><strong>榊原</strong>: はい、そうですね。Ionicなどで素早くUIを構築してしまって、あとはブラウザ上でデザインしていく…というフローで最近はデザインと開発を行っています。</p>

<p><strong>白石</strong>: BootstrapやFoundationなどのCSSフレームワークをベースに素早くUIを作って、あとはブラウザ上でいじる…というのと同様の手法でアプリケーションのデザインを行っているわけですね。</p>

<p>となると結局また、「CSSフレームワークを使うか否か」という先ほどの話と同様に「汎用的なコンポーネントライブラリを使うか否か」という話も出てきそうです。</p>

<p>とはいえ、「外部のコンポーネントを全く使わない」という選択肢もないと思うんですよね。例えばピクセルグリッドさんでも、jQuery UIのDatepicker（日付選択ダイアログ）なんかは使ってたんじゃないかと思うんですが、結局そのデザインカスタマイズなどはどうしてらっしゃったんでしょう？</p>

<p><strong>小原</strong>: 実はDatepickerについても、ぼくら自作していたので…(笑)。</p>

<p><strong>白石</strong>: ええっ！それはすごい。</p>

<p><strong>小原</strong>: もちろん、外部のUIパーツとか、全く使わないわけじゃないですよ。お客様のニーズを満たせるもの、自分たちが求めるクオリティを満たすものがあるかどうかまずは探してみて、なければ自分たちで作るって感じですね。</p>

<p>&#8230;</p>

<h2>編集後記</h2>

<p>というかんじで、イベントは盛況のうちに終了いたしました。その後の懇親会にもかなりの人数の方々が参加され、Webエンジニア同士の交流も大いに盛り上がりました。HTML5Experts.jpは、今後もこうしたイベントを開催していきますので、ご期待ください。</p>

<p><img src="/wp-content/uploads/2017/04/05fb7057bc4d7315b6d7d47155d2989c.jpg" alt="" width="640" height="407" class="aligncenter size-full wp-image-22902" srcset="/wp-content/uploads/2017/04/05fb7057bc4d7315b6d7d47155d2989c.jpg 640w, /wp-content/uploads/2017/04/05fb7057bc4d7315b6d7d47155d2989c-300x191.jpg 300w, /wp-content/uploads/2017/04/05fb7057bc4d7315b6d7d47155d2989c-207x132.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>最後に、イベントの様子を書き起こしつつぼくが感じた、今回の結論めいたものを最後に記したいと思います。</p>

<p>そもそもなぜWebにコンポーネント化が求められているのかというと、その理由の一つに「<strong>再利用性</strong>」があります。そしてその再利用性は、「プロジェクトを横断した、汎用的な再利用性」と「プロジェクト内における再利用性」の2種類が考えられます。</p>

<p>Web Componentsが普及することのメリットの一つは、<strong>汎用的な再利用性を持つコンポーネントの流通が活発になる</strong>ことでしょう。</p>

<p><a href="http://webcomponents.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WEBCOMPONENTS.ORG</a>に見られるコンポーネントのリポジトリはこれからも増えてくることでしょうし、コンポーネントを有料で販売するというビジネスも早晩現れることでしょう。</p>

<p>そうしたコンポーネントを組み合わせて素早くアプリケーションを開発する、というアプローチは、今後より一般的になると思われます。</p>

<p>ただし、そうした外部ライブラリやフレームワークを使用する際に厄介なのが、<strong>カスタマイズが面倒</strong>という問題です。特に、Shadow DOMはCSSを強くカプセル化しますので、カスタマイズがより困難になる印象もあるかもしれません。</p>

<p>しかし、Web Components (Shadow DOM)には<a href="https://www.html5rocks.com/ja/tutorials/webcomponents/shadowdom-201/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">コンポーネント内部をスタイリングする様々な手段があります</a>。それらを使って「汎用的で、スタイリングも容易なコンポーネント」を開発する手法は、今後ベストプラクティスが模索されていくことと思います。</p>

<p>一方で受託開発のように、先にデザインを綿密に擦り合わせた後に開発に入るようなワークフローの場合、外部のコンポーネントをカスタマイズするコストや、コンポーネント内部の構造を把握するためのコスト（そして多くの場合、完全に把握し切ることはないでしょう）が大きく、<strong>外部ライブラリを利用するメリットを上回ってしまう</strong>ことも考えられます。</p>

<p>その場合は外部ライブラリやフレームワークを使用せず、できるだけプロジェクト内や社内で完結するよう、開発用のアセットを積み上げていく方が優れたアプローチでしょう。その場合でも、Web Componentsの「モジュラリティ」や「カプセル化」、「拡張性」といったメリットは非常に大きいのではないでしょうか。</p>

<p>そして今回の主題である「Web Components」は、まだまだこれからの技術なのは間違いありませんが、一方現場ではとっくにコンポーネント化は必要とされ、実践もされています。</p>

<p>それをより良くWeb標準でサポートするための技術がWeb Componentsであり、多くの人に待ち望まれている重要な技術であることが再確認できたかな、と思いました。</p>

<p><img src="/wp-content/uploads/2017/04/2066ff983ef8c9b69d7cae140a4b0f5d.jpg" alt="" width="640" height="428" class="aligncenter size-full wp-image-22903" srcset="/wp-content/uploads/2017/04/2066ff983ef8c9b69d7cae140a4b0f5d.jpg 640w, /wp-content/uploads/2017/04/2066ff983ef8c9b69d7cae140a4b0f5d-300x201.jpg 300w, /wp-content/uploads/2017/04/2066ff983ef8c9b69d7cae140a4b0f5d-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>
]]></content:encoded>
			</item>
		<item>
		<title>Firefox, Chrome, SafariがCSS Gridに一斉対応ほか──2017年2月と3月のブラウザ関連ニュース</title>
		<link>/myakura/22818/</link>
		<pubDate>Thu, 13 Apr 2017 04:00:44 +0000</pubDate>
		<dc:creator><![CDATA[矢倉 眞隆]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[ブラウザ]]></category>

		<guid isPermaLink="false">/?p=22818</guid>
		<description><![CDATA[連載： WEB標準化動向 (22)2月はブラウザのリリースがなかったのですが、3月にはFirefox 52, Chrome 57, Safari 10.1がリリースされました。いくつかのブラウザに共通して大きな機能追加が...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webstandards-news/" class="series-156" title="WEB標準化動向" data-wpel-link="internal">WEB標準化動向</a> (22)</div><p>2月はブラウザのリリースがなかったのですが、3月にはFirefox 52, Chrome 57, Safari 10.1がリリースされました。いくつかのブラウザに共通して大きな機能追加があったので、まずはそこから紹介します。個々のリリースについては、そのあとで取り上げます。</p>

<h2>Firefox, Chrome, SafariがCSS Gridに一斉対応 <a id="css-grid-in-fx-cr-sf" data-wpel-link="internal"></a></h2>

<p>CSS Grid LayoutがFirefox 52, Chrome 57, Safari 10.1で有効になりました。長らく試験的な実装状態が続いていたのですが、タイミングをはかったかのように一斉に使えるようになりました。</p>

<ul>
<li><a href="https://developers.google.com/web/updates/2017/01/css-grid" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Grid – Table layout is back. Be there and be square.  |  Web  |  Google Developers</a></li>
<li><a href="https://webkit.org/blog/7434/css-grid-layout-a-new-layout-module-for-the-web/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS Grid Layout: A New Layout Module for the Web | WebKit</a></li>
</ul>

<p>CSS Grid Layoutは、かなり強力なレイアウト用の仕様です。
ちょうど、HTML5 Experts.jpのトップページがCSS Gridの説明に都合良さそうなので、ちょっと書きながら紹介しようと思います。</p>

<div id="attachment_22837" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/04/hx-640x427.png" alt="スクリーンショット：HTML5 Experts.jpのトップページ" width="640" height="427" class="size-large wp-image-22837" srcset="/wp-content/uploads/2017/04/hx.png 640w, /wp-content/uploads/2017/04/hx-300x200.png 300w, /wp-content/uploads/2017/04/hx-207x138.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">HTML5 Experts.jpのトップはグリッドレイアウトを意識した見た目になっている</p></div>

<p>HTML5 Experts.jpのトップページは、ロゴやサイドバーなどのブロックが、15pxの間隔をおいて配置されています。<br />
ちょっと線を引いてみましょう。</p>

<div id="attachment_22838" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/04/hxgridlines-640x440.png" alt="スクリーンショット：HTML5 Experts.jpのトップページにグリッドの線をひいた" width="640" height="440" class="size-large wp-image-22838" srcset="/wp-content/uploads/2017/04/hxgridlines.png 640w, /wp-content/uploads/2017/04/hxgridlines-300x206.png 300w, /wp-content/uploads/2017/04/hxgridlines-207x142.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">グリッドのガイド線を引いた。線で区切られた領域に各パーツが収まっているのがよくわかる</p></div>

<p>CSS Gridも同様に、配置する基準となる線を定義し、その線と線で区切られた領域に、コンテンツを配置します。Photoshopでガイドをひいて、その中で矩形選択をするようなかんじでしょうか。</p>

<p>現在のトップページをCSS Gridで書くと、このようなかんじになります。</p>

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

  /* 縦線をひく */
  grid-template-columns: 1fr 290px 430px 290px 1fr;

  /* 横線をひく */
  grid-template-rows: 210px 60px 1fr /* 以降は割愛 */;

  /* 隙間を定義すると、隙間分の線を引かなくてよいので楽 */
  grid-gap: 15px;
}

#logo {
  /* 横の配置、2番目の線（1番目の線は左端）から3番目の線まで */
  grid-column: 2 / 3;

  /* 縦の配置、1番目の線（上端）から2番目の線まで */
  grid-row: 1 / 2;
}
...</pre><p></p>

<p>枠だけですが、以下にコードを置いてみました。</p>

<ul>
<li><a href="https://jsfiddle.net/u73q559r/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://jsfiddle.net/u73q559r/</a></li>
</ul>

<p>CSS Gridは機能が強力なぶん、構文も複雑です。先程書いたのは一例で、ほかにも線に名前をつけたり、アスキーアートのような構文でグリッドのセルを定義できたりします。</p>

<p>ドキュメンテーションやチュートリアルのサイトもすでにあるので、それを参考にしてみましょう。</p>

<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Grids" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Grids &#8211; Learn web development | MDN</a></li>
<li><a href="http://gridbyexample.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Grid by Example</a></li>
<li><a href="http://labs.jensimmons.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Jen Simmons | Labs</a></li>
<li><a href="http://cssgridgarden.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Grid Garden</a></li>
</ul>

<p>このうち、Grid Gardenは、CSS Gridの構文の一部をゲームで学べるサイトです。入門にちょうどよいかと思います。</p>

<p>また、Firefoxの開発者ツールには、CSS Gridインスペクタが搭載されました。グリッドの線や隙間を視覚的に確認できてとても便利です。</p>

<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_grid_layouts" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Examine grid layouts with the CSS Grid Inspector &#8211; Firefox Developer Tools | MDN</a></li>
</ul>

<p>CSS Gridを使う場合、コンポーネントの見た目とレイアウトを、コード上ではっきり分離しないと扱いづらくなるので、マークアップやCSS設計にもいろいろ影響を与えるだろうと感じています。気が向いたら、取り上げるかもしれません。</p>

<h2>Firefox, ChromeではWebAssemblyも有効に <a id="wasm-shipped-in-fx-cr" data-wpel-link="internal"></a></h2>

<p>こちらはFirefoxとChromeのみですが、WebAssemblyが有効になりました。</p>

<p>WebAssemblyについては、清水さんの連載を読んでいただくことにして、説明は割愛します。</p>

<ul>
<li><a href="https://html5experts.jp/chikoski/18964/" data-wpel-link="internal">Webブラウザで高速な演算を可能にする低水準言語asm.jsと、WebAssembly詳解 ― JavaScriptが動く仕組み</a></li>
<li><a href="https://html5experts.jp/chikoski/18980/" data-wpel-link="internal">Webブラウザで高速な演算を可能にする低水準言語asm.jsと、WebAssembly詳解 ― asm.jsの仕組みとコーディング例</a></li>
<li><a href="https://html5experts.jp/chikoski/22494/" data-wpel-link="internal">Webブラウザで高速な演算を可能にする低水準言語asm.jsと、WebAssembly詳解 ― C / C++をasm.jsに変換するツールEmscripten</a></li>
<li><a href="https://html5experts.jp/chikoski/22523/" data-wpel-link="internal">Webブラウザで高速な演算を可能にする低水準言語asm.jsと、WebAssembly詳解 ― asm.jsを高速に動作させる新しいコンパイラーターゲットWASMとは？</a></li>
</ul>

<p>Mozilla Hacksでも2月にWebAssemblyの特集が組まれています。JITコンパイラやアセンブリの話から始まるなど、読み物としても面白いものになっています。</p>

<ul>
<li><a href="https://hacks.mozilla.org/2017/02/a-cartoon-intro-to-webassembly/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">A cartoon intro to WebAssembly</a></li>
<li><a href="https://hacks.mozilla.org/2017/02/a-crash-course-in-just-in-time-jit-compilers/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">A crash course in just-in-time (JIT) compilers</a></li>
<li><a href="https://hacks.mozilla.org/2017/02/a-crash-course-in-assembly/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">A crash course in assembly</a></li>
<li><a href="https://hacks.mozilla.org/2017/02/creating-and-working-with-webassembly-modules/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Creating and working with WebAssembly modules</a></li>
<li><a href="https://hacks.mozilla.org/2017/02/what-makes-webassembly-fast/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">What makes WebAssembly fast?</a></li>
<li><a href="https://hacks.mozilla.org/2017/02/where-is-webassembly-now-and-whats-next/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Where is WebAssembly now and what’s next?</a></li>
</ul>

<p>この特集の他にも、asm.jsと比較しWebAssemblyが速い理由や、WebAssembly Explorerというツールの紹介もされています。</p>

<ul>
<li><a href="https://hacks.mozilla.org/2017/03/why-webassembly-is-faster-than-asm-js/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Why WebAssembly is Faster Than asm.js</a></li>
<li><a href="https://hacks.mozilla.org/2017/03/previewing-the-webassembly-explorer/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Previewing the WebAssembly Explorer</a></li>
</ul>

<p>MDNにもWebAssemblyのドキュメントがまとめられており、日本語訳も有志によって進められているようです。</p>

<ul>
<li><a href="https://developer.mozilla.org/ja/docs/WebAssembly" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebAssembly | MDN</a></li>
<li><a href="https://developer.mozilla.org/ja/docs/WebAssembly/Concepts" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebAssembly のコンセプト</a></li>
</ul>

<h2>Firefox 52 <a id="firefox-52" data-wpel-link="internal"></a></h2>

<p>3月7日に、Firefox 52がリリースされました。Captive portal（Wi-Fiサービスのログインページ）の検出が追加されたり、HTTPなページでパスワードを扱っている場合警告が出たり、Flash以外のNPAPIプラグイン（AcrobatやSilverlight、Javaなど）が無効にされたりと、セキュリティ周りの機能強化が目立ちます。</p>

<p>とはいえ、フロントエンド周りの機能強化も、先述したCSS GridとWebAssemblyサポートに加えて、以下のようなものがあります。</p>

<ul>
<li><a href="https://developer.mozilla.org/ja/Firefox/Releases/52" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firefox 52 for developers</a></li>
</ul>

<h3>space-evenly <a id="space-evenly-in-flexbox" data-wpel-link="internal"></a></h3>

<p>Flexboxの<code>justify-content</code>で<a href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>space-evenly</code>という新しい値</a>がサポートされました。</p>

<p><a href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-around" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>space-around</code></a>となにが違うかというと、<code>space-around</code>では連続したアイテム間では空白が左右のそれの倍になってしまうのですが、<code>space-evenly</code>では「even（均等）」と名のつく通り、空白の大きさが等しくなります。仕様書の画像がわかりやすいです。</p>

<div id="attachment_22842" style="width: 514px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/04/space-around-vs-space-evenly.png" alt="justify-contentプロパティなどに指定する各種値のレンダリングの違いを比較した画像" width="504" height="218" class="size-full wp-image-22842" srcset="/wp-content/uploads/2017/04/space-around-vs-space-evenly.png 504w, /wp-content/uploads/2017/04/space-around-vs-space-evenly-300x130.png 300w, /wp-content/uploads/2017/04/space-around-vs-space-evenly-207x90.png 207w" sizes="(max-width: 504px) 100vw, 504px" /><p class="wp-caption-text">space-evenlyのほうがspace-aroundよりも使われそう</p></div>

<h3>CSS Color Level 4の<code>rgb()</code>と<code>hsl()</code> <a id="color4-notation" data-wpel-link="internal"></a></h3>

<p>CSS Color Level 4の<code>rgb()</code>, <code>hsl()</code>関数表記が実装されました。「もとからあったじゃないか」と思う方しかいないと思いますが、CSSお得意の構文変更です。</p>

<p>これまでの<code>rgb()</code>や<code>hsl()</code>は、それぞれの色の値をカンマで指定していました。</p>

<p>それが空白区切りになりました。</p>

<p></p><pre class="crayon-plain-tag">color: rgb(128 90 0);</pre><p></p>

<p>また、整数値しか取れなかったのが小数も受け入れるようになりました。<code>hsl()</code>については、これまで数値でしか指定できなかった色相を、角度（<code>deg</code>など）を使って指定可能になりました。</p>

<p></p><pre class="crayon-plain-tag">color: rgb(111.4 128 0.0);
color: hsl(120deg 100% 30%);</pre><p></p>

<p>そして、これまで別の関数表記だった<code>rgba()</code>, <code>hsla()</code>の機能を統合し、<code>rgb()</code>, <code>hsl()</code>からアルファを指定できるようになりました。アルファはスラッシュで区切り指定します。また、これまでは数値のみの指定でしたが、パーセンテージでも指定可能となりました。</p>

<p></p><pre class="crayon-plain-tag">color: rgb(128 90 0 / 50%);</pre><p></p>

<p>構文が変わったと書きましたが、互換性という名目で古い構文も引き続き定義されるので、移行しなければならないというわけではありません。</p>

<h3>ES2016, ES2017のサポート <a id="es-in-spidermonkey" data-wpel-link="internal"></a></h3>

<p>JavaScriptでは、ES2016やES2017の以下の機能が実装されました。</p>

<ul>
<li>Exponentiation operator（<code>**</code>）</li>
<li>Destructuring rest parameters</li>
<li>Async Functions（<code>async</code>/<code>await</code>）</li>
<li>Trailing commas in functions</li>
</ul>

<p>ES2016以降の実装について、ここ数リリースでのまとめも公開されています。</p>

<ul>
<li><a href="https://blog.mozilla.org/javascript/2017/02/22/ecmascript-2016plus-in-firefox/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ECMAScript 2016+ in Firefox</a></li>
</ul>

<p>現在はまだ提案であるAsync Iteratorなどの実装も進められているようです。楽しみですね。</p>

<h3>新しいResponsive Design Modeになった開発者ツール <a id="rdm-in-fx-devtools" data-wpel-link="internal"></a></h3>

<p>開発者ツールでは、Responsive Design Modeが強化され、モバイル環境のエミュレーションがより細かく行えるようになりました。</p>

<ul>
<li><a href="https://hacks.mozilla.org/2016/11/new-responsive-design-mode-rdm-lands-in-firefox-dev-tools/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">New Responsive Design Mode: RDM Lands in Firefox Dev Tools</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Tools/Responsive_Design_Mode" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Responsive Design Mode &#8211; Firefox Developer Tools | MDN</a></li>
</ul>

<p>UIが変わったほか、回線環境のスロットリングと、デバイスピクセル比のカスタマイズ、デバイスのプリセットなどが追加されました。回線のスロットリングができるようになったので、回線速度のレンダリングへの影響を検証しやすくなりました。</p>

<div id="attachment_22839" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-01.15.51-640x395.png" alt="スクリーンショット：Firefox 52の開発者ツールで登場した新しいResponsive Design Mode" width="640" height="395" class="size-large wp-image-22839" srcset="/wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-01.15.51.png 640w, /wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-01.15.51-300x185.png 300w, /wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-01.15.51-207x128.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Nexus 5をエミュレートすると、画面サイズやデバイスピクセル比はもちろん、UA文字列も切り替わる</p></div>

<p>ほか、Responsive Design Modeではありませんが、アニメーションパネルではイージングの視覚化も行われるようになりました。</p>

<ul>
<li>
<a href="https://hacks.mozilla.org/2016/11/visualize-animations-easing-in-devtools/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Visualize animations easing in DevTools</a></li>
</ul>

<p>同等の機能はChrome DevToolsにもだいぶ前からあるのですが、Escを押して現れるドロワーを開き、そこからAnimationタブを開くなど、機能への動線がよくなかったりします。</p>

<h2>Chrome 57 <a id="chrome-57" data-wpel-link="internal"></a></h2>

<p>Chrome 57がリリースされました。</p>

<ul>
<li><a href="https://developers.google.com/web/updates/2017/03/nic57" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">New in Chrome 57</a></li>
</ul>

<p>フロントエンド周りの機能強化は、先述したCSS GridとWebAssemblyサポート以外に以下のようなものがあります。</p>

<h3>text-decorationのサブプロパティが実装 <a id="text-decoration-props" data-wpel-link="internal"></a></h3>

<p>CSS Text Level 3の<code>text-decoration</code>プロパティが実装され、下線の色やスタイルを変更可能になりました。</p>

<p>これまでは<code>border</code>を使ってなんとかするハックだったので、これはうれしいですね。</p>

<p></p><pre class="crayon-plain-tag">/* リンクの下線を青色の点線にする */
:any-link {
  text-decoration-line: underline;
  text-decoration-style: dotted;
  text-decoration-color: slateblue;
}
/* text-decorationがショートハンドになったため、以下のようにも書ける */
:any-link {
  text-decoration: underline dotted slateblue;
}</pre><p></p>

<p>Firefoxがだいぶ前から（接頭辞つきですが）サポートしており、続いて何年か前にSafariが、そして今回ようやくChromeでもサポートされました。</p>

<p>日本語では特に影響がありませんが、<code>text-decoration-skip</code>プロパティも一部が実装されました。<code>text-decoration-skip: ink</code>と指定すると、ディセンダなどのある文字（gやjなど）に下線が重なるのを防げます。</p>

<div id="attachment_22840" style="width: 460px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-19.34.17.png" alt="text-decoration-skip: inkの例。「HTML5 Experts.jp」という文字の「p」と「j」のディセンダを避けて下線が引かれている" width="450" height="137" class="size-full wp-image-22840" srcset="/wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-19.34.17.png 450w, /wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-19.34.17-300x91.png 300w, /wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-19.34.17-207x63.png 207w" sizes="(max-width: 450px) 100vw, 450px" /><p class="wp-caption-text">フォントサイズが大きいととくにうれしい</p></div>

<h3>caret-colorプロパティ <a id="caret-color" data-wpel-link="internal"></a></h3>

<p>CSS UIで定義されている<a href="https://drafts.csswg.org/css-ui/#caret-color" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>caret-color</code>プロパティ</a>がサポートされました。キャレットの色を変更できます。</p>

<p></p><pre class="crayon-plain-tag">input {
  caret-color: orange;
}</pre><p></p>

<p>ファンシーな機能ではありますが、入力欄の色が薄い色になったときにコントラスト比が保てないという問題への対応でもあります。</p>

<div id="attachment_22841" style="width: 346px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-19.41.19.png" alt="スクリーンショット：caret-colorにorangeを指定したinput要素" width="336" height="58" class="size-full wp-image-22841" srcset="/wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-19.41.19.png 336w, /wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-19.41.19-300x52.png 300w, /wp-content/uploads/2017/04/Screen-Shot-2017-04-11-at-19.41.19-207x36.png 207w" sizes="(max-width: 336px) 100vw, 336px" /><p class="wp-caption-text">細くて見えないかも。なおキャレットの太さなどを指定するプロパティはありません</p></div>

<h3>V8 5.7ではpadStart/padEndが実装、高速化も <a id="v8-improvements" data-wpel-link="internal"></a></h3>

<p>Chromeのバージョンにあわせ、V8も5.7になりました。</p>

<ul>
<li><a href="https://v8project.blogspot.jp/2017/02/v8-release-57.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">V8 Release 5.7</a></li>
</ul>

<p>新機能については、文字列の詰めを行う<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/padStart" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>padStart()</code></a>と<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>padEnd()</code></a>の導入が主でしょうか。</p>

<p>以前、<code>padStart()</code>と同様のことをする<a href="https://cpplover.blogspot.jp/2016/03/npmkik.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">left-padというモジュールが消えてnpmが大混乱になった</a>ので、Nodeで使えると依存を減らせて嬉しいかもしれません。</p>

<p><code>padStart()</code>, <code>padEnd()</code>は、Firefox 48, Safari 10で実装済みで、EdgeでもCreators UpdateのEdge（EdgeHTML 15）でサポートされます。</p>

<p>他に取り上げられているのは、パフォーマンスの向上です。
正規表現周りのパフォーマンス向上については、独立したエントリが1月に公開されています。</p>

<ul>
<li><a href="https://v8project.blogspot.jp/2017/01/speeding-up-v8-regular-expressions.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Speeding up V8 Regular Expressions</a></li>
</ul>

<p>また、V8チームはここ数バージョンほどES2015の実行速度改善に取り組んでおり、そのエントリも公開されています。</p>

<ul>
<li><a href="https://v8project.blogspot.jp/2017/02/high-performance-es2015-and-beyond.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">High-performance ES2015 and beyond</a></li>
</ul>

<p>V8 5.7時点でES5と比べた実行速度差は、平均で1.86倍、中央値で1.3倍にまで減少したとのことです。</p>

<p>まだ差があるため「やっぱりBabelか…」という話になるかもしれません。</p>

<p>が、コンパイル後のES5のコードの容量が増大すれば、JavaScriptのパースなどにコストがかかり、Webアプリの最初のレンダリングまでの時間に影響します。コードの容量と実行速度、どちらも与える影響を鑑みた上で選択できるといいですね。</p>

<h2>Safari 10.1リリース <a id="safari-10_1" data-wpel-link="internal"></a></h2>

<p>macOS 10.12.4とiOS 10.3がリリースされ、Safari 10.1もリリースとなりました。Safari 10.1で新しく入った機能が、AppleのドキュメンテーションやWebKitのブログで紹介されています。</p>

<ul>
<li><a href="https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_1.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Safari 10.1</a></li>
<li><a href="https://webkit.org/blog/7477/new-web-features-in-safari-10-1/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">New Web Features in Safari 10.1</a></li>
</ul>

<p>いくつか紹介します。</p>

<h3>Custom Elements v1 <a id="safari-custom-elements-v1" data-wpel-link="internal"></a></h3>

<p>Safari 10のShadow DOM v1サポートに引き続き、Custom Elements v1もサポートされました。</p>

<ul>
<li><a href="https://webkit.org/blog/7027/introducing-custom-elements/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Introducing Custom Elements</a></li>
</ul>

<h3>HTMLのForm Validation <a id="safari-html-form-validation" data-wpel-link="internal"></a></h3>

<p>ついにHTMLのForm ValidationがSafariでもフルサポートされました。</p>

<ul>
<li><a href="https://webkit.org/blog/7099/html-interactive-form-validation/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML Interactive Form Validation</a></li>
</ul>

<p>HTML5から<code>type=email</code>といった新しい<code>input</code>の型や、<code>required</code>属性、<code>pattern</code>属性など、フォームの入力内容を調査する属性が導入されました。</p>

<p>検証項目に違反する入力内容があると、フォーム送信前にブロックされるという仕様なのですが、Safariは長らく対応していませんでした。DOMから入力内容がvalidかをチェックはできるのですが、UI上のサポートがなかったのがうれしくありません。</p>

<p>Safari 10.1では、他のブラウザと並んでフォーム送信時のチェック（ブロック）を行うようになったほか、好きなタイミングでフォームの検証状態を通知できる<code>reportValidity()</code>メソッドも一緒にサポートしました。こちらはBlinkのみで長らくサポートされていたもので、最近になりFirefoxもサポートしたものです。</p>

<h3>広色域の色指定 <a id="safari-css-wide-gamut-colors" data-wpel-link="internal"></a></h3>

<p>新しいデバイスにはDisplay P3という色域の広いディスプレイを導入しているAppleですが、その恩恵をWebコンテンツでも受けられるべく、sRGBを基準としているCSSの色域を拡張する提案を行い、その一部を実装しました。</p>

<ul>
<li><a href="https://webkit.org/blog/6682/improving-color-on-the-web/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Improving Color on the Web | WebKit</a></li>
</ul>

<p>実装されたのは、<a href="https://drafts.csswg.org/css-color/#color-function" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>color()</code>関数</a>とメディアクエリの<a href="https://drafts.csswg.org/mediaqueries-4/#color-gamut" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>color-gamut</code>媒体特性</a>です。</p>

<p><code>color()</code>は、RGB各色の度合いを色域を含め指定できる新しい関数です。</p>

<p></p><pre class="crayon-plain-tag">color(display-p3 0 1.0 0)</pre><p></p>

<p>このように指定すると、P3ディスプレイでの緑100%となり、sRGBでは表現できない、より濃い緑を発色できます。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WEB標準化動向]]></series:name>
	</item>
		<item>
		<title>抽象化を避けるCSS設計方法論「Enduring CSS」 第2回</title>
		<link>/takazudo/22123/</link>
		<pubDate>Fri, 27 Jan 2017 00:00:36 +0000</pubDate>
		<dc:creator><![CDATA[高津戸壮]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[ECSS]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<hr />

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

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

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

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

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

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

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

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

<h2>ECSSの特徴</h2>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<h3>Component</h3>

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

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

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

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

<h2>Moduleの粒度</h2>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>今回は、ECSSの考え方の概要と、Moduleについて解説しました。次回は、Namespaceとアセットの分離について解説します。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Enduring CSS]]></series:name>
	</item>
	</channel>
</rss>
