3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ザ・ベストテンのようなパタパタ表現の作り方

Last updated at Posted at 2016-03-22

デモ:http://mo49.tokyo/qiita/20160317/

まず数字を表示させる部分を用意

html
<div class="graph graph1">
	<div class="headcount headcount1">
		<!-- 10% -->
		<div class="numbers_move num1 delay1"></div><!-- 1 -->
		<div class="numbers_move delay1"></div><!-- 0 -->
		<div class="percents_move delay1"></div><!-- % -->
	</div>
</div>

スプライト画像をinfiniteでアニメーションさせているという前提。
(デザイナーが大変。。)

scss
$steps_num: 60; /* ステップ数 */
$koma_num: 61px; /* 1ステップで進む距離 */

.numbers_move {
    height: 0;
    padding-top: $koma_num;
    width: 37px;
    overflow: hidden;
    background-image: url(../img/numbers.png);
    background-position: 0 0;
    animation: flip_num 1s steps($steps_num) infinite;
}

@keyframes flip_num{
    0%    { background-position: 0 0; }
    100%  { background-position: 0 (- $koma_num * $steps_num); }
}

/*
以下、パーセントも同じようにスタイル指定
*/

数字を止める位置、遅延時間の設定

scss
/* 
アニメーション最後の100%の位置だと「0」が表示されるので
何ステップ目で止まって欲しいかを指定 
*/
.fix_num1{ background-position: 0 (- $koma_num * 6 * 1); }
.fix_num4{ background-position: 0 (- $koma_num * 6 * 4); }
.fix_num7{ background-position: 0 (- $koma_num * 6 * 7); }

/* アニメーション書き換え infiniteを外す */
.stop_numbers{ animation: flip_num 1s 4 steps($steps_num); }
.stop_percents{ animation: flip_percent 0.2s 20 steps($steps_percent); }

/* load時点での遅延 */
.delay1{ animation-delay: -0.5s; }
.delay2{ animation-delay: -0.3s; }
.delay3{ animation-delay: -0.1s; }
.delay4{ animation-delay: 0.1s; }

/* 
cssアニメーションを書き換えた瞬間の遅延
これで止まる時間に時差が生まれる 
*/
.delay5{ animation-delay: -0.8s; }
.delay6{ animation-delay: -0.2s; }
.delay7{ animation-delay: 0.4s; }
.delay8{ animation-delay: 1s; }

scrollで閾値を越えるとcssアニメーションをストップさせるクラスを付与。
animation-delayでタイミングをずらして止める。

javascript
$(window).on('scroll', function(){
	var $offsetTop = $('.flips_wrapper').offset().top - $(window).height();
	var $windowTop = $(window).scrollTop();
	var $headcount = $('.headcount');
	var $destination = $('.destination');

	if ( $windowTop > $offsetTop + 200 ) {

		// 一度入ったらscrollを切らないと何度もクラスをつけることになってしまうので
		$(window).off('scroll');

		$('.numbers_move').addClass('stop_numbers');
		$('.percents_move').addClass('stop_percents');

		// .delay5-8を付加して遅延させる
		for (var i = 0; i < 4; i++) {
			var delay_id = i + 5;
			var delay = 'delay' + delay_id;
			$headcount.eq(i).children().addClass(delay);
		}

		// アニメーションが終わった瞬間に、最終的に見せたい数字の場所を確定
		$(".stop_numbers").on('animationend webkitAnimationEnd', function(){
			$('.num1').addClass('fix_num1');
			$('.num4').addClass('fix_num4');
			$('.num7').addClass('fix_num7');
		});
		$(".stop_percents").on('animationend webkitAnimationEnd', function(){
			$('.percents_move').addClass('fix_percent');
		});

	}

});

参考
純粋なフリップ時計でよいならばFlipClock.js

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?