マテリアルデザインのCSSフレームワーク「Materialize」を触ってみた

## Materializeとは

![materialize01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/66bb5be7-2b32-b015-7a93-dd0804110329.png)

[Materialize](https://materializecss.com/)は、Googleが提唱しているデザイン設計体系である「マテリアルデザイン」に準拠したCSSフレームワーク。

Materializeを利用することで、AndroidやGoogle製のアプリで一般ユーザーが慣れ親しんでいる「マテリアルデザイン」のUIに対応したサイトやWebアプリを簡単に制作することができる。

## Materializeの特長

マテリアルデザインに対応したCSSフレームワークとしては、[MUI](https://www.muicss.com/)や、[Material Components for the Web](https://material.io/develop/web)なども人気を集めているが、利用ユーザーの多さや使用実績という面で見ると、Materializeが最もメジャーな存在だと言える。

ReactやAngularといったJavaScriptライブラリとの親和性や、開発環境などの拡張性といった点では他のフレームワークに軍配が上がるが、コンポーネントの多さや導入ハードルの低さという意味ではMaterializeを利用するメリットは非常に高いと思われる。

## 使用方法

最も簡単な使用方法としては、以下のタグをHTMLに読み込むだけでCDN経由で利用することができる。

```html
<!-- Compiled and minified CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">

<!-- Compiled and minified JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
```

![materialize02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/793029bf-0486-73df-b60a-6f937fc2537a.png)

その他、圧縮版のソースやSass版のソースをダウンロードすることもできるが、ここでは[スターターテンプレート](https://materializecss.com/getting-started.html#templates)の使用をおすすめしたい。

スターターテンプレートを元に制作を始めると、各種コンポーネントの使用例の他、カスタムCSSやJavaScriptの初期設定の書き方等が分かるため、作業を進める上で理解が早い。

## コンポーネント

ここではMaterializeの代表的なコンポーネントを紹介したい。

### ボタン

![materialize03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/16d13c5d-5079-c83d-c252-8e3268da543b.png)

ボタン用コンポーネント。
`large`, `small`, `disabled`などのバリエーションが利用できる。
`a`タグでも、`button`タグでも使用可能。

```html
<a class="waves-effect waves-light btn">button</a>
<a class="waves-effect waves-light btn"><i class="material-icons left">cloud</i>button</a>
<a class="waves-effect waves-light btn"><i class="material-icons right">cloud</i>button</a>
```

### フローティングアクションボタン

![materialize04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/dc786d2c-4a3d-9f5c-5d95-7774130d8b0c.png)

画面の右下に追従する固定ボタン。
アプリのUIでよくあるようなメニューも展開できる。

```html
<div class="fixed-action-btn">
  <a class="btn-floating btn-large red">
    <i class="large material-icons">mode_edit</i>
  </a>
  <ul>
    <li><a class="btn-floating red"><i class="material-icons">insert_chart</i></a></li>
    <li><a class="btn-floating yellow darken-1"><i class="material-icons">format_quote</i></a></li>
    <li><a class="btn-floating green"><i class="material-icons">publish</i></a></li>
    <li><a class="btn-floating blue"><i class="material-icons">attach_file</i></a></li>
  </ul>
</div>
```

### カード

![materialize05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/9e75653d-2be3-6e1c-8560-f4497ea017c5.png)

コンテンツをカード形式でまとめられるコンポーネント。
画像やフローティングアクションボタンと組み合わせることも可能。

```html
<div class="row">
  <div class="col s12 m6">
    <div class="card">
      <div class="card-image">
        <img src="images/sample-1.jpg">
        <span class="card-title">Card Title</span>
        <a class="btn-floating halfway-fab waves-effect waves-light red"><i class="material-icons">add</i></a>
      </div>
      <div class="card-content">
        <p>I am a very simple card. I am good at containing small bits of information. I am convenient because I require little markup to use effectively.</p>
      </div>
    </div>
  </div>
</div>
```

### コレクション（リスト）

![materialize06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/456a095d-b8a9-2752-28d0-bd074d0a59a0.png)

いわゆるリスト形式のコンポーネント。
リンクを設定したり、バッジと組み合わせたりできる。

```html
<div class="collection">
  <a href="#!" class="collection-item"><span class="badge">1</span>Alan</a>
  <a href="#!" class="collection-item"><span class="new badge">4</span>Alan</a>
  <a href="#!" class="collection-item">Alan</a>
  <a href="#!" class="collection-item"><span class="badge">14</span>Alan</a>
</div>
```

### ナビバー

![materialize07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/08186401-c254-9f00-131f-fcc2e6ed180c.png)

ヘッダー用のナビゲーションバー。
固定配置したり、ドロワー形式で開くサイドナビと組み合わせたりできる。

```html
<nav>
  <div class="nav-wrapper">
    <a href="#" class="brand-logo">Logo</a>
    <ul id="nav-mobile" class="right hide-on-med-and-down">
      <li><a href="sass.html">Sass</a></li>
      <li><a href="badges.html">Components</a></li>
      <li><a href="collapsible.html">JavaScript</a></li>
    </ul>
  </div>
</nav>
```

## フォーム

![materialize08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/020f1bcb-dc51-e1b9-e13e-3e03935a74df.png)![materialize09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/f30a0fcc-b5bf-bef7-e5fd-5155e831add8.png)![materialize10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/044a1107-b740-71e8-8512-9d923e221818.png)

Materializeでは、マテリアルデザイン風のチェックボックスやラジオボタン、テキストボックスなどを利用できる。
JSで機能を追加すると、オートコンプリート（自動入力補完）やデートピッカー（カレンダー）なども手軽に追加することが可能。

## その他便利機能

Materializeには、基本コンポーネント以外にも、カスタマイズに使える便利な機能や補助ツールが用意されている。

### カラー

![materialize11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/7b0afd3f-8f3c-f414-2572-3ca5891ef118.png)

マテリアルデザインに則ったカラーパレットが用意されていて、クラス名を追加するだけで要素の背景色やテキストカラーを設定することができる。

#### 背景色

```html
<div class="card-panel teal lighten-2">This is a card panel with a teal lighten-2 class</div>
```

#### テキストカラー

```html
<div class="card-panel">
  <span class="blue-text text-darken-2">This is a card panel with dark blue text</span>
</div>
```

### グリッドレイアウト

`.row`と`.col`クラスを使って、Bootstrapのように手軽にカラムレイアウトを作成することができる。  
また、`s12`（モバイルで12カラム）、`m6`（タブレットで6カラム）のようなクラスを並用することで、レスポンシブレイアウトも作成できる。

![materialize12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/d9c96df1-6859-a477-5ecd-5ba4faea2cc5.png)

```html
<div class="row">
  <div class="grid-example col s12"><span class="flow-text">I am always full-width (col s12)</span></div>
  <div class="grid-example col s12 m6"><span class="flow-text">I am full-width on mobile (col s12 m6)</span></div>
</div>
```

### アイコン

マテリアルデザイン用のアイコンを利用することができる。
（アイコン用のGoogleフォントを読み込む必要あり）

![materialize13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/291ce4fd-95da-fa79-482a-5c9b6ee3d31c.png)

```html
<i class="large material-icons">insert_chart</i>
```

### JavaScript

初期設定で各種JSの関数を呼び出すことで、カルーセルやモーダル、ドロップダウンといった様々な機能を追加することができる。
パララックスなどの演出系のライブラリも充実している。

![materialize14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924708/19b78d14-01ce-ab09-f369-b305944e0d02.png)

```javascript
document.addEventListener('DOMContentLoaded', function() {
  var elems = document.querySelectorAll('.modal');
  var instances = M.Modal.init(elems, options);
});

// Or with jQuery
$(document).ready(function(){
  $('.modal').modal();
});
```

## まとめ

Materializeを触った感想としては、コンポーネントが充実している他、Bootstrapなどで馴染みの深いグリッドレイアウトの概念がそのまま使えるので、新たにCSSを書かなくても自由度の高いデザインを実装することができた。

また、簡単なコードを記述することで動きや演出を伴うJavaScriptの機能を追加することもできるので、フロントエンドが専門ではない開発者やディレクターがUIモックを作るために利用しても便利なのではないだろうか。

## 関連リンク

- [Documentation \- Materialize](https://materializecss.com/)
- [Homepage \- Material Design](https://material.io/)
- [マテリアルデザインをサクッと実装できるCSSフレームワーク6選【2017年版】 – WPJ](https://www.webprofessional.jp/free-material-design-css-frameworks-compared/)

---
[:christmas_tree: FORK Advent Calendar 2020](/advent-calendar/2020/fork)
:arrow_left: 3日目 [WSL2環境でVSCode + Dockerで開発する為に](https://qiita.com/sugar-engine/items/81f55fb7fa1f1bd12955) @sugar-engine
:arrow_right: 6日目 [面倒なカレンダー登録はGASにやらせる](https://qiita.com/agoKnife/items/338de5127e5b2b73bd53) @agoKnife