HOME / BLOG
BLOG

CSSで作る効果的なちょっとしたアニメーション10選【コピペOK】

デフォルト画像

Webサイトの小さなアニメーションは、目立たせることよりも「押せた」「選ばれた」「処理中」「完了した」と伝えるために使うと効果的です。大きく動かさなくても、数ピクセルの移動や短い透明度の変化だけで操作感は変わります。

この記事では、CSSで作る効果的なちょっとしたアニメーション10選を紹介します。すべて短いHTMLとCSSで試せるようにし、使いどころと注意点も添えました。

小さなアニメーションを効果的にする4つの基準

  • 意味がある:操作、状態変化、待ち時間のどれかを伝える
  • 短い:ボタンやリンクの反応はおおむね0.15〜0.3秒から調整する
  • レイアウトを動かしにくい:transformopacityを中心に使う
  • 止められる:prefers-reduced-motionで不要な動きを減らす

1. 押した感が出るボタン

ボタンを押している間だけ少し沈ませると、操作が受け付けられたことを直感的に伝えられます。

HTML

<button class="press-button" type="button">送信する</button>

CSS

.press-button {
  padding: 12px 20px;
  border: 2px solid #111;
  border-radius: 10px;
  background: #00a3ff;
  color: #fff;
  box-shadow: 0 5px 0 #111;
  transition: transform .12s ease, box-shadow .12s ease;
}

.press-button:active {
  transform: translateY(4px);
  box-shadow: 0 1px 0 #111;
}

使うときの注意:active状態は一瞬なので、移動量は小さくします。押した結果は別途テキストや画面変化でも伝えます。

2. リンクの下線が伸びる

リンクのホバーとキーボードフォーカスを同じアニメーションにすると、操作対象が分かりやすくなります。

HTML

<a class="line-link" href="#">詳しく見る</a>

CSS

.line-link {
  position: relative;
  color: #111;
  text-decoration: none;
}

.line-link::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: -.25em;
  width: 100%;
  height: 3px;
  background: #00a3ff;
  transform: scaleX(0);
  transform-origin: right;
  transition: transform .22s ease;
}

.line-link:hover::after,
.line-link:focus-visible::after {
  transform: scaleX(1);
  transform-origin: left;
}

使うときの注意:色だけに頼らず下線を残すため、タッチ端末では通常のtext-decorationを使う設計も有効です。

3. カードが少し浮く

クリックできるカードを少し持ち上げ、影を変化させます。移動しすぎると一覧が落ち着かないため、数ピクセルに留めます。

HTML

<a class="lift-card" href="#"><strong>記事タイトル</strong><span>続きを読む</span></a>

CSS

.lift-card {
  display: grid;
  gap: 8px;
  padding: 24px;
  border: 1px solid #ddd;
  border-radius: 16px;
  background: #fff;
  box-shadow: 0 8px 20px rgba(0, 0, 0, .08);
  transition: transform .2s ease, box-shadow .2s ease;
}

.lift-card:hover,
.lift-card:focus-visible {
  transform: translateY(-4px);
  box-shadow: 0 14px 28px rgba(0, 0, 0, .14);
}

使うときの注意:カード全体がリンクの場合、内部に別のリンクやボタンを入れないようにします。

4. 矢印が次の方向へ動く

「次へ」「詳しく見る」の方向を、短い矢印移動で補強します。文字ラベルが主役、矢印は補助です。

HTML

<a class="arrow-link" href="#">次の記事へ <span aria-hidden="true">→</span></a>

CSS

.arrow-link span {
  display: inline-block;
  transition: transform .18s ease;
}

.arrow-link:hover span,
.arrow-link:focus-visible span {
  transform: translateX(6px);
}

使うときの注意:装飾矢印にはaria-hiddenを付け、読み上げではラベルだけで意味が通じるようにします。

5. チェックが入る瞬間を強調する

選択された瞬間にチェック部分を少し拡大すると、状態変化を見つけやすくなります。

HTML

<label class="pop-check"><input type="checkbox"><span>利用規約に同意する</span></label>

CSS

.pop-check input {
  accent-color: #00a3ff;
}

.pop-check input:checked {
  animation: check-pop .22s ease-out;
}

@keyframes check-pop {
  50% { transform: scale(1.35); }
}

使うときの注意:標準チェックボックスを残すと、フォーカスや状態が分かりやすくなります。過度な独自描画は避けます。

6. 完了チェックを線で描く

保存完了や送信成功を、SVGの線が描かれる動きで伝えます。色だけでなく「完了」テキストも併記します。

HTML

<p class="success-message">
  <svg viewBox="0 0 48 48" aria-hidden="true">
    <path pathLength="1" d="M12 25l8 8 16-19" />
  </svg>
  保存しました
</p>

CSS

.success-message svg {
  width: 28px;
  fill: none;
  stroke: #16a34a;
  stroke-width: 5;
  stroke-linecap: round;
}

.success-message path {
  stroke-dasharray: 1;
  stroke-dashoffset: 1;
  animation: draw-check .45s ease forwards;
}

@keyframes draw-check {
  to { stroke-dashoffset: 0; }
}

使うときの注意:同じ完了表示を繰り返す場合は、クラスを付け直してアニメーションを再実行します。

7. 読み込み中のスケルトン

内容の形を残したまま読み込み中であることを伝えます。長時間続く場合は「読み込み中」ラベルも用意します。

HTML

<div class="skeleton" role="status" aria-label="読み込み中"></div>

CSS

.skeleton {
  width: min(100%, 420px);
  height: 120px;
  border-radius: 14px;
  background: linear-gradient(100deg, #e8e8e8 30%, #f7f7f7 50%, #e8e8e8 70%);
  background-size: 300% 100%;
  animation: skeleton-shimmer 1.4s ease-in-out infinite;
}

@keyframes skeleton-shimmer {
  to { background-position-x: -150%; }
}

使うときの注意:スケルトンの大きさを実際のコンテンツに近づけると、読み込み後のレイアウト移動を減らせます。

8. トーストが短く入ってくる

完了通知を下から少しだけ移動させ、表示された位置へ視線を導きます。表示時間の制御はJavaScriptで行います。

HTML

<p class="toast is-visible" role="status">保存しました</p>

CSS

.toast {
  opacity: 0;
  transform: translateY(12px);
  transition: opacity .2s ease, transform .2s ease;
}

.toast.is-visible {
  opacity: 1;
  transform: translateY(0);
}

使うときの注意:自動で消える通知へ重要情報を入れないようにします。エラーは利用者が確認できる形で残します。

9. 入力エラーを一度だけ揺らす

入力欄のエラーを見つけてもらうため、短く左右へ動かします。常時ループや強い揺れは避けます。

HTML

<p class="form-error is-visible" role="alert">メールアドレスを確認してください</p>

CSS

.form-error.is-visible {
  color: #c1121f;
  animation: error-shake .28s ease-in-out;
}

@keyframes error-shake {
  0%, 100% { transform: translateX(0); }
  33% { transform: translateX(-5px); }
  66% { transform: translateX(5px); }
}

使うときの注意:揺れだけではエラー理由が分からないため、具体的なテキスト、色、アイコンを組み合わせます。

10. 3つの点で処理中を示す

チャットの入力中や短い通信待ちに使える、控えめなドットアニメーションです。

HTML

<span class="loading-dots" role="status" aria-label="処理中"><i></i><i></i><i></i></span>

CSS

.loading-dots {
  display: inline-flex;
  gap: 6px;
}

.loading-dots i {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #00a3ff;
  animation: dot-bounce .8s ease-in-out infinite alternate;
}

.loading-dots i:nth-child(2) { animation-delay: .12s; }
.loading-dots i:nth-child(3) { animation-delay: .24s; }

@keyframes dot-bounce {
  to { transform: translateY(-6px); opacity: .45; }
}

使うときの注意:処理が長引く可能性がある場合は、キャンセル手段や進捗テキストも用意します。

prefers-reduced-motionで動きを減らす

OSで「視差効果を減らす」「アニメーションを減らす」設定を有効にしている利用者には、装飾的な動きを止めます。状態変化そのものは、色やテキストでも分かるようにしてください。

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    scroll-behavior: auto !important;
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
  }
}

避けたいアニメーション

  • 内容を読む間も止まらない大きなループ
  • クリックするたびにレイアウト全体がずれる動き
  • 点滅や急激な明暗変化を繰り返す演出
  • 重要な操作結果をアニメーションだけで伝える実装
  • hoverだけに反応し、キーボードフォーカスへ反応しない実装
  • 複数の要素が別々の方向へ同時に動く画面

関連するCSS記事

参考資料

まとめ

効果的な小さなアニメーションは、利用者の注意を奪うものではなく、操作の結果や画面の状態を補助するものです。まずはボタンの押下、リンクの方向、完了、読み込み中の4場面から取り入れてみてください。短い時間、少ない移動量、transformopacity中心、動きを減らす設定への対応を守ると、落ち着いて使いやすいUIになります。