CSS

CSSホバーエフェクト集|ボタン・画像・テキストのコピペサンプル

CSSのhoverで使えるエフェクトを20種類まとめました。ボタンが浮く、背景色が変わる、画像がズームする、テキストに下線が伸びる、カードが浮く、キャプションが出るなど、コピペしやすいHTMLとCSSで紹介します。

この記事の目次
  1. hoverを書くときの基本
  2. 1. 色が変わるボタン
  3. 2. ふわっと浮くボタン
  4. 3. 少し拡大するボタン
  5. 4. 枠線ボタンの背景が変わるhover
  6. 5. 下線が左から伸びるリンク
  7. 6. 下線が中央から広がるリンク
  8. 7. 画像がズームするhover
  9. 8. 画像が暗くなるhover
  10. 9. 白黒画像がカラーになるhover
  11. 10. 画像にキャプションが出るhover
  12. 11. カードが浮くhover
  13. 12. カードの枠線色が変わるhover
  14. 13. テキスト色が変わるhover
  15. 14. アイコンだけ動くhover
  16. 15. 背景が左から広がるhover
  17. 16. グラデーションが動くhover
  18. 17. 透明度が変わるhover
  19. 18. アイコンが回転するhover
  20. 19. フォーカスにも対応したhover
  21. 20. 動きを減らす設定に対応するhover
  22. hoverで変更しやすいCSS
  23. hoverでよくある失敗
  24. まとめ

CSSの :hover を使うと、マウスを乗せたときの見た目を変えられます。

この記事では、ボタン、画像、テキスト、カード、ナビに使いやすいホバーエフェクトを20種類紹介します。

スマホではhoverが期待通りに見えないこともあるため、重要な情報はhover前でも読めるようにしておくのが基本です。

hoverを書くときの基本

:hover は、要素にマウスが乗ったときの状態を指定する疑似クラスです。

.sample-link:hover {
  color: #2563eb;
}

なめらかに変化させたい場合は、hover側ではなく通常時に transition を指定します。

.sample-link {
  transition: color 0.3s ease;
}

1. 色が変わるボタン

一番使いやすいhoverです。

<a href="#" class="hover-color-button">詳しく見る</a>
.hover-color-button {
  display: inline-block;
  padding: 12px 24px;
  color: #fff;
  text-decoration: none;
  background: #2563eb;
  border-radius: 6px;
  transition: background-color 0.3s ease;
}

.hover-color-button:hover {
  background: #1d4ed8;
}

2. ふわっと浮くボタン

少し上に動かして、クリックできる印象を出します。

.hover-float-button {
  display: inline-block;
  padding: 12px 24px;
  color: #fff;
  text-decoration: none;
  background: #7c3aed;
  border-radius: 6px;
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.hover-float-button:hover {
  transform: translateY(-4px);
  box-shadow: 0 10px 20px rgba(124, 58, 237, 0.25);
}

3. 少し拡大するボタン

CTAを少し目立たせたいときに使えます。

.hover-scale-button {
  display: inline-block;
  padding: 12px 24px;
  color: #fff;
  text-decoration: none;
  background: #16a34a;
  border-radius: 9999px;
  transition: transform 0.25s ease;
}

.hover-scale-button:hover {
  transform: scale(1.04);
}

拡大しすぎると周囲の要素とぶつかるため、1.03 から 1.06 程度にします。

4. 枠線ボタンの背景が変わるhover

枠線ボタンをhover時だけ塗りボタンにします。

.hover-outline-fill {
  display: inline-block;
  padding: 12px 24px;
  color: #2563eb;
  text-decoration: none;
  border: 2px solid #2563eb;
  border-radius: 6px;
  transition: color 0.3s ease, background-color 0.3s ease;
}

.hover-outline-fill:hover {
  color: #fff;
  background: #2563eb;
}

5. 下線が左から伸びるリンク

ナビゲーションやテキストリンクに使いやすいhoverです。

<a href="#" class="hover-underline-left">リンクテキスト</a>
.hover-underline-left {
  position: relative;
  color: #111827;
  text-decoration: none;
}

.hover-underline-left::after {
  position: absolute;
  left: 0;
  bottom: -4px;
  width: 100%;
  height: 2px;
  content: "";
  background: #2563eb;
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.3s ease;
}

.hover-underline-left:hover::after {
  transform: scaleX(1);
}

6. 下線が中央から広がるリンク

少し上品に見せたいナビに向いています。

.hover-underline-center {
  position: relative;
  color: #111827;
  text-decoration: none;
}

.hover-underline-center::after {
  position: absolute;
  left: 50%;
  bottom: -4px;
  width: 100%;
  height: 2px;
  content: "";
  background: #db2777;
  transform: translateX(-50%) scaleX(0);
  transition: transform 0.3s ease;
}

.hover-underline-center:hover::after {
  transform: translateX(-50%) scaleX(1);
}

7. 画像がズームするhover

カード画像やギャラリーでよく使います。

<a href="#" class="hover-image-zoom">
  <img src="sample.jpg" alt="サンプル画像">
</a>
.hover-image-zoom {
  display: block;
  overflow: hidden;
  border-radius: 8px;
}

.hover-image-zoom img {
  display: block;
  width: 100%;
  height: auto;
  transition: transform 0.4s ease;
}

.hover-image-zoom:hover img {
  transform: scale(1.08);
}

親要素に overflow: hidden; を指定すると、拡大した画像が外にはみ出しません。

8. 画像が暗くなるhover

画像リンクに「押せる」印象を足したいときに使えます。

.hover-image-dark {
  display: block;
  background: #000;
  border-radius: 8px;
  overflow: hidden;
}

.hover-image-dark img {
  display: block;
  width: 100%;
  transition: opacity 0.3s ease;
}

.hover-image-dark:hover img {
  opacity: 0.72;
}

9. 白黒画像がカラーになるhover

実績一覧やプロフィール画像で使える表現です。

.hover-grayscale img {
  filter: grayscale(100%);
  transition: filter 0.35s ease;
}

.hover-grayscale:hover img {
  filter: grayscale(0);
}

重要な画像を常に白黒にすると伝わりにくいこともあるので、装飾的な場面に向いています。

10. 画像にキャプションが出るhover

ギャラリーや制作実績に使いやすい形です。

<a href="#" class="hover-caption">
  <img src="sample.jpg" alt="制作実績の画像">
  <span>詳しく見る</span>
</a>
.hover-caption {
  position: relative;
  display: block;
  overflow: hidden;
  border-radius: 8px;
}

.hover-caption img {
  display: block;
  width: 100%;
}

.hover-caption span {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  color: #fff;
  font-weight: 700;
  background: rgba(0, 0, 0, 0.5);
  opacity: 0;
  transition: opacity 0.3s ease;
}

.hover-caption:hover span {
  opacity: 1;
}

hoverしなくても必要な情報が伝わるよう、画像の alt や周辺テキストも整えます。

11. カードが浮くhover

カード一覧で定番のhoverです。

.hover-card-lift {
  padding: 24px;
  background: #fff;
  border: 1px solid #e5e7eb;
  border-radius: 8px;
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}

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

カードデザインの基本は、CSSカードデザイン集 で扱います。

12. カードの枠線色が変わるhover

動きは控えめにして、選択できる印象を出す表現です。

.hover-card-border {
  padding: 24px;
  background: #fff;
  border: 2px solid #e5e7eb;
  border-radius: 8px;
  transition: border-color 0.3s ease;
}

.hover-card-border:hover {
  border-color: #2563eb;
}

13. テキスト色が変わるhover

本文リンクやメニューに使いやすい基本形です。

.hover-text-color {
  color: #374151;
  text-decoration: none;
  transition: color 0.3s ease;
}

.hover-text-color:hover {
  color: #2563eb;
}

14. アイコンだけ動くhover

テキストはそのまま、矢印だけ動かすリンクです。

<a href="#" class="hover-icon-slide">
  詳しく見る
  <span aria-hidden="true">→</span>
</a>
.hover-icon-slide {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  color: #2563eb;
  font-weight: 700;
  text-decoration: none;
}

.hover-icon-slide span {
  transition: transform 0.3s ease;
}

.hover-icon-slide:hover span {
  transform: translateX(5px);
}

15. 背景が左から広がるhover

ボタンやナビリンクに使える、少し動きのある表現です。

.hover-bg-slide {
  position: relative;
  display: inline-block;
  padding: 10px 18px;
  overflow: hidden;
  color: #2563eb;
  text-decoration: none;
  border: 1px solid #2563eb;
  border-radius: 6px;
}

.hover-bg-slide::before {
  position: absolute;
  inset: 0;
  z-index: -1;
  content: "";
  background: #2563eb;
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.3s ease;
}

.hover-bg-slide:hover {
  color: #fff;
}

.hover-bg-slide:hover::before {
  transform: scaleX(1);
}

z-index が効かない場合は、z-indexが効かない原因 を確認してください。

16. グラデーションが動くhover

キャンペーンボタンや目立たせたいリンクに使えます。

.hover-gradient {
  display: inline-block;
  padding: 12px 28px;
  color: #fff;
  font-weight: 700;
  text-decoration: none;
  background: linear-gradient(90deg, #2563eb, #db2777, #2563eb);
  background-size: 200% 100%;
  border-radius: 9999px;
  transition: background-position 0.4s ease;
}

.hover-gradient:hover {
  background-position: 100% 0;
}

17. 透明度が変わるhover

控えめな変化にしたい場合に使います。

.hover-opacity {
  display: inline-block;
  transition: opacity 0.3s ease;
}

.hover-opacity:hover {
  opacity: 0.7;
}

画像、アイコン、ボタンなど幅広く使えます。

18. アイコンが回転するhover

開閉や更新を連想させたいときに使える表現です。

<button class="hover-rotate-icon">
  更新
  <span aria-hidden="true">↻</span>
</button>
.hover-rotate-icon {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 16px;
  font: inherit;
  cursor: pointer;
  background: #fff;
  border: 1px solid #d1d5db;
  border-radius: 6px;
}

.hover-rotate-icon span {
  transition: transform 0.3s ease;
}

.hover-rotate-icon:hover span {
  transform: rotate(180deg);
}

19. フォーカスにも対応したhover

キーボード操作でも同じ見た目になるように、:focus-visible も指定します。

.hover-focus-button {
  display: inline-block;
  padding: 12px 24px;
  color: #fff;
  text-decoration: none;
  background: #111827;
  border-radius: 6px;
  transition: background-color 0.3s ease;
}

.hover-focus-button:hover,
.hover-focus-button:focus-visible {
  background: #374151;
  outline: 3px solid rgba(17, 24, 39, 0.25);
  outline-offset: 3px;
}

hoverだけでなく、キーボード操作にも配慮できます。

20. 動きを減らす設定に対応するhover

動きが苦手なユーザー向けに、prefers-reduced-motion でtransitionを抑えます。

@media (prefers-reduced-motion: reduce) {
  .hover-float-button,
  .hover-scale-button,
  .hover-image-zoom img,
  .hover-card-lift,
  .hover-icon-slide span,
  .hover-gradient {
    transition: none;
  }
}

すべてのhoverに必須ではありませんが、動きの大きい表現を使うときは入れておくと安心です。

hoverで変更しやすいCSS

hoverでよく変えるCSSは次のとおりです。

やりたいこと 使うCSS
色を変える colorbackground-color
動かす transform: translate()
大きくする transform: scale()
暗くする opacity、半透明背景
なめらかにする transition

hoverでよくある失敗

  • transition をhover側だけに書いている
  • スマホでhover前提の情報を隠している
  • 画像ズーム時に overflow: hidden; がなく、画像がはみ出している
  • 疑似要素を使った背景が文字の上に重なっている
  • 動きが大きすぎて読みにくい
  • キーボード操作の :focus-visible を考慮していない

CSSが効かない場合は、CSSが効かない原因まとめ も確認してください。

まとめ

hoverエフェクトは、通常時に transition を書き、hover時に色、透明度、影、transform を変えると作りやすいです。

ボタンそのもののデザインは CSSボタンデザイン集、ボタン専用の動きは CSSアニメーション付きボタン集 に分けて管理します。