- 記事公開日
 
scrollReveal.jsがうまく動かない原因とその対策
		scrollReveal.jsを使ってるんだけど、一回目の読み込みのときだけアニメーションが動かなかったり、スマホ(iPhone)だとうまく動かないときがあるの。パソコンで見た時はちゃんと動くのに・・・
何か良い対策はない?
		ありがちな原因は以下の3つです。
1.画像が重すぎる
2.viewFactor(アニメーションを開始するために表示が必要な要素の割合)の値が大きすぎる
3.オプションを書く位置が悪い(HTMLの一番最後がベスト)
それでも直らない場合は、scrollReveal.jsを使わずにjQueryとCSSアニメーションを使って、オリジナルのコードを書いてしまいましょう。
その方が軽量だし、確実だし、自由度も高いです。
今回はそのサンプルを紹介しますね、意外と簡単ですよ。

<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="robots" content="noindex">
<title>DEMO</title>
<!-- jQuery -->
<script src='js/jquery.min.js'></script>
<script>
$(function() {
	// 画面の高さを取得
	var window_height = $(window).height();
	// スクロールしたときに実行
	$(window).on("scroll", function() {
		// スクロールの座標を取得
		var scroll = $(window).scrollTop();
		// 指定する要素
		var arr = [
			"dog",
			"boy",
			"girl",
		];
		// 該当要素をループで検索
		$.each(arr, function(i, val) {
			// デバッグ用(座標ステータスの表示)
			var scroll_y = scroll+ window_height;
			$('#status').html('スクロールのY軸/bottom座標:' + scroll_y + '<br>' + '犬のY軸/top座標:' + $('#dog').offset().top + '<br>' + '男のY軸/top座標:' + $('#boy').offset().top + '<br>' + '女のY軸/top座標:' + $('#girl').offset().top + '<br>');
			// スクロール値 + 画面の高さ + 要素の高さ = 要素が画面内に入った瞬間を検知
			if(scroll+ window_height - $('#' + val).height() > $('#' + val).offset().top) {
				$('#' + val).addClass(val + '_anime');
				
				return true;
			}
		});
	});
});
</script>
<style>
#container {
	padding:10vh 0;
	text-align:center;
}
#dog {
	width:10vh;
	height:auto;
	margin:50vh 0 1.5em;
}
.dog_anime {
	animation-name:dog_motion;
	animation-fill-mode:forwards;
	animation-duration:1s; 
	animation-delay:0.5s;
}
@keyframes dog_motion {
	0% {
		transform: scale(1);
	}
	100% {
		transform: scale(2);
	} 
}
#boy {
	width:20vh;
	height:auto;
	margin:50vh 0 0em;
	transform: translateX(300px);
}
.boy_anime {
	animation-name:boy_motion;
	animation-fill-mode:forwards;
	animation-duration:1s; 
	animation-delay:0.5s;
}
@keyframes boy_motion {
	0% {
		transform: translateX(300px);
	}
	100% {
		transform: translateX(-300px);
	} 
}
#girl {
	width:20vh;
	height:auto;
	margin:50vh 0 0;
}
.girl_anime {
	animation-name:girl_motion;
	animation-fill-mode:forwards;
	animation-duration:1s; 
	animation-delay:0.5s;
}
@keyframes girl_motion {
	0% {
		transform: translateY(0px);
	}
	50% {
		transform: rotate(-90deg);
}
	100% {
		transform: rotate(-90deg) translateX(200px);
	} 
}
#status {
	position:fixed;
	top:1em;
	right:1em;
	text-align:left;
}
</style>
</head>
<body>
<div id="container">
	<div>↓↓↓ 下にスクロール ↓↓↓</div>
	<div>
		<img src="image/dog.png" id="dog">
		<p>大きくなる</p>
	</div>
	
	<div>
		<img src="image/boy.png" id="boy">
		<p>右から左へ移動</p>
	</div>
	
	<div>
		<img src="image/girl.png" id="girl">
		<p>回転して上に移動</p>
	</div>
	<div id="status"></div>
</div>
</body>
</html>
                