<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Parallax &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/parallax/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Fri, 25 Oct 2013 01:24:24 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>スクロールに応じたアニメーションにイージング関数を適用したい</title>
		<link>https://blog.mach3.jp/2013/10/25/easing-for-scroll-animation.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 25 Oct 2013 01:24:24 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jquery.easing]]></category>
		<category><![CDATA[Parallax]]></category>
		<category><![CDATA[Scroll]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3555</guid>

					<description><![CDATA[縦長にスクロールしてアニメーションを楽しませるサイトも今では珍しくなくなってきました。 実装する機会もぼちぼちありそうなので、今日はそういったアニメーションでイージング関数を利用するお話です。 スクロールに応じたアニメー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>縦長にスクロールしてアニメーションを楽しませるサイトも今では珍しくなくなってきました。 実装する機会もぼちぼちありそうなので、今日はそういったアニメーションでイージング関数を利用するお話です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-7Q0kBo6sjaU/Umks_jssugI/AAAAAAAACOQ/WpJh8DuV5Sg/s400/20131025-00.png" alt="スクロールに応じたアニメーションにイージング関数を適用したい"/></figure>



<p></p>



<span id="more-3555"></span>



<h2 class="wp-block-heading">スクロールに応じたアニメーションって何</h2>



<p>「パララックス」と一言にいってしまえば良いのですが、 視差効果で立体的に見せる手法を指して「パララックス」と言うのならば そうではないコンテンツも多くあると思いますので、 「スクロール量に応じてコンテンツをアニメーションさせる事」を、 ここではそのように呼称したいと思います。</p>



<p>ちょっと長いので「スクロールアニメーション」でいいでしょうか。</p>



<h3 class="wp-block-heading">シンプルな例</h3>



<p>具体的にどういう事なのかをごくシンプルなコードで表現してみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-built_in">window</span>).on(<span class="hljs-string">"scroll"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> scroll = $(<span class="hljs-built_in">window</span>).scrollTop();
    $(<span class="hljs-string">".box"</span>).css({
        <span class="hljs-string">"top"</span>: scroll,
        <span class="hljs-string">"left"</span>: scroll * <span class="hljs-number">2</span>
    });
});
</code></span></pre>


<p>&#8220;.box&#8221; のtop/leftを現在のスクロール量に合わせて変化させる処理をスクロールイベントに登録しています。 位置の他にも、要素のサイズや色、スプライトされた背景画像のポジションなどを変化させれば ユーザーのスクロールにあわせて多彩な表現が出来ますね。</p>



<h3 class="wp-block-heading">requestAnimationFrameを使ってみる</h3>



<p>ここでスクロールイベントの代わりに、新しめの実装の <a href="https://developer.mozilla.org/ja/docs/Web/API/window.requestAnimationFrame">requestAnimationFrame</a> を使ってみようと思います。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> step = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> scroll = $(<span class="hljs-built_in">window</span>).scrollTop();
    $(<span class="hljs-string">".box"</span>).css({
        <span class="hljs-string">"top"</span>: scroll,
        <span class="hljs-string">"left"</span>: scroll * <span class="hljs-number">2</span>
    });
    requestAnimationFrame(step);
};
step();
</code></span></pre>


<p>cf) <a href="/2013/10/18/request-animation-frame.html">requestAnimationFrameについて調べてみた</a></p>



<h2 class="wp-block-heading">jQuery.easing プラグインを利用してイージングをかける</h2>



<p>本題です。上のコードではイージングが一切かからない状態でアニメーションされます。 これにイージングをかけたいです。しかも楽をしてかけたい。すごくかけたい。</p>



<p>JavaScriptでのイージングといえば <a href="">jQuery.easing プラグイン</a> がおなじみですね。 このプラグインで宣言されるイージングの関数（ $.easing.* ）を使えば簡単に出来そうですが、 まずイージング関数に何を渡せばいいかを調べてみます。</p>



<h3 class="wp-block-heading">実際にイージング関数に渡されている引数</h3>



<p>jQueryにはじめから同梱されているイージングは &#8220;swing&#8221; と &#8220;linear&#8221; があります。 まずはこれらの関数で引数をどのようにとっているか、コードを拝見してみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">jQuery.easing = {
    <span class="hljs-attr">linear</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> p </span>) </span>{
        <span class="hljs-keyword">return</span> p;
    },
    <span class="hljs-attr">swing</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> p </span>) </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-number">0.5</span> - <span class="hljs-built_in">Math</span>.cos( p*<span class="hljs-built_in">Math</span>.PI ) / <span class="hljs-number">2</span>;
    }
};
</code></span></pre>


<p>この p はどうやら開始値から終了値までの範囲で今どの地点にいるのかを渡しているみたいです。</p>



<p>では jQuery.easing プラグインではどのようになっているか見てみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">easeOutQuad: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">x, t, b, c, d</span>) </span>{
    <span class="hljs-keyword">return</span> -c *(t/=d)*(t<span class="hljs-number">-2</span>) + b;
},
</code></span></pre>


<p>この &#8220;easeOutQuad&#8221; は &#8220;swing&#8221; の代替として宣言されている関数なわけですが、引数を見てみると全然数が違う上に、第一引数の &#8220;x&#8221; を使用していません。 <a href="">jQuery.easing プラグイン</a> のWebサイトを参照すると、右下の方に引数の解説が記載されています。 軽く拙訳を書いてみると、こんな感じみたいです。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">jQuery.easing.method(
    <span class="hljs-literal">null</span>,          <span class="hljs-comment">// 式では使用しない</span>
    current_time,  <span class="hljs-comment">// 現在の時間</span>
    start_value,   <span class="hljs-comment">// 開始値</span>
    end_value,     <span class="hljs-comment">// 終了値</span>
    total_time     <span class="hljs-comment">// 所要時間</span>
)
</code></span></pre>


<p>スクロール量をベースにしてイージングをかけるためには、&#8221;current_time&#8221; と &#8220;total_time&#8221; をスクロール量におきかえてあげればうまくいきそうですね。</p>



<h3 class="wp-block-heading">実際に簡単に動かしてみる</h3>



<p>アニメーションを開始・終了するスクロール位置を定義してやり、その差を duration (&#8220;total_time&#8221;) として扱います。 現在のスクロール位置は、関数に渡す前にスクロール開始位置を引いてやりましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">/**
 * スクロール量が 500-1000 に差し掛かった時に
 * ".box" の "left" を 100-1000 の間でアニメーションさせる
 */</span>
(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> box, start, end, <span class="hljs-keyword">from</span>, to;

    box = $(<span class="hljs-string">".box"</span>);
    scrollStart = <span class="hljs-number">500</span>; <span class="hljs-comment">// アニメーションを開始するスクロール位置</span>
    scrollEnd = <span class="hljs-number">1000</span>;  <span class="hljs-comment">// アニメーションを終了するスクロール位置</span>
    <span class="hljs-keyword">from</span> = <span class="hljs-number">100</span>;  <span class="hljs-comment">// "left" の開始値</span>
    to = <span class="hljs-number">1000</span>;   <span class="hljs-comment">// "left" の終了値</span>

    step = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">var</span> scroll, progress;
        scroll = $(<span class="hljs-built_in">window</span>).scrollTop();
        <span class="hljs-keyword">if</span>(scroll &lt; scrollStart){
            box.css(<span class="hljs-string">"left"</span>, <span class="hljs-keyword">from</span>);
        } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(scroll &gt; scrollEnd){
            box.css(<span class="hljs-string">"left"</span>, to);
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-comment">// scroll と duration から現在位置を割合で取得</span>
            progress = $.easing.easeOutQuad(
                <span class="hljs-literal">null</span>,
                scroll - scrollStart,
                <span class="hljs-number">0</span>,
                <span class="hljs-number">1</span>,
                scrollEnd - scrollStart
            );
            <span class="hljs-comment">// 取得した割合を掛けて値を取得し、"left" に設定する</span>
            box.css(<span class="hljs-string">"left"</span>, <span class="hljs-keyword">from</span> + (to - <span class="hljs-keyword">from</span>) * progress);
        }
        requestAnimationFrame(step);
    };

    step();
}());
</code></span></pre>


<h3 class="wp-block-heading">&#8220;linear&#8221; はどうなるのか</h3>



<p>jQueryに同梱されているイージング関数2点のうち、&#8221;swing&#8221; は jquery.easing プラグインで再定義されているので問題ないのですが、 &#8220;linear&#8221; は上のコードのように使おうとすると引数が合わずに正常に動きません。</p>



<p>取り急ぎですが、引数を合わせた形で再定義してみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.easing.linear = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x, t, b, c, d</span>)</span>{
    <span class="hljs-keyword">if</span>(x !== <span class="hljs-literal">null</span>){ <span class="hljs-keyword">return</span> x; }
    <span class="hljs-keyword">return</span> b + ((c - b) * (t / d));
};
</code></span></pre>


<h2 class="wp-block-heading">いろんなイージングで動かしてみたデモ</h2>



<p><iframe width="100%" height="340" src="http://jsfiddle.net/mach3ss/TTHaq/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>



<h2 class="wp-block-heading">まとめ</h2>



<p>スクロールアニメーションを操作するライブラリを先日見かけたのですが、 そのライブラリではいくつかのイージング関数を独自に定義していました。 （あろうことか、どのライブラリのコードを読んでいたのか、書いているうちに忘却してしまいました…）</p>



<p>せっかくなので様々なイージング関数を楽して使えたらな、と思い調べてみた記録でした。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
