*

Angular Material 初心者のための徹底解説

公開日: : 投稿者: フロントエンド

皆さんは普段Webアプリケーションを作るとき、デザインはどうしていますか?
私はよくBootstrapを使っていました。Bootstrapはデザインが得意ではない私でもレスポンシブデザインが簡単に作れるからです。
ですが、最近ではBootstrapのようなフラットデザインではなく、「Material Design(マテリアルデザイン)」を使うようになってきました。
その理由は、「Material Design」はユーザが操作を直感的に認識でき、操作に対してアニメーションで反応してくれる、という特徴があるからです。
「Material Design」の特徴についての詳細は、下記公式ドキュメントを読んで下さい。
公式ドキュメント: Introduction – Material design – Google design guidelines

今回はそんな「Material Design」をAngularJSで使用できるUIコンポーネントライブラリである「Angular Material」を初心者の方向けに徹底解説します。

Angular Materialってナニ?

2014年のGoogle I/Oで、新しいデザインガイドライン「Material Design」と、それに準拠したWeb Componentsのラッパーライブラリである「Polymer」が発表されました。
今後のデザインは「Polymer」に限らず、「Material Design」が標準になることを感じさせてくれたのは記憶に新しい出来事でした。
「Angular Material」はそんな「Material Design」に準拠した「Polymer」のUIコンポーネントと同様のコンポーネントをAngularJSで使用できるようにライブラリ化されたものです。

公式サイト: Angular Material – Introduction

ちなみにAngular Materialのプロジェクトは、Googleがサポートしています。
また、Angular Materialはつい先日の2015年12月14日にバージョン1.0.0が正式リリースされ、2016年2月8日現在では、バージョン1.0.5となっています。

AngularJS + Polymerじゃダメなの?

「既にPolymerがあるんだから、Angular MaterialじゃなくてPolymerでいいじゃん」という人もいるかもしれません。
たしかにAngularJSにPolymerを組み込むことは可能です。しかもそこそこ動きます。
ですが、オススメはしません。
なぜなら、AngularJSの特徴の一つである「双方向データバインディング」が使えなくなってしまうからです。

※「双方向データバインディング」とは、データとUIを双方向に自動で結びつけてくれる機能です。
イマイチ文章で分からない人は、AngularJSの公式ページで実際に試して見て下さい。

公式ページの「The Basics」にある「Name」の入力欄に文字を入力すると、リアルタイムに入力した文字が画面へと出力されるかと思います。
AngularJSで双方向データバインディングの設定をするためには「ng-model」属性を使いますが、この属性を使用できるのは、<input>/<select>/<textare>の3つのエレメントだけなのです。
しかし、Polymerのエレメントはテキスト入力に使う<paper-input>を始め、「paper-◯◯」といった独自のものを使用するため、「ng-model」を付与しても双方向データバインディングのディレクティブが使えないのです。
普段からAngularJSを使っている私にとっては「双方向データバインディング」が使えないという問題は致命的に思えてしまい、Polymerは断念しました。
そんな時に見つけたのが、「Angular Material」です。
Angular Materialであれば、AngularJSの機能を全て使うことができ、なおかつMaterial Designで画面を作成できるのです。

Angular Materialを使ってみよう

では、ここからは入門編として、Angular Materialの導入方法から比較的によく使う入力部品について、作り方を説明していきたいと思います。
手順としては、最初に最低限必要なCSSとJavascriptの説明と、AngularJSでAngular Materialを利用できるようにモジュールの読み込み方法を紹介します。
その後、具体例として「テキスト入力欄」、「セレクトボックス」、「ラジオボタン」、「テキストエリア入力欄」の作成方法をご紹介します。
前提として各画面や用語などはEclipseというIDEをベースとした説明になります。
また、今回はJavaのプロジェクト上で動くことを前提に進めさせてもらいます。が、基本的にはAngular MaterialはJavascriptなのでサーバ側の記述言語には依存しませんので、その辺りはお好きな言語に読み替えてください。

必要なCSSとJavascriptを読み込む

まず、はじめにJavaのプロジェクトのwar直下のindex.htmlのHEADとBODYに最低限必要なCSSとJavascriptを書きます。

<最低限必要なCSS>
・angular-material.min.css
<最低限必要なJavascript>
・angular.min.js
・angular-animate.min.js
・angular-aria.min.js
・angular-material.min.js
※Angular Materialを動かすには、AngularJS 1.3以上が必須です。
必要なCSSもJavascriptもWeb上で一般公開されているので、導入はそのURLを指定するだけで非常に簡単です。
進め方としては、このindex.htmlにいろいろとコードを追加していきたいと思います。

プロジェクト構成

AngularJSを使えるように設定する

最低限必要なライブラリは読み込みました。しかし、それだけではAngularJSは使用できませんので、AngularJSを使えるようにindex.htmlを変更しましょう。 まずは、Angularアプリケーションのルート設定をします。 ルート設定は、Angularアプリケーションのディレクティブを適用する開始位置を宣言するものです。 なので、一番親の要素にあたる<html>に属性「ng-app」を追加します。

次にAngularJSの作法に則り、Angular Materialのモジュールを読み込みます。
<body>に下記の<script>を追加します。

これで、最低限の準備は完了です。

テキスト入力欄を作ってみる

それでは、テキスト入力欄を作ってみましょう。
テキスト入力欄は通常のHTMLの<input type=”text” />を使用します。
下記のコードをindex.htmlのBODY内に加えて下さい。

<md-input-container>はAngular Materialの入力部品においては、ほぼ必須の親要素です。
これが無いと正しく表示されません。覚えておきましょう。

公式URL: Angular Material – Directives > mdInputContainer

<label>内の文字列が入力欄のプレースホルダーとラベルの役割を担ってくれます。
では、ブラウザから表示を確認してみましょう。
下記のようなテキスト入力欄が表示されるかと思います。

text-input

URL:http://angular-material-start-guide-dot-apps-gcp-sample.appspot.com/input-text.html

入力欄をクリックすると、Polymerの<paper-input>と同じように動いてくれるのが確かめられると思います。

セレクトボックスを作ってみる

セレクトボックスは、<md-select>を使用します。
index.htmlのBODYに下記のコードを加えて下さい。

今回も<md-input-container>を使います。
通常のHTMLの<select>の使い方とほとんど変わりませんね。
<select>を<md-select>に置き換えて、選択要素である<option>を<md-option>に置き換えるだけです。

公式URL: Angular Material – Directives > mdSelect

では、ブラウザから表示を見てみましょう。
要素未選択時:

select1

要素一覧表示時:

select2

URL: http://angular-material-start-guide-dot-apps-gcp-sample.appspot.com/select-box1.html

選択肢もちゃんと指定したものが表示されていますね。
選択すると、テキスト入力欄同様の動きをするかと思います。

ちょっと寄り道 – レイアウトを少しいじってみる

ここまでの状態では、画面の左上にテキスト入力欄があり、その下にセレクトボックスがあると思います。
ここで一旦レイアウトを変えてみましょう。
この2つの入力欄を横並びにし、画面の中央に配置しましょう。
配置の制御には、”layout”と”layout-align”、”flex”のattributeを使用します。

layout=”row”で、DIV直下にある子要素を横並びに表示することができます。
layout-align=”center”で、DIV直下の子要素を中央に配置することができます。
<md-input-container>にある”flex”で、親要素内でのサイズを指定しています。
今回は、flex=”20”ですので、「max-width:20%」と同じ意味合いとなります。
では、ブラウザから画面を確認してみましょう。
layout1

URL: http://angular-material-start-guide-dot-apps-gcp-sample.appspot.com/select-box2.html

ちゃんとテキスト入力欄とセレクトボックスが横並びで、画面中央に表示されてますね。
”layout”と”layout-align”、”flex”は手軽に要素の配置を設定できるので、覚えておいて損はないと思います。配置のパターンは他にもあるので、下記公式ページを見てみて下さい。

公式URL1: Angular Material – Layout > Layout Containers
公式URL2: Angular Material – Layout > Child Alignment

ラジオボタンを作ってみる

ラジオボタンを作るには、<md-radio-group>と<md-radio-button>を使います。
index.htmlのBODYに下記コードを追加してください。

<md-radio-group>でラジオボタンのグルーピングを行ない、<md-radio-button>でラジオボタンの要素を作ります。
ブラウザからは下記のように見えるかと思います。

radio1

URL:http://angular-material-start-guide-dot-apps-gcp-sample.appspot.com/radio.html

テキストエリア入力欄を作ってみる

ここで紹介する入力部品の最後は、テキストエリアの入力欄です。
テキストエリアの入力欄は、テキスト入力欄同様、標準のHTMLの<textarea>と<md-input-container>を使います。

あまりテキスト入力欄と変わりませんね。
とりあえず表示を確認してみましょう。

textarea

URL:http://angular-material-start-guide-dot-apps-gcp-sample.appspot.com/textarea.html

見た目はテキスト入力欄と変わりませんが、入力欄を選択し、改行したりするとテキストエリアであることが分かるかと思います。
※<textarea>の初期表示行数を設定する”rows”を指定すると、ラベルの位置が悪いので、設定しない方が良いかと思います。

汎用的な入力フォームを作ってみる

ここまでAngular Materialの入力部品についてご紹介してきました。
最後に、3.1?3.7で紹介した入力部品とAngularJSのバリデーション機能を使って、ある汎用的な入力フォームを作ってみましょう。
HTMLの全文は以下のようになりますので、コピペしてみて下さい。

私もまだまだ勉強中ですので、もっと効率的なHTMLコードの書き方がありましたら、ご意見を頂けますと幸いです。
さて、このHTMLコードをブラウザから見てみると、下記のような入力フォームになります。

simpleform

シンプルフォームURL: http://angular-material-start-guide-dot-apps-gcp-sample.appspot.com

まとめ

今回は代表的な入力部品をAngular Materialで紹介しましたが、いかがだったでしょうか?
入力部品について説明しただけですが、簡単に導入から作成までができるのは体感していただけたのではないでしょうか。

記事の冒頭でも触れましたが、Angular Materialは2015年12月14日に正式リリースを迎えたばかりです。
まだまだ認知度は低いかもしれませんが、AngularJSを使う開発者にとってはこれから重宝するものになる確実だと思っています。

吉積情報ではこのような最新の開発手法も積極的に取り入れ、Google Cloud Platform 上での開発を請け負っております。Google Cloud Platformや開発に関する相談・お問い合わせはこちらより宜しくお願い致します。

関連記事

Web ComponentsはじめるならPolymerで

次世代のWebを先取りするPolymer Webサイトの制作に関して、UIの部品化というのは非常に

記事を読む

PAGE TOP ↑