HTML + CSSでリアルなタピオカを作る

最近、[[CSSアニメーション]●●●CSSでタピオカ作ってふわふわ浮かせる●●●](https://qiita.com/mame_hashbill/items/ccf6e89f46fde8a8e20c)や[リアルな眼球を描く。HTMLとCSSだけで。](https://qiita.com/ichimonji_haji/items/b6362aa808ae351affdc)のようなHTML+CSSだけで作る表現が流行っていた（？）ので自分も作ってみました。 

# 完成品はこちら
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="Nishihara" data-slug-hash="wvwjZge" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Only HTML + CSS Tapioca">
  <span>See the Pen <a href="https://codepen.io/Nishihara/pen/wvwjZge/">
  Only HTML + CSS Tapioca</a> by Nishihara (<a href="https://codepen.io/Nishihara">@Nishihara</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 概要


![HTML + CSSタピオカ完成画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463699/d24dfab9-18b1-7eeb-e769-e22092d06428.png)

そこまで複雑なHTMLやCSSのトリックは使っていません。`background: radial-gradient()`と`filter: bluer()`を使ってグラデーションを表現しつつ、`transform`プロパティで変形させたものを組み合わせて作っています。

# タピオカ本体を作る
まずは、タピオカの本体部分のHTMLとCSSを作成します。

```html
<div class="wrapper">
  <div class="tapioka"></div>
  <!-- 中略 -->
</div>
```

```css
.wrapper{
  width: 130px;
  height: 120px;
  position: relative;
}
.tapioka{
  width: 130px;
  height: 120px;
  z-index: 0;
  border-radius: 50%;
  background: radial-gradient(closest-side at 49% 49%,rgba(4,4,0,1) 0%,rgba(25,21,21,1) 75%,rgba(90,77,77,1) 92%,rgba(150,135,135,0.6) 98%);
}
```

![タピオカ本体部分](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463699/db70876c-68ef-fe9b-7414-e8c3a91ea787.png)


タピオカ全体を包むラッパーを作ります。ラッパーはタピオカの大きさと同じにしています。`position`を使って配置していくのでラッパーには`position: relative`を指定しています。

タピオカ本体は楕円を作り、`background`を`radial-gradient`を使って円形グラデーションにしています。わずかに扁平な楕円にしているのは、タピオカの自重により少し潰れているからです。

立体感を出すためにグラデーションの中心は1%ずつ左上にずらしています。**グラデーションの端は透過させ、タピオカ表面にある水分**を表しています。

# ハイライトをいれていく
タピオカは表面がつるっとして、水分を含んでいるので反射をしています。それを表現するためにハイライトを入れていきます。

## 左側円形のハイライト
まず、左側に円形のハイライトを入れます。

```html
<div class="highlight1"></div>
```

```css
.highlight1{
  position: absolute;
  top: 40%;
  left: 8%;
  z-index: 1;
  width: 12px;
  height: 15px;
  background: radial-gradient(farthest-side at center,rgba(255,255,255,1) 0%,rgba(255,255,255,1) 54%,rgba(255,255,255,0) 100%);
  border-radius: 50%;
  transform: skewY(-10deg) skewX(-5deg) rotate(8deg);
  filter: blur(0.7px);
}
```

![タピオカ本体に1つ目のハイライトを入れた図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463699/531baa33-d035-e697-6b70-6e1dd86acc23.png)


ハイライトの位置は相対的に決めています。ハイライトも少し楕円形にし、外側は完全透過になるような白色のグラデーションで着色しています。

`transform`プロパティの`skew`を使って平行四辺形に変形させ、さらに`rotate`を使って回転させています。

ここでもブラーを使っていますが、タピオカ表面はつやつやしていても、完全な平坦ではなく、微細なデコボコがあります。そのため**反射のハイライトは少しボカしたようなハイライト**になります。（参考：[鏡面ハイライト - Wikipedia](https://ja.wikipedia.org/wiki/%E9%8F%A1%E9%9D%A2%E3%83%8F%E3%82%A4%E3%83%A9%E3%82%A4%E3%83%88)）

## 線状のハイライトを入れる

続いて、左上の線状のハイライトを入れます。

```html
<div class="highlight2"></div>
```

```css
.highlight2{
  position: absolute;
  top: 14%;
  left: 18%;
  z-index: 1;
  width: 44px;
  height: 20px;
  border-radius: 50%;
  border-top: 5px solid #fff;
  transform:rotate(-70deg) scaleX(0.9) scaleY(1.5) skewY(18deg);
  filter: blur(0.6px);
}
```

![タピオカ本体に2つ目のハイライトを入れた図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463699/583da6c0-cb44-4464-3a11-af16b31ffbff.png)


左上の線状のハイライトは長方形を作り、その上辺のみに`5px`の白いボーダーを入れています。それに`border-radius`をかけて弧状にし、さらに`transform`をこねくり回して変形させています。先程と同様にブラーを少しかけます。

## 右下のハイライトを入れる

これだけでもつやつや感が出てきましたが、さらに出すために右下にも入れていきます。

```html
<div class="highlight3"></div>
```

```css
.highlight3{
  position: absolute;
  top: 59%;
  left: 57%;
  z-index: 1;
  width: 24px;
  height: 24px;
  background: radial-gradient(farthest-side at center,rgba(255,255,255,1) 0%,rgba(255,255,255,1) 65%,rgba(255,255,255,0) 100%);
  border-radius: 50%;
  transform: skewY(-20deg) rotate(8deg);
  filter: blur(0.6px);
  opacity: 1;
}
```

![タピオカ本体に3つ目のハイライトを入れた図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463699/aa5477c8-db14-9e91-1214-57809e042d20.png)


こちらも最初にいれたハイライトと同様の手順で入れています。だいぶ**つやつや**してきました。

## 下部のハイライトを入れる

今回は白い床（？）に置かれている想定なので、表面には床面も反射で写り込みます。それを描き込んでいきます。

```html
<div class="highlight4"></div>
```

```css
.highlight4{
  position: absolute;
  top: 38%;
  left: 0%;
  z-index: 1;
  width: 122px;
  height: 90px;
  background: radial-gradient(farthest-side at center,rgba(255,255,255,1) 0%,rgba(255,255,255,1) 64%,rgba(255,255,255,0) 100%);
  border-radius: 50%;
  transform: rotate(8deg);
  filter: blur(2px);
  opacity: 0.15;
}
```

![タピオカ本体に4つ目のハイライトを入れた図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463699/87084c8a-147e-2ed8-dd79-6987df74d6fc.png)


`opacity: 0.15`の大きな楕円形をとはみ出すように下部に入れています。他の比べて存在感は薄いですが、これを入れると**なんか立体感**が出ます。

ハイライトの描き込みは以上です。

# タピオカ内にシャドウを入れる

光あるところに影はあるので、ハイライトと同じ用にシャドウを入れていきます。

```html
<div class="shadow"></div>
```

```css
.shadow{
  position: absolute;
  top: 69%;
  left: 64%;
  z-index: 1;
  width: 51px;
  height: 18px;
  border-radius: 50%;
  border-top: 1px solid #211;
  transform:rotate(130deg) ;
  filter: blur(1px);
}
```

![タピオカ本体にシャドウを入れた図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463699/471e36ce-cad2-a563-dc1e-f920f493efe5.png)

一見、どこに入れたか分かりづらいですが、右下のところが少し黒くなっているかと思います。球体でつやつやした表面なので陰影はつかないですが、表面の水分が**屈折により暗くなる部分**が生じます。その部分にシャドウを入れました。

# タピオカ自体の影をつける

最後に、床に落ちるタピオカ自身の影をつけます。

```html
<div class="dropshadow"></div>
```

```css
.dropshadow{
  width: 90px;
  height: 30px;
  position: absolute;
  left: 50%;
  top: 85%;
  z-index: -1;
  transform: translateX(-50%);
  background: radial-gradient(farthest-side at center,rgba(20,0,10,0.8) 25%,rgba(0,0,0,0) 100%);
  filter: blur(0.5px);
}
```

![タピオカ本体の影を落とした図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463699/d24dfab9-18b1-7eeb-e769-e22092d06428.png)

もう説明は不要かもしれませんが、これまでのハイライトと同じようにグラデーションで丸い影を落としています。`left: 50%`で中央に配置し、`transform: translateX(-50%)`で要素の半分の大きさだけ戻して真ん中に配置しています。

これで**リアルなタピオカの完成**です。

![メイキングのgifアニメ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463699/3d5320e6-02da-434d-b50e-72591f4de75a.gif)


# 最後に

HTMLとCSSだけタピオカを表現しなくてはいけない場面など、おそらくないのです。CSS芸の範疇です。画像なり、SVGなりで表現した方が豊かで圧倒的に楽です。

なお、途中途中で物理現象をもとにしたハイライトなどの説明は行っていますが、あくまで、それっぽく見えるような絵作りの工夫です。そのため厳密にそのような現象が起こっているとは限りません。