CSSのanimationで背景画像をtranslateで無限ループさせたらブランクが発生した【transform】【translate】


バルーンをループで上げるCSSアニメーションを、「background-position」で動作させたら、画面描写が重いのなんの。
iPhoneのsafariで見ていたら、iPhoneがすごい勢いで熱を持つ。

という事で、移動アニメーションは「transform:translate3d()」を使ってGPUで動かす方式に変更。

・・・そしたら今度はループのつなぎ目でブランク(空白)が生じてしまうという問題が。。

 

 

苦肉の策として編み出したのがこちらのソース。

・動かす要素をHTMLに追加。(元のものとまったく同じものを設置。)
・CSSで、増やした方の要素を、時間差の周回遅れでanimation実行。

要素を増やさないでも、animationの複数設定(カンマ区切りのタイプ)でイケそうだけど、なぜか動作しなかった。
というわけで、最終的にこれを採用。

 

手は混んでるけど、目的通り、ちゃんと動作は軽くなった。

 

 

 

HTML

画面構成のフレームは3枚で、奥行きを出す感じで3層構造の設計。「ballon_back」「ballon_middle」「ballon_front」。
同じ要素を、二重に用意。(コメントで「2」ってついてるのを追加した。)

<div class="ballon ballon_back">/* 背景(奥)1 */</div>
<div class="ballon ballon_middle">/* 背景(真ん中)1 */</div>
<div class="ballon ballon_front">/* 背景(前)1 */</div>

<div class="ballon ballon_back">/* 背景(奥)1 */</div>
<div class="ballon ballon_back">/* 背景(奥)2 */</div>
<div class="ballon ballon_middle">/* 背景(真ん中)1 */</div>
<div class="ballon ballon_middle">/* 背景(真ん中)2 */</div>
<div class="ballon ballon_front">/* 背景(前)1 */</div>
<div class="ballon ballon_front">/* 背景(前)2 */</div>

 

 

CSS

.ballon_front,
.ballon_middle,
.ballon_back{
	position:absolute;
	top:0;
	left:0;
	width:100%;
	background-position:0 0;

	-webkit-animation:ballon_move 40s linear infinite;
	-moz-animation:ballon_move 40s linear infinite;
	-ms-animation:ballon_move 40s linear infinite;
	animation:ballon_move 40s linear infinite;
}
.ballon_front{
	height:1000px;
	background-image:url("img/ballon1.png");
	background-size:auto 500px;
}
.ballon_middle{
	height:800px;
	background-image:url("img/ballon2.png");
	background-size:auto 400px;
}
.ballon_back{
	height:600px;
	background-image:url("img/ballon3.png");
	background-size:auto 300px;
}
.ballon:nth-child(even){  /* ★増殖した「2(奇数要素)」を、周回遅れでアニメーションさせる */
	-webkit-animation-delay:20s;
	-moz-animation-delay:20s;
	-ms-animation-delay:20s;
	animation-delay:20s;
	-webkit-animation-fill-mode:backwards;
	-moz-animation-fill-mode:backwards;
	-ms-animation-fill-mode:backwards;
	animation-fill-mode:backwards;
}

@keyframes ballon_move{
	0%{transform:translate3d(0,100vh,0);}
	100%{transform:translate3d(0,-100%,0);}
}
@-webkit-keyframes ballon_move{
	0%{transform:translate3d(0,100vh,0);}
	100%{transform:translate3d(0,-100%,0);}
}
@-moz-keyframes ballon_move{
	0%{transform:translate3d(0,100vh,0);}
	100%{transform:translate3d(0,-100%,0);}
}
@-ms-keyframes ballon_move{
	0%{transform:translate3d(0,100vh,0);}
	100%{transform:translate3d(0,-100%,0);}
}