モダンCSSで作る、画像ホバー拡大エフェクトの最適解。transform scale() が主流の理由
公開日
一昨日、昨日と「CSS Grid」での全体の型作り、そして「aspect-ratio」での中身の比率固定について解説してきました。これで「崩れない型」は完成です。
今回は、その崩れないレイアウトに、ユーザーが「おっ」となる心地よい動きを加える方法をご紹介します。実務でも一番よく使う、「ホバー時の画像拡大」について、2026年現在の最適解をお伝えします。
この記事で学べること
- 画像拡大ホバーのコピペで使えるモダンなコード
- 拡大率(scale)とスピード(時間)の簡単な調整方法
- なぜ
transform: scale()が最適解なのか?その理由
目次
【結論】主流は transform: scale() + transition
「画像ホバー拡大」を実現するプロパティはいくつかありますが、2026年現在、パフォーマンスと実装のシンプルさから、transform: scale() と transition の組み合わせが圧倒的な主流であり、最適解です。
まずは、実際に動くデモをご覧ください。
See the Pen Untitled by 広瀬和哉 (@lpvcfdes-the-styleful) on CodePen.
実装コードと解説
今回のサンプルは、昨日の「aspect-ratio」の記事のコードをベースに、ホバー演出を追加したものです。
HTML(再掲)
<div class="grid">
<!-- 1枚目のカード -->
<div class="items">
<p class="img"><img src="image01.jpg" alt="画像の説明"></p>
<h3 class="ttl">タイトル</h3>
<p class="txt">テキスト...</p>
</div>
<!-- (以下、同様にカードを並べる) -->
</div>CSS(ホバー追加版)
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 一昨日のTips:repeat関数活用 */
gap: 20px;
max-width: 1100px;
margin: 0 auto;
}
/* ★画像の外側の枠(アスペクト比固定) */
.grid p.img {
aspect-ratio: 16 / 9; /* 昨日の復習:1行で比率固定 */
overflow: hidden; /* ★重要:拡大した画像がはみ出ないようにする */
}
/* ★画像自体の設定 */
.grid p.img img {
width: 100%;
height: 100%;
object-fit: cover;
/* ★動きを滑らかにする設定 */
transition: transform 0.5s ease; /* ★0.5秒かけて、心地よく動かす */
}
/* ★【追加】ホバー時の動き */
/* 親要素(.items)がホバーされた時、中にある画像(img)を拡大する */
.items:hover p.img img {
transform: scale(1.1); /* ★1.1倍に拡大(主流の手法) */
}自分好みにカスタマイズ!拡大率とスピードの調整
「1.1倍だと少し物足りない」「0.5秒だと少し遅く感じる」という場合は、コードの数値を少し変更するだけで、簡単に動きを調整できます。MENTAでのメンター活動でも、受講生の方から「好みの動きにしたい」とよく質問されるポイントです。
拡大率を変える(scale)
ホバー時の拡大率は、transform: scale(1.1) の「1.1」の部分を変更します。
.items:hover p.img img {
transform: scale(1.2); /* 1.2倍に拡大(より強調したい時) */
}
.items:hover p.img img {
transform: scale(1.05); /* 1.05倍に拡大(控えめに動かしたい時) */
}スピードを変える(transition時間)
アニメーションのスピードは、transition: transform 0.5s ease の「0.5s」の部分を変更します(sは秒:second)。
.grid p.img img {
/* (中略) */
transition: transform 0.3s ease; /* 0.3秒(速く、キビキビした動き) */
}
.grid p.img img {
/* (中略) */
transition: transform 1s ease; /* 1秒(遅く、ゆったりした動き) */
}ここがプロのこだわり:なぜ「scale()」?
- パフォーマンス(GPUアクセラレーション):
transformプロパティによる動きは、ブラウザの「GPU(グラフィックボード)」を使って処理されるため、CSSアニメーションの中でも非常に滑らかで、デバイスへの負荷が低いです。和哉が実務で最も重視するポイントです。 - シンプル: 拡大の指定(`scale`)と、動きの指定(`transition`)のたった2行を追加するだけで完結します。
メンターとして伝えたい「優しい設計」への配慮
私はMENTAでのメンター活動を通じて、受講生の方に「動き」の面白さを伝えると共に、必ず「アクセシビリティ」への配慮についても触れています。
「動くものが苦手」なユーザー(視覚過敏など)のために、OSの設定でアニメーションをオフにしている場合は、ホバー拡大を無効にするのが優しい設計です。
/* アニメーションを好まない設定の人には、動きを無効化(おまけセクション) */
@media (prefers-reduced-motion: reduce) {
.grid p.img img {
transition: none; /* 動きをオフ */
}
.items:hover p.img img {
transform: none; /* 拡大もオフ */
}
}こうした「配慮」まで含めて実装できるようになると、エンジニアとしての信頼度がさらに上がりますよ!
まとめ:静(Grid)から動(Hover)へのステップアップ
一昨日の「CSS Grid」で全体の型を作り、昨日の「aspect-ratio」で中身を整え、今日の「transform: scale()」で心地よい動きを加える。この3ステップの組み合わせは、現代のWeb制作における王道の「型」です。
個別の技術を理解したら、ぜひそれらをどう「実戦の武器」として組み合わせるかを考えてみてください。MENTAで教える中でも、この「組み合わせの妙」を伝えると受講生さんは一番喜んでくれます。
「やりすぎ注意」が、心地よい演出のコツです。拡大率が大きすぎたり、スピードが速すぎたりすると、ユーザーに「威圧感」を与えてしまいます。個人的には、拡大率は **1.05〜1.1倍**、時間は **0.3〜0.5秒** あたりが、愛犬がそっと近づいてくるような、優しくて心地よい動きの目安だと思っています。
