
全画面表示の美しいモーダルが簡単に実装できる「animatedmodal.js」
ただ、これに1つ不具合があったからその修正。
内容
不具合の内容は、「モーダルを閉じてすぐにその閉じたモーダルを開こうとするとバグる」ってもの。
すぐっていうのは1秒以内なんだけど、サイトの構成次第では発生しうる内容だと思う。ってか実際そうなった。
原因
肝心の原因はというと、このanimatedmodalの処理のタイミングだった。
このanimatedmodalの大体87行目とか108行目に、
id.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', afterOpen);
id.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', afterClose);
というものが書いてあるんだけど、これは要するに、アニメーションが終わった後にafterOpen(afterClose)実行するやでっていうもの。
(afterCloseにはz-indexを-にする記述がある)
んで、アニメーションが終了する前にもう1回開始するとmodal全体はafterOpenの状態に、z-indexだけがafterCloseの状態になることでバグる。
対処法
これの回避法はまあ幾つか考えられるんだけど、一番楽な、
「afterCloseの処理が完了してない状態で開始できないようにする」っていう方法で解決した。
やり方としては、72行目あたりを
modal.click(function(event) {
if (id.css('z-index') == settings.zIndexOut || id.css('opacity') == '0') {
event.preventDefault();
$('body, html').css({'overflow':'hidden'});
if (href == idConc) {
if (id.hasClass(settings.modalTarget+'-off')) {
id.removeClass(settings.animatedOut);
id.removeClass(settings.modalTarget+'-off');
id.addClass(settings.modalTarget+'-on');
}
if (id.hasClass(settings.modalTarget+'-on')) {
settings.beforeOpen();
id.css({'opacity':settings.opacityIn,'z-index':settings.zIndexIn});
id.addClass(settings.animatedIn);
id.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', afterOpen);
};
}
}
});
こうしてしまえばいい。2行目のif文を加えただけなんだけど。
要するに、z-indexがafterOpenの処理が終わった後の状態もしくはopacityが0の状態どちらかを満たしているのなら実行するっていう風にした。
opacityの記述がないと、一番最初にモーダルが立ち上がらなくなるから注意。
(animatedmodalのmodalは1回目立ち上げの時はopacityを0から1にすることで表示させていて、2回目以降はz-indexを操作して実行している)
もしここで躓いてる人がいたら、参考にしてみてくーださい。