はじめに
前回はjQueryのアニメーション機能について解説し、
今回このお題をforkしてもらったコードを紹介しながら解説していきます。
模範解答
まずは模範解答として、
この作品はページ切り替えの部分を以下のように変更しているだけです。
$currentPage.fadeOut("fast");
$targetPage.slideDown();
1行目の部分で現在のページがフェードアウトして2行目で表示させるページがスライドダウンで表示されます。jQueryを使うととても簡単にアニメーションすることができるということがわかる作品です。
前回解説したように、
今回のお題のポイント
コールバックを使う
今回のお題のポイントをいくつか解説したいと思います。まず1つ目は、
$currentPage.slideUp();
$targetPage.slideDown();
これでうまくいくように思いますが、
これだとスライドアップとスライドダウンが同時に実行されるため意図した動作になりません。そこでスライドアップが終わった後にスライドダウンを行うという動作にするため、
$currentPage.slideUp(function() {
$targetPage.slideDown();
});
slideUpの第一引数に関数を指定すると、
これで意図した動作になりました。ただしアニメーションによっては同時に行うことを意図していることもあると思うので必ずしもコールバックを使えばいいというわけではありません。
タブを切り替える条件を設定する
この作品はアニメーション自体もイージングを使って透明度なども同時に切り替えていて工夫されているのですが、
if(($tabs.data('currentTabId') !== tabId) && ($targetPage.is(':not(:animated)'))) {
// アニメーションの処理
}
このような処理を行っていない場合、
工夫されていた作品
jQuery組み込みのアニメーション関数だけでなく、
leftの値を変えてスライドさせる
この作品はfadeInやfadeOutに一手間加えることで面白い動きになっています。実際にアニメーションを行っているコードは以下のようになっています。
$currentPage.animate({left:-420}).fadeOut();
$targetPage.animate({left:20}).fadeIn();
フェードイン、
specialEasingやdelayを使った作品
上記作品は、
$currentPage.hide();
$targetPage
.css({display:'block',width:0,height:0})
.animate({
width:200,
height:300
}, {
duration: 500,
specialEasing: {
width: 'linear',
height: 'easeOutBounce'
}
})
.delay(1000)
.animate({ width:400 }, 500, 'easeOutBounce');
また、
面白いアニメーションの作品
この作品は一瞬上にコンテンツがふくらんでバウンドするような、
$currentPage.animate({
height: (currentHeight + tabHeight) + 'px',
marginTop: '-' + tabHeight + 'px'
}, {
duration: 200,
easing: 'easeOutExpo',
complete: function() {
// 次の処理...
}
});
このようにしないと、
スライドするアニメーション
こちらはほとんど元コードの原型をとどめていない作品でした。現在の地点から距離を計算してmarginを値をアニメーションさせています。簡単にコードを解説してみたいと思います。
// タブの切り替え
function changeTab(tabId) {
var distance;
// コンテンツの切り替え(ここをアニメーションさせてください)
// カレントのタブ以外を選択した場合に切り替え実行
if($tabs.data('currentTabId') !== tabId) { // - (1)
// 移動量算出
distance = tabId - $tabs.data('currentTabId'); // - (2)
// アニメーション処理
$slider.stop(true, true);
$slider.animate(
{ 'marginLeft' : calcMargin(distance) }, // - (3)
{ duration : DURATION, easing : EASING_METHOD }
);
// カレントのタブ変更
$tabs.data('currentTabId', tabId); // タブID格納
$tabs.removeClass('current');
$tabs.filter('#tab' + tabId).addClass('current');
}
}
この関数がタブを押したときに呼ばれる関数になっています。まず(1)の部分で、
// マージン量の算出
function calcMargin(distance) {
var margin = parseInt($slider.css('marginLeft').replace('px', ''), 10);
return margin + contentWidth * distance * -1;
}
後は(3)のように、
終わりに
前回と今回でjQueryのアニメーションの解説をしました。jQueryを使えば簡単にアニメーションが実装できることがわかったと思います。次回からはjQuery UIを使ったさまざまなUIの作り方について解説していきます。