<?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>Blur &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/blur/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Tue, 12 Feb 2013 01:08:56 +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>JavaScriptのスライダーにブラー効果をつけてみる実験</title>
		<link>https://blog.mach3.jp/2013/02/12/blur-slider-javascript.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 12 Feb 2013 01:08:56 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[Blur]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Slider]]></category>
		<category><![CDATA[Widget]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3002</guid>

					<description><![CDATA[先日リニューアルのご報告をした Matsukaze.で使用している ブラー効果をつけたスライダーで、実験的に採用した手法を記録しておきます。 基本的な仕組み まずスライダーに使用する絵を連結して一枚の画像にしたものを作成 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>先日リニューアルのご報告をした <a href="http://www.mach3.jp">Matsukaze.</a>で使用している ブラー効果をつけたスライダーで、実験的に採用した手法を記録しておきます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-dAa4bijhHFY/URkFoz7LeBI/AAAAAAAAB98/hmxSmcgapNA/s400/20130211-00.png" alt="JavaScriptのスライダーにブラー効果をつけてみる実験"/></figure>



<p></p>



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



<ol class="wp-block-list">
<li>基本的な仕組み</li>



<li>ぼかし画像の透明度について</li>



<li>簡単なデモ</li>



<li>まとめ</li>
</ol>



<h2 class="wp-block-heading">基本的な仕組み</h2>



<p>まずスライダーに使用する絵を連結して一枚の画像にしたものを作成。 そして、その画像を横にブレさせた画像を別途用意します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-ql0gSvfjEPg/URkFo-ThxSI/AAAAAAAAB98/YL2KdpH6B6E/s500/20130211-01.png" alt="連結画像とぼかし画像"/></figure>



<p></p>



<p>ぼかし画像は、例えばFireworksなら「移動（ぼかし）」を水平方向にかけ、 さらにその上に反対方向の「移動（ぼかし）」をかけたものを透明度50%ぐらいで重ねています。 ぼかしの強さはコンテンツの内容・大きさとご相談で、いい按排を探ります。</p>



<p>HTML上ではその2つの画像を、ぼかし画像を上にして重ね合わせて配置し、 スライダーが動く時にぼかし画像の透明度を変更してスピード感を出します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-a_PmlMhx6KI/URkFo6cT2LI/AAAAAAAAB98/3Qa1s1LJOIE/s500/20130211-02.png" alt="基本的な仕組み"/></figure>



<p></p>



<p>基本的な仕組みはこんな感じです。</p>



<h2 class="wp-block-heading">ぼかし画像の透明度について</h2>



<p>さて、課題はぼかし画像の透明度をどのように調整するか。 前提として、こんなHTMLとスタイルシートを用意しました。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"my-slider"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"blur-slider"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"slider-images"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./photo-blur.png"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"image-blur"</span> /&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./photo.png"</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="css">
    <span class="hljs-selector-class">.blur-slider</span> {
        <span class="hljs-attribute">position</span>: relative;
        <span class="hljs-attribute">width</span>: <span class="hljs-number">500px</span>;
        <span class="hljs-attribute">height</span>: <span class="hljs-number">331px</span>;
        <span class="hljs-attribute">border</span>: <span class="hljs-number">2px</span> solid <span class="hljs-number">#fff</span>;
        <span class="hljs-attribute">margin</span>: <span class="hljs-number">0</span> auto;
        <span class="hljs-attribute">overflow</span>: hidden;
    }
    <span class="hljs-selector-class">.blur-slider</span> <span class="hljs-selector-class">.slider-images</span> {
        <span class="hljs-attribute">position</span>: absolute;
        <span class="hljs-attribute">left</span>: <span class="hljs-number">0</span>;
        <span class="hljs-attribute">top</span>: <span class="hljs-number">0</span>;
    }
    <span class="hljs-selector-class">.blur-slider</span> <span class="hljs-selector-class">.slider-images</span> <span class="hljs-selector-class">.image-blur</span> {
        <span class="hljs-attribute">position</span>: absolute;
        <span class="hljs-attribute">opacity</span>: <span class="hljs-number">0</span>;
        <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">alpha</span>(opactiy=<span class="hljs-number">0</span>);
    }
</span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>
</code></span></pre>


<h3 class="wp-block-heading">普通に値を変更した時のコレジャナイ感</h3>



<p>まずはじめに、単純にスライダーと同時にぼかし画像を表示させ、アニメーション終了にあわせて透明度を下げていってみました。 ざっと書くとこんな感じです。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">var</span> $container, $slider, $blurImage, show;

$container = $(<span class="hljs-string">"#my-slider"</span>);
$slider = $container.find(<span class="hljs-string">".slider-images"</span>);
$blurImage = $slider.find(<span class="hljs-string">".image-blur"</span>);

show = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(index)</span></span>{
    $slider
        .stop()
        .animate(
                { left: $container.width() * index * <span class="hljs-number">-1</span> }
        );
    $blurImage
        .stop()
        .css(<span class="hljs-string">"opacity"</span>, <span class="hljs-number">1</span>)
        .animate(
                { opacity: <span class="hljs-number">0</span> }
        );
};

show(<span class="hljs-number">1</span>); <span class="hljs-comment">// とりあえず2番目の画像を表示してみる</span>
</code></span></pre>


<p>動かしてみましたが、かなり動きに違和感があります。 他にも、変化を山なりにしてみたりしましたが、どうもコレジャナイ。 イージング関数によってはまともに見えるかもしれませんが、 実際の速度とブレが同期してないので気持ち悪くて当然ですね。</p>



<h3 class="wp-block-heading">はやければはやいほどブレるように</h3>



<p>やはりブレは動きの速さに比例するもの。 そこで、動きがはやければはやいほどブレるように調整した show 関数を書いてみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">show = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">index</span>)</span>{
    $slider.stop().animate(
        {
            <span class="hljs-attr">left</span> : $container.width() * index * <span class="hljs-number">-1</span>
        },
        {
            <span class="hljs-attr">duration</span> : <span class="hljs-number">500</span>,
            <span class="hljs-attr">easing</span> : <span class="hljs-string">"swing"</span>,
            <span class="hljs-attr">step</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">now</span>)</span>{ <span class="hljs-comment">/* A */</span>
                <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>.prevLeft !== <span class="hljs-literal">undefined</span>){
                    $blurImage.css(
                        <span class="hljs-string">"opacity"</span>,
                        <span class="hljs-built_in">Math</span>.abs(<span class="hljs-keyword">this</span>.prevLeft - now) / <span class="hljs-number">25</span> <span class="hljs-comment">/* B */</span>
                    );
                }
                <span class="hljs-keyword">this</span>.prevLeft = now;
            },
            <span class="hljs-attr">complete</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{ <span class="hljs-comment">/* C */</span>
                $blurImage.css(<span class="hljs-string">"opacity"</span>, <span class="hljs-number">0</span>);
            }
        }
    );
};
</code></span></pre>


<p>(A) jQuery.animate のオプションの &#8220;step&#8221; では、アニメーションのステップ毎に関数を実行する事ができます。 上の例では、前ステップの値と現在の値を比較して、その差からぼかし画像の透明度を計算しています。</p>



<p>(B) &#8220;25&#8221;は、1ステップに何ピクセル以上動いている時に不透明度100%とするか、という数値です。 要するにどのくらいの速度ならばブラーが最大限表示されるか。 移動距離やコンテンツの大きさでうまいこと調整します。</p>



<p>(C) &#8220;complete&#8221; はアニメーション完了時の関数を実行できます。 完了時にはぼかし画像の不透明度をゼロにします。</p>



<p>ステップ毎に計算させる関係でパフォーマンスがちょっと心配になりますね。 多用はあまりしない方がよさそうですが、今回の <a href="http://www.mach3.jp">Matsukaze.</a> では2箇所限定なので、この方法を採用してみちゃいました。 やはり少々重たい気がしますが、ブレが少し自然になったとおもいます。</p>



<h2 class="wp-block-heading">簡単なデモ</h2>



<p>イージング関数と所要時間をいじれるデモを作ってみましたのでどうぞ。</p>



<p><a class="jsbin-embed" href="http://jsbin.com/ocalar/1/embed?live">JS Bin</a><script src="http://static.jsbin.com/js/embed.js"></script></p>



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



<p>わりと泥臭い感じではありますが、パフォーマンスはともかく見た目的には結構満足しています。 もう少しスマートな方法あったら、改善してみたいです。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
