resizeやscrollは通常イベントが発生する毎に処理を行いますが、イベント発生毎ではなく、特定のときに1回だけ処理を行いたいという時がよくあります。
今回は特定の状態になったら処理を行い、それ以降は処理を行わないような実装を試してみます。
サンプルコード
スクロールで特定の位置まで来たら、要素のアニメーションを1回だけ行うようにしてみます。
まずは特に対応しなかった場合です。
HTML
<div class="box"></div>
CSS
.box {
position: absolute;
top: 1000px;
left: 100px;
width: 200px;
height: 200px;
background: #ccc;
}
JavaScript
$(function() {
$(window).on('scroll', function() {
// スクロール位置と画面高さを取得
var scTop = $(window).scrollTop();
var winHeight = $(window).height();
// 対象要素の位置と高さ取得
var tgtTop = $('.box').offset().top;
var tgtHeight = $('.box').height();
if(winHeight + scTop >= tgtTop + tgtHeight) {
$('.box').animate({
left: 200
}, 500).animate({
left: 100
}, 500);
}
})
});
スクロールで特定の位置まで来たらアニメーションを行うデモページ
この場合、特定の位置以降でスクロールした場合も毎回アニメーションが発生してしまいます。
対応後のコードが以下になります。
JavaScript
$(function() {
var animationFlag = false;
$(window).on('scroll', function() {
// スクロール位置と画面高さを取得
var scTop = $(window).scrollTop();
var winHeight = $(window).height();
// 対象要素の位置と高さ取得
var tgtTop = $('.box').offset().top;
var tgtHeight = $('.box').height();
if(winHeight + scTop >= tgtTop + tgtHeight) {
if(!animationFlag) {
animationFlag = true;
$('.box').animate({
left: 200
}, 500).animate({
left: 100
}, 500);
}
}
})
});
スクロールで特定の位置まで来たら1回だけアニメーションを行うデモページ
アニメーションしたかどうかをanimationFlagという変数で管理しています。
アニメーションを1回実行したら変数の値を変更して、2回目以降は処理を行わないようにします。
サンプルコード2
リサイズでPCサイズからSPサイズ、またはSPサイズからPCサイズになった時に1回だけ処理を行ってみます。
JavaScript
var widthFlag = '';
$(function() {
// 画面サイズのチェック
$(window).on('load resize', function() {
widthCheck();
});
});
// 画面サイズのチェック
function widthCheck() {
// 画面幅取得
var winWidth = $(window).width();
// 画面幅640以下でフラグがspでない時
if(winWidth <= 640 && widthFlag != 'sp') {
// フラグをSPに変更
widthFlag = 'sp';
console.log('spの処理');
// 画面幅640よりおおきく、フラグがpcでない時
} else if(winWidth > 640 && widthFlag != 'pc') {
// フラグをPCに変更
widthFlag = 'pc';
console.log('pcの処理');
}
}
リサイズでPCからSP、SPからPCに変更した時に1回だけ処理を行うデモページ
先ほどと同じく、widthFlagという変数で現在がSPなのかPCなのかを管理して、変更があったときに1回だけ処理を行うようにしています。
コメントが承認されるまで時間がかかります。