Webサイトでよく見る、カードがふわっと拡大し、裏返しに回転するアニメーション。
「どうやって作るの?」と疑問に思ったことはありませんか?
今回は、CSSだけで作れるカードホバーアニメーションのサンプルコードとカスタマイズのコツを詳しく解説します。
初心者でも理解できるように、1つずつ丁寧に説明しますので、そのままコピーしてブログやポートフォリオサイトに使うことも可能です。
サンプル
See the Pen card by kasasagi_kmnmc (@kasasagi_kmnmc) on CodePen.
基本のHTML構造
まずはHTMLです。5枚のカードを横並びに配置する簡単な例を用意しました。
<body>
<div class="card-container">
<div class="card">
<div class="card-inner">
<div class="card-front">表</div>
<div class="card-back">裏</div>
</div>
</div>
<div class="card">
<div class="card-inner">
<div class="card-front">表</div>
<div class="card-back">裏</div>
</div>
</div>
<!-- 省略 -->
</div>
</body>ポイントは、カード1枚につき card-inner の中に前面(card-front)と裏面(card-back)を配置している点です。
この構造があることで、CSSだけで回転させることが可能になります。
CSSで立体感とアニメーションを付ける
CSSでは、主に以下の3つのテクニックを使います。
- 3D回転(rotateY)
- 拡大(scale)
- フェードインアニメーション
body {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background: #f0f0f0;
}
.card-container {
display: flex;
gap: 20px;
}
.card {
width: 120px;
height: 180px;
perspective: 1000px;
position: relative;
opacity: 0;
animation: fadeInUp 0.8s forwards;
}
.card:nth-child(1) { animation-delay: 0.2s; }
.card:nth-child(2) { animation-delay: 0.4s; }
.card:nth-child(3) { animation-delay: 0.6s; }
.card:nth-child(4) { animation-delay: 0.8s; }
.card:nth-child(5) { animation-delay: 1s; }
.card-inner {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d;
transition: transform 0.8s, z-index 0s;
cursor: pointer;
transform-origin: center;
}
.card:hover {
z-index: 10;
}
.card:hover .card-inner {
transform: rotateY(180deg) scale(1.5);
}
.card-front,
.card-back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
display: flex;
justify-content: center;
align-items: center;
font-size: 20px;
font-weight: bold;
border-radius: 8px;
}
.card-front {
background: white;
color: black;
transform: rotateY(0deg);
box-shadow: 0 10px 20px rgba(0,0,0,0.1);
}
.card-back {
background: black;
color: white;
transform: rotateY(180deg); /* 裏面を回転 */
}
@keyframes fadeInUp {
0% {
opacity: 0;
transform: translateY(50px) rotateY(0deg);
}
100% {
opacity: 1;
transform: translateY(0) rotateY(0deg);
}
}perspectiveは3Dの奥行きを出すプロパティです。transform-style: preserve-3dで子要素の立体感を保持。backface-visibility: hiddenで裏面が透けないようにしています。
1. 3D回転(rotateY)
.card:hover .card-inner {
transform: rotateY(180deg) scale(1.5);
}rotateY(180deg)が Y軸回転 で、カードの裏面を表示するための3D回転です。transform-style: preserve-3d;をcard-innerに指定しているのも、この回転で立体感を出すために必要です。
2.拡大
.card:hover .card-inner {
transform: rotateY(180deg) scale(1.5);
}scale(1.5)が カードのサイズを1.5倍に拡大 する部分です。- 拡大率は自由に変更可能で、
scale(1.2)やscale(1.3)にすれば控えめにできます。
3.フェードインアニメーションで自然に表示
カードをページ読み込み時に 順番にフェードイン させると、よりおしゃれな印象になります。
.card {
opacity: 0;
animation: fadeInUp 0.8s forwards;
}
@keyframes fadeInUp {
0% { opacity: 0; transform: translateY(50px); }
100% { opacity: 1; transform: translateY(0); }
}
.card:nth-child(1) { animation-delay: 0.2s; }
.card:nth-child(2) { animation-delay: 0.4s; }
opacity: 0で最初は透明にしておき、fadeInUpアニメーションで徐々に 不透明になりつつ上に移動 します。animation-delayをカードごとに変えることで、順番に現れる効果が出ます。
カードごとに animation-delay を変えることで、順番に現れる動きを作れます。
ホバー時の拡大・回転を自然にするコツ
実際に触ってみると、隣のカードと重なって不自然に見えることがあります。
これを改善するには、ホバー時に z-indexを調整 します。
.card:hover {
z-index: 10; /* 他のカードより前に表示 */
}また、拡大率も自由に変更可能です。
.card:hover .card-inner {
transform: rotateY(180deg) scale(1.3); /* scaleで大きさ調整 */
}scale(1.2〜1.5) が一般的で、あまり大きすぎると周囲に干渉してしまいます。
カスタマイズのアイデア
この基本構造を応用すると、さまざまな表現が可能です。
グラデーション背景
.card-front {
background: linear-gradient(135deg, #f6d365, #fda085);
}画像をカードに表示
<div class="card-front">
<img src="sample.jpg" alt="サンプル画像" />
</div>影の強さや色を調整
box-shadow: 0 15px 25px rgba(0,0,0,0.2);マグネティックエフェクト風
- マウスの位置に応じてカードが少し傾く演出もJavaScriptで追加可能。
- これにより、よりインタラクティブなカードになります。
まとめ
今回紹介したCSSカードアニメーションは、HTMLとCSSだけで作れるシンプルな3D効果です。
- ページ読み込み時にフェードイン
- ホバーで拡大+裏返し
- z-indexで重なり順を制御
これだけで、Webサイトに動きのあるカードコンテンツを簡単に追加できます。
また、このテクニックはアフィリエイト広告のカード表示にも最適です。
例えば「おすすめ商品」をカードにして、ホバーで商品情報や価格を裏面に表示することで、クリック率を高めることが可能です。
さらに便利なツール・サービス
- Canva や Figma:カードデザインの元データ作成
- CodePen:コードを試しながらデザイン調整
- Adobe Stock や Unsplash:画像素材を活用
これらを活用すれば、さらに魅力的なカードを簡単に作ることができます。


