Logo blog

CSSで3Dな本を作る

2026-03-12


Tailwind CSSを使って、3Dに動作する本を実装します。

今回は、私がよく使っているTailwindCSSを使用していますが、ピュアなCSSでも同じように実装できると思います。

サンプル紹介

まず、完成サンプルはこちらです。

黄色の背景の箇所をホバーすると、3Dに回転して本が開くアニメーションが実装されていると思います。

画面をホバーしたときに本を開くだけのシンプルな実装です。

実装

具体的な実装を見ていきます。

1. 親要素にperspectiveを設定する

ここでポイントになるのはperspectiveプロパティで、物体に遠近感を与えてくれます。

<div
class="group flex w-full justify-center bg-amber-50 p-32 perspective-distant"
>
...
</div>
プロパティ効果参考
perspective物体に遠近感を与えるMDN
group子要素で group-hover とすることで親要素のホバー時に子要素も反応するTailwind CSS
その他スタイルの調整-

2. 本の要素にtransform-styleを設定する

ここでのポイントはtransform-3dで、子要素を3D空間に配置するようになっています。

<div
class="relative aspect-3/4 h-80 transition duration-700 transform-3d group-hover:-rotate-y-20"
>
...
</div>
プロパティ効果参考
transform-3d子要素を 3D 空間に配置するMDN
transition duration-700アニメーションにかかる時間-
group-hover:-rotate-y-[20deg]group要素がホバーされたときにY軸を中心に20度回転させる
単位がdegなのは注意
MDN
その他スタイルの調整-

3. 本の表紙を作る

表紙だけたくさん回転させて、表紙を開いているように見せたいので、回転の角度を大きく設定しています。

<div
class="absolute inset-0 origin-left rounded-md bg-[#06B6D4] transition duration-1000 group-hover:-rotate-y-45"
>
<div class="space-y-4 py-16 text-center text-sm font-semibold text-gray-50">
<p>【Tailwind CSS】</p>
<p>CSSで3Dな本を作る</p>
<svg ... class="mx-auto size-16 fill-gray-50">...</svg>
</div>
</div>
プロパティ効果参考
absolute inset-0親の relative 要素に対して、目一杯広がるMDN
origin-leftY 軸の回転の基準点を左端に設定MDN
group-hover:-rotate-y-45Y 軸の回転(本全体の回転の角度より大きく設定してる)-
その他スタイルの調整-

4. 本のページを作る

Z軸にページをずらしていくことで、本のページが重なっているようにして、厚みを表現しています。

また、1ページ目だけ、少しテキストを入れてみました。

<div
class="absolute inset-1 -translate-z-0.75 rounded-md border border-gray-300 bg-gray-50 p-8"
>
<p class="text-xs">...</p>
</div>
<div
class="absolute inset-1 -translate-z-1.5 rounded-md border border-gray-300 bg-gray-50"
></div>
<div
class="absolute inset-1 -translate-z-2.25 rounded-md border border-gray-300 bg-gray-50"
></div>
<div
class="absolute inset-1 -translate-z-3 rounded-md border border-gray-300 bg-gray-50"
></div>
<div
class="absolute inset-1 -translate-z-3.75 rounded-md border border-gray-300 bg-gray-50"
></div>
<div
class="absolute inset-1 -translate-z-4.5 rounded-md border border-gray-300 bg-gray-50"
></div>
<div
class="absolute inset-1 -translate-z-5.25 rounded-md border border-gray-300 bg-gray-50"
></div>
<div
class="absolute inset-1 -translate-z-6 rounded-md border border-gray-300 bg-gray-50"
></div>
<div
class="absolute inset-1 -translate-z-6.75 rounded-md border border-gray-300 bg-gray-50"
></div>

Z軸について別角度から見たら、どうなっているかわかりやすいと思います。

背表紙がないですが今回の実装では見えない部分なので、OKとしています。

プロパティ効果参考
absolute inset-1親の relative 要素に対して少し内側に広がる-
-translate-z[…]各ページを Z 軸(奥)にずらすMDN
その他スタイルの調整-

5. 裏表紙を作る

各ページを作ったときと同じ要領で、裏表紙も作ります。

<div class="absolute inset-0 -translate-z-7.5 rounded-md bg-[#06B6D4]"></div>

たったこれだけで、完成です🎉

後は、各々でカスタマイズしてみてください。

参考