jQueryアニメーションは、Webサイトに動きをつける簡単で効果的な方法です。基本構文を覚えれば、フェードイン・スライドメニュー・スムーススクロールなど、様々な動的効果を簡単に実装できます。

今回は、jQueryアニメーションの基礎から、コピペしてすぐに使える実践的なサンプル、さらには「動かない!」といったトラブル対処法まで解説します。この記事を読めば、jQueryアニメーションを使いこなして、ユーザーの目を引くインタラクティブなWebサイトを作成できるようになるでしょう。

WordPressテーマ「PANDORA」
WordPressテーマ「PANDORA」
レイアウト自由自在なブログ・メディアを構築。

jQueryアニメーションの基礎知識

jQueryアニメーションは、要素のCSSプロパティを少しずつ連続的に動かしてアニメーションを作ります。

アニメーションが動く仕組みは、スマートフォンの画面でアプリのアイコンを指でドラッグして移動させる操作に似ています。

初期状態から指を右下にゆっくり動かすと、アイコンもそれに追従して右下に動きます。スマートフォンは短時間で指の位置を検出し、アイコンの座標をほんの少しずつ更新して、目的の場所で指を離したときにアイコンがその位置に固定されます。jQueryのanimate()は、「指でアイコンをゆっくり動かす」部分を自動化していると考えてください。

たとえば「箱を1秒かけて右に100ピクセル動かす」と指示すると、jQueryは指定時間内に目標へ向かって、CSSの値を細かく変更して、ブラウザに画面を更新するように伝えています。結果として、私たちの目には要素がスムーズに動いているように見えます。

jQueryアニメーションの使い方

基本的な知識を押さえたところで、次にjQueryアニメーションの具体的な使い方を見ていきましょう。中心となるanimate()の構文と、複数のアニメーションを連携させる方法を解説します。

基本構文

jQueryでアニメーションの基本構文は以下の通りです。

jQuery(セレクタ).animate(
  { プロパティ1: 値1, プロパティ2: 値2, … },  // 変化させたいCSSプロパティ
  速度(ミリ秒),                              // アニメーションの所要時間
  'swing' または 'linear',                      // イージング(省略可)
  function() { /* 完了時に実行する処理(省略可) */ }
);

プロパティ値には、width, height, opacity, leftなど数値で指定できるものを入れます。速度は1000ミリ秒(1秒)などの数値で指定し、省略すると400ミリ秒がデフォルトになります。

イージングはswing(ゆっくり→速く→ゆっくり)かlinear(一定速度)のどちらかの指定が可能です。最後のコールバック関数はアニメーション終了後に実行されます。

よく使うショートカット

jQueryは複雑なanimate()を使わなくても、簡単にアニメーションを実装できる便利なショートカットがあります。それぞれの用途ごとで表にまとめました。

フェード系

メソッド 動作 変化するプロパティ
.fadeIn 透明 → 不透明 opacity: 0 → 1
.fadeOut 不透明 → 透明 opacity: 1 → 0

フェード系は、要素をゆっくりと表示・非表示させたいときに便利です。

スライド系

メソッド 動作 変化するプロパティ
.slideDown 縮小 → 展開 height: 0 → 実際の高さ
.slideUp 展開 → 縮小 height: 実際の高さ → 0

スライド系は、アコーディオンメニューやドロップダウンによく使われます。

表示切替系

メソッド 動作 変化するプロパティ
.show 非表示 → 表示 デフォルトでは fade() と同じ
.hide 表示 → 非表示 アニメーション付きで切り替え

.show()と.hide()は速度を指定するかどうかで動作が変わります。速度を書かない場合は瞬間的に表示/非表示が切り替わり、速度を指定するとfadeIn()/fadeOut()と同じようにアニメーション付きで切り替わります。

アニメーションの停止とコールバック

.stop() を使うと、進行中のアニメーションの途中で停止が可能です。

複数のアニメーションを連続実行したい場合は、コールバック内で次のアニメーションを呼ぶか、.queue()/.dequeue()を使います。

jQuery('#element').animate({ height: '200px' }, 500, function() {
  // 高さが200pxになったら次のアニメーション
  jQuery(this).animate({ width: '300px' }, 500);
});

CSSだけでは難しい動きを、クリックやスクロールなどのイベントに合わせて簡単に実装できます。

複数アニメーションを連結する方法

一つの要素に複数のアニメーションを順番に実行させたい場合、jQueryでは直感的な方法が用意されています。ここでは、animate()をドット(.)で繋げて記述する一般的な方法を紹介します。

jQueryの多くのメソッドは、処理後に自身(jQueryオブジェクト)を返すため、このように鎖のようにつなげて書くことが可能です。

jQuery('#box')
  .animate({ width: '200px' }, 1000)   // 1. まず1秒かけて幅を200pxにする
  .animate({ height: '200px' }, 500)   // 2. 次に0.5秒かけて高さを200pxにする
  .animate({ opacity: 0.5 }, 1000);    // 3. 最後に1秒かけて半透明にする

上記のコードでは、#boxというIDを持つ要素に対して、以下の3つを指定しています。

  1. 幅を200pxにするアニメーションを1秒間実行
  2. 上記1のアニメーションが完了した後に、高さを200pxにするアニメーションが0.5秒間実行
  3. 上記2のアニメーションが完了した後に、透明度を0.5にするアニメーションが1秒間実行

このように、アニメーションが順番に実行される様子がコード上でも分かりやすく、初心者でも容易に複数の動きを組み合わせられます。

用途別のjQueryアニメーション【コピペOK】

実際のWebサイトでよく使われるjQueryアニメーションのサンプルコードを紹介します。ぜひコピペして試してみてください。

ふわっとフェードイン

フェードインは、要素がだんだん要素が見えるようになるアニメーションです。逆にフェードアウトは、徐々に消えるように見せます。画面の切り替わりがやさしく自然に感じられます。

ここではfadeIn() を使って「ページを開いたらふわっと見出しが現れる」例を解説します。

<h1 id="mainTitle">ようこそ!</h1>
#mainTitle {
  display: none;
  font-size: 2.5em;
  color: #333;
}
jQuery(function() {
  // ページ読み込み時に見出しを3秒かけてフェードイン
  jQuery('#mainTitle').fadeIn(3000);
});

ページを開くと非表示の見出しが3秒かけてふわっと表示されます。最初にCSSでdisplay: none; で見出しを非表示にし、jQueryの fadeIn() でゆっくり表示させています。

横スライドメニュー開閉

横スライドは、メニューなどの要素が左右からスッと出てくるアニメーションです。画面の外に隠れていたものが、じわっと表示されます。切り替えが自然で、見た目もスムーズになるのが特長です。

ここでは、ハンバーガーメニューを例として紹介します。

<div id="menuBtn">☰</div>

<div id="sideMenu">
  <ul>
    <li><a href="#">ホーム</a></li>
    <li><a href="#">プロフィール</a></li>
    <li><a href="#">サービス</a></li>
    <li><a href="#">お問い合わせ</a></li>
  </ul>
</div>
#menuBtn {
  font-size: 30px;
  padding: 15px;
  cursor: pointer;
  background-color: #333;
  color: #fff;
}

#sideMenu {
  position: fixed;
  top: 0;
  left: -250px; /* 最初は画面外に隠す */
  width: 250px;
  height: 100%;
  background-color: #444;
  color: #fff;
  transition: left 0.3s;
  padding: 60px 20px;
}

#sideMenu ul {
  list-style: none;
  padding: 0;
}

#sideMenu li {
  margin-bottom: 20px;
}

#sideMenu a {
  color: #fff;
  text-decoration: none;
  font-size: 18px;
}
jQuery(function() {
  jQuery('#menuBtn').on('click', function() {
    const menu = jQuery('#sideMenu');
    if (menu.position().left < 0) {
      menu.css('left', '0');
    } else {
      menu.css('left', '-250px');
    }
  });
});

ハンバーガーアイコンをクリックすると、サイドメニューが左からすっと現れます。jQueryでcss() を使用して、#sideMenuのleft の値を切り替えることで位置を動かしています。

さらにleft: -250pxで画面外に隠し、left: 0で画面内にスライド表示する仕組みです。

また、CSS に transition を設定しておくことで、数値が変わったときに アニメーションのようななめらかな動きが加わります。

スクロール連動フェード表示

ページをスクロールして特定の要素が画面内に入ったら、ふわっと表示されるアニメーションです。コンテンツを段階的に見せることで、ユーザーの興味を引きつけます。

<div class="spacer"></div>
<div class="fadeItem">こんにちは!スクロールすると表示されます</div>
<div class="spacer"></div>
.spacer {
  height: 600px;
}

.fadeItem {
  opacity: 0;
  transform: translateY(30px);
  transition: all 0.6s ease-out;
  text-align: center;
  font-size: 24px;
  color: #333;
}

.fadeItem.active {
  opacity: 1;
  transform: translateY(0);
}
jQuery(function() {
  jQuery(window).on('scroll', function() {
    jQuery('.fadeItem').each(function() {
      const target = jQuery(this);
      const position = target.offset().top;
      const scroll = jQuery(window).scrollTop();
      const windowHeight = jQuery(window).height();

      if (scroll + windowHeight > position + 50) {
        target.addClass('active');
      }
    });
  });
});

スクロールで要素が表示領域に入ると、jQueryでactiveクラスを追加します。

activeクラスでCSSのopacityとtransformが適用され、ふわっと表示させることが可能です。

jQueryで位置を判定し、CSSでアニメーションの見た目をコントロールしています。

スムーススクロール

スムーススクロールは、ページ内のアンカーリンク(#)をクリックすると、指定の場所までスムーズにスクロールする機能です。いきなりジャンプせず、ゆっくりと動くことでユーザーにやさしい印象を与えます。

スムーススクロールをページ内に取り入れることで、ユーザビリティ向上につながります。

<nav>
  <a href="#section1">セクション1へ</a> |
  <a href="#section2">セクション2へ</a> |
  <a href="#section3">セクション3へ</a>
</nav>

<div id="section1" class="section">セクション1</div>
<div id="section2" class="section">セクション2</div>
<div id="section3" class="section">セクション3</div>
nav {
  position: fixed;
  top: 0;
  width: 100%;
  background-color: #f0f0f0;
  padding: 10px;
  text-align: center;
}

.section {
  height: 600px;
  padding-top: 80px;
  text-align: center;
  font-size: 24px;
  background-color: #eef;
  border-bottom: 1px solid #ccc;
}
jQuery(function() {
  jQuery('a[href^="#"]').on('click', function(e) {
    e.preventDefault();
    const target = jQuery(this.hash);
    if (target.length) {
      jQuery('html, body').animate({
        scrollTop: target.offset().top
      }, 600);
    }
  });
});

アンカーリンクがクリックされたときに、jQueryがスクロール位置を計算して移動します。

animate() で600ミリ秒かけてスクロールすることで、なめらかな動きを実装しています。e.preventDefault() でブラウザのデフォルトの動作である、すぐにジャンプする動きを防ぐことが可能です。

jQueryアニメーションが効かない
よくある原因の対処法

jQueryでアニメーションを実装していると、「なぜか動かない」という状況に遭遇することがあります。

ここでは、よくある原因とその対処法を紹介します。

ライブラリ読み込みミス

最も基本的な原因の一つが、jQueryライブラリ本体が正しく読み込めていないケースです。チェックポイントと対処法を以下の表にまとめました。

  確認内容 対処法
scriptタグの記述 <head>タグ内または<body>タグの閉じタグ直前にjQueryライブラリを読み込む<script>タグが記述されているか HTMLソースコードを確認
CDN利用時 ・URLが正しいか
・ネットワーク接続に問題はないか
ブラウザでCDNのURLに直接アクセスして確認
ローカルファイル利用時 ファイルパスが正しいか ファイルの存在とパスを確認

正しくライブラリを読み込めていなかった場合は、ブラウザの開発者ツールのコンソールタブを開いて、「jQuery is not defined や $ is not defined」といったエラーが出ていないか確認しましょう。

エラーメッセージの「jQuery is not defined」はjQueryライブラリが読み込まれていない、「$ is not defined」はjQueryの$記号が認識されていないことが原因です。それぞれ表示されたメッセージを見て、タグの記述を見直したり正しいパスやURLを指定して確認してみてください。

DOM読み込みのタイミング

jQueryのコードが、操作対象のHTML要素(DOM)がブラウザによって読み込まれる前に実行されてしまうと、対象要素を見つけられずアニメーションが動作しません。

DOMの読み込みのタイミングが怪しいときは、jQueryのコードをjQuery(document).ready(function() { … });またはその短縮形jQuery(function() { … });で囲んでいるか確認しましょう。jQueryコード全体がラップされていると、DOMの準備が完了してからコードが実行されるようになります。

DOMが適切に読み込まれることで、HTML要素が確実にある状態でセレクタが評価され、アニメーションが適用されます。

CSSプロパティの未設定や競合

animate()で変化させようとしているCSSプロパティが、対象要素に初期設定されていなかったり、CSSファイル内の他のスタイルと競合していたりすると、期待通りに動作しないことがあります。

チェックポイントと対処法を以下の表にまとめました。

  確認内容 対処法
初期値の設定 アニメーションさせたいプロパティ(left, top, opacityなど)に初期値が設定されているか 事前にCSSまたはJavaScriptで初期値を設定する
positionプロパティ position: absolute、relative、fixedのいずれかが設定されているか topやleftでの移動アニメーションには必須
スタイルの競合 ・他のCSSルールと競合していないか
・!importantで上書きされていないか
・ブラウザの開発者ツールで確認
・優先度の調整または!importantの削除

ブラウザの開発者ツールの「要素(Elements)」タブで対象要素を選択し、「スタイル(Styles)」パネルで適用されているCSSを確認します。意図しないスタイルが優先されていないかチェックしてみましょう。

たとえば、移動アニメーションが効かないときはpositionプロパティが未設定、フェードアニメーションが効かないのはopacityの初期値の未設定が原因です。上記の表を見ながら、アニメーションの不具合を一つずつ確認してみてください。

jQueryアニメーションを
軽量化するコツ3つ

jQueryアニメーションは手軽ですが、使い方によってはWebサイトのパフォーマンスに影響を与えることもあります。

ここでは、アニメーションを軽量化し、スムーズな動作を保つための3つのコツを紹介します。

アニメーションキューの管理

ユーザーがボタンを連続でクリックした場合など、同じ要素に対してアニメーションが何度も繰り返し実行されようとすると、アニメーションが溜まってしまい、ぎこちない動きになることがあります。

.stop(true, true)を使用することで、ユーザーの意図通りに「今押したボタンの動作だけ」が実行されるようになり、快適なアニメーションの実装ができます。

コーディング方法は以下の通りです。

  • animate()の前に.stop(true, true)を挿入
  • 既存のアニメーションを停止し、キューをクリア
  • 最新のアニメーションのみがスムーズに実行

例を見てみましょう。

jQuery('#myButton').on('click', function() {
  jQuery('#animatedBox')
    .stop(true, true) // 既存のアニメーションを停止し、キューをクリア
    .animate({ left: '+=50px' }, 200);
});

ほとんどのWebサイトでは「ユーザーの操作に即座に反応する」ことが重要なので .stop(true, true) が推奨されます。

しかし、ボールが転がるような物理的な動きを表現したい場合は、途中でワープすると不自然に見えるため .stop(true, false) を使用するなどして状況に応じて調整しましょう。

調整オプション 動作 用途
.stop(true, true) 全アニメーション停止+最終状態へジャンプ 推奨:連続操作時のスムーズな動作
.stop(true, false) 全アニメーション停止+現在位置で停止 すぐにジャンプさせたくない場合

アニメーション要素の最適化

多数の要素を同時に、かつ複雑にアニメーションさせると、ブラウザの描画負荷が高まり、パフォーマンスが低下しやすくなります。

アニメーションを最適化させる4つの対処法を以下の表にまとめました。

  具体的な方法 効果
対象の絞り込み 全部の要素ではなく、重要な要素だけアニメーションをつける ブラウザの描画負荷が軽くなる
過度なアニメーション回避 大きく動かしすぎず、短時間で終わらせる 動作がスムーズになる
同時実行数の制限 delay()やsetTimeoutを使用して時間差で実行する CPUの計算処理とブラウザの描画処理の負荷が軽くなる
可視範囲のみに適用 画面に見えてない部分はアニメーションしない 無駄な処理がなくなる

ユーザー体験を損なわない範囲で、アニメーションの量や複雑さを調整することが重要です。

CSSアニメーションとの使い分け

単純な視覚効果や状態変化であれば、CSSトランジションやCSSアニメーションの方がパフォーマンスが良い場合があります。

jQueryとCSSを用途で使い分けることで、パフォーマンス向上につながります。

たとえば、色の変化やホバーはCSSで作成し、イベント処理やほかの機能と連携するときはjQueryで実装するのがおすすめです。どちらでコーディングするべきか迷ったときは、以下の使い分けの表を参考にしてみてください。

アニメーションの種類 言語 理由
ホバー CSS ブラウザの最適化
フェードイン・アウト CSS GPUアクセラレーションで高速
色の変化 CSS 軽量でスムーズ
複雑な連続動作 jQuery 細かい制御が可能
条件分岐のある動き jQuery プログラムで判断が必要

適切な言語を選択することで、見た目の良さとパフォーマンスを両立できます。CSSで基本的なアニメーションを設定し、jQueryでそれをトリガーするクラスを付け外す、といったハイブリッドなアプローチも有効です。

JavaScriptによるイベント処理や、ほかのロジックと連携した複雑なアニメーション制御が必要なときにjQueryを利用しましょう。

まとめ

jQueryを利用すれば、これまでハードルが高いと感じていたWebサイトのインタラクティブな表現も、手軽に実装できます。少しずつカスタマイズしていくことで、jQueryアニメーションの実装ポイントが自然に身についてきます。

紹介したサンプルコードを参考に、ぜひ魅力的なアニメーションを取り入れてみてください。

魅力的なブログがつくれる
WordPressテーマ集
WordPressテーマ「PANDORA」
レイアウト自由自在なブログ・メディアを構築。
WordPressテーマ「NULL」
技術や知見をシェアする開発者ブログを構築。
WordPressテーマ「Muum」
デザイン・SEOともに最高峰のブログに。
WordPressテーマ「Cherie」
華やかなブログで集客できるテンプレート。