2020年に流行ると言われていたニューモフィズムをCSSで実装する

## 対象読者
* HTMLとCSSがある程度書ける方
* ニューモフィズムについて知りたい方
* ニューモフィズムの実装方法を知りたい方
* 自身のwebサービスにモダンなデザインを取り入れたい方

## ニューモフィズムとは
ニューモフィズムとはオブジェクトが背景に密着して盛り上がっているように見えるデザインです。
言葉で説明するよりも実物を見たほうがわかりやすいと思うのでこちらをご覧下さい。
![neumoform.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/80324cb1-bb46-fe53-514b-8fa66f8c2db4.png)

### 今年こそ流行る…？
ニューモフィズムは、スキューモフィズム、フラットデザインに続く新たなデザインとして注目されています。

![buttuns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/3232fec1-5b5f-a13f-90b7-ad2318b95686.png)

2020年に流行ると言われていましたが、2021年になってしまいましたね…。


## ニューモフィズムをCSSで実装する

### ニューモフィズムの考え方
実装の前にニューモフィズムがなぜ凹凸があるように見えるかを解説します。ここを理解せずにコードを書くとすると何をしているのかわからなくなります。
まず、オブジェクトと背景色を同じ色に設定します。そして、光の当たる場所を明るく、光の当たらない場所を暗くして陰を作ることで、凹凸を表現します。

![notion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/bf614691-5f4d-c440-f167-16d727fd6b8d.png)

### 実装
いよいよ実装です。この記事では3つのニューモフィズムをCSSで実装する方法を解説します。
![neumos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/a01d2b91-479c-b99a-cdae-c1888230b689.png)
共通事項として背景とオブジェクトの色であるベースカラーを`#DADADA`、ハイライト(光)を`#E6E4E4`、ローライト(陰)を`#AEA8A8`とします。
また、丸みがある方がニューモフィズムらしく見えるので`border-radius`をつけています。

### 初期状態(未実装)
ここでは幅、高さ共に300pxの`div`タグにニューモフィズムを実装します。

```html:html
<body>
  <div></div>
</body>
```

```css:css
body {
    background: #DADADA;
  }
  div {
    background: #FFFFFF;
    width: 300px;
    height: 300px;
    margin: 100px auto;
  }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/4fa55862-27e6-a647-6943-7f3a9d29ef3e.png)

### 凸(境界が角ばっている)

```html:html
<body>
  <div class="convex-square"></div>
</body>
```

```css:css
body {
  background-color: #DADADA;
}
div {
  border-radius: 20px;
  width: 300px;
  height: 300px;
  margin: 100px auto;
}
.convex-square {
  background: #DADADA;
  box-shadow: -8px -8px 8px #E6E4E4, 8px 8px 8px #AEA8A8;
}
```

![Desktop - 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/f6c38a27-45d7-0326-7bf1-575875992f7d.png)

境界が角張った凸はオブジェクトの**外側**に`box-shadow`をつけます。光源が左上にあると考え、光が当たる左上にベースカラーより明るい色の`box-shadow`を、影ができる右下にベースカラーより暗い色の`box-shadow`をつけます。

### 凸(境界が丸みを帯びている)
```html:html
<body>
  <div class="convex-rounded"></div>
</body>
```

```css:css
body {
  background-color: #DADADA;
}
div {
  border-radius: 20px;
  width: 300px;
  height: 300px;
  margin: 100px auto;
}
.convex-rounded {
  background: #DADADA;
  box-shadow: inset 8px 8px 8px #E6E4E4, inset -8px -8px 8px #AEA8A8;
}
```

![Desktop - 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/a8d3b132-54fb-2c97-9f74-2902d23c0164.png)


境界が丸みを帯びた凸はオブジェクトの**内側**に`box-shadow`をつけます。光源が左上にあると考え、光が当たる左上にベースカラーより明るい色の`box-shadow`を、影ができる右下にベースカラーより暗い色の`box-shadow`をつけます。

### 凹

```html:html
<body>
  <div class="concave"></div>
</body>
```

```css:css
body {
  background-color: #DADADA;
}
div {
  border-radius: 20px;
  width: 300px;
  height: 300px;
  margin: 100px auto;
}
.concave {
  background: #DADADA;
  box-shadow: inset -8px -8px 8px #E6E4E4, inset 8px 8px 8px #AEA8A8;
}
```

![Desktop - 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/9ce35cbb-ccdb-0691-7d92-ccdb29ab15c9.png)

凹を表現する場合はオブジェクトの**内側**に`box-shadow`をつけます。光源が左上にあると考え、窪みで影ができる左上にベースカラーより暗い色の`box-shadow`を、光が当たる右下にベースカラーより明るい色の`box-shadow`をつけます。

## ニューモフィズムを採用するメリット

### 配色が簡単
ベースカラーを決定するだけでそれっぽいUIがつくれるため、配色が苦手な方でも設計しやすいデザインだと思います。
しかし、ユーザビリティを考慮すると工夫が必要な点があります。これについては後ほど解説します。

### カラーの変更が簡単
ベースカラー、ハイライト、ローライトの3色を変更するだけでページ全体のカラーが変更できる点がニューモフィズム強みだと思います。

この3色と文字色を変更するだけでダークモードが実装できるのはとても楽です。
![neumo-color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/d6de6585-207f-83e0-ee80-f6b8c7083ef9.png)

## 現段階ではデメリットも

### 複雑なページに採用するとユーザは戸惑う
ニューモフィズムではオブジェクトを凹凸で表現します。そのため「ボタン」と「単なる境界線としての突起」の区別がつかず、ユーザを困惑させてしまう可能性があります。
![confuse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/5cf24d89-8ae0-233c-ecd5-e7c7bf965bcc.png)

### 解決策
以下の画像のように凹凸を組み合わせ、リンクのないカードである(押せない)ことを示すことでこの問題は解決できます。

![solution1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/d3acaa3d-c6a4-456a-2064-776a9930918f.png)

アクセントとして内側の窪みに色を付けるのも良いと思います。
![solution2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/381b594d-11cb-d808-47d5-dc1566193892.png)

しかし、まだ見慣れないUIではあることには変わりないので、ユーザが100%困惑しないとは断言できません。こればかりはユーザがニューモフィズムに慣れてくれるのを待つしかないですね。
windows8が発売された当初も、ボタンとパネルの区別がつかず、ユーザがフラットデザイン困惑していましたし、時間が解決してくれることを祈ります。

## ニューモフィズムなwebアプリを作った

![banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666547/c663e0f6-f4b7-5a25-6162-a94a1a9d695f.png)
https://count-words.web.app/

最後に私の開発したwebアプリを紹介させてください。
ニューモフィズムを使ってデザインされた文字数カウンタです。
日本語の他に、英語のようなスペース区切りで単語数をカウントすることにも対応しています。
似たようなwebサービスは既に数多くあるのですが、カウンタが仮想キーボードで隠れてしまうなど、スマートフォンで使うには不便なものばかりでした。
こちらはカウンタが仮想キーボードに干渉しないようにデザインされていて、文字数もリアルタイムに反映されます。
PCでもスマートフォンでも使いやすいようにデザインされているので、一度利用してみて感想をいただけると嬉しいです。