CSSアニメーションとjQueryを使って、スクロールに合わせて要素を移動させる方法です。
CSS3のプロパティtransitionを使っているので、対応はIE10↑になりますが、移動自体はするので(瞬間移動のような感じで)使い道はあるかなぁと。
DEMO
以下のデモをスクロールしてみてください。葉っぱの位置が移動します。
html
動かす要素に.object、更に子要素としてspanに.pos0を付与しています。
子要素にしているのは、動かす要素に対してjsでクラス名を削除する処理をするため、親要素のクラス名で識別する必要があるからです。
8~10行目は動きが分かりやすいように罫線を入れただけなので、削除してOKです。
<p id="interval">スクロール値:0</p> <div id="wrap"> <div class="object"> <span class="pos0"> <img src="http://gimmicklog.main.jp/demo/images/leaf.png" /> </span> </div> <p class="border1">pos1</p> <p class="border2">pos2</p> <p class="border3">pos3</p> </div>
css
.object span のプロパティ transition: all 2s ease;が、葉っぱが移動する時の動きの指定です。
.pos0~.pos3で、葉っぱが移動する位置を4段階で指定しています。
#interval { position:fixed; top:0; right:0; } #wrap { position:relative; height:2000px; } .object span { z-index:10; position:absolute; -webkit-transition: all 2s ease;/*アニメーションの変化*/ -moz-transition: all 2s ease; -o-transition: all 2s ease; -ms-transition: all 2s ease; transition: all 2s ease; } .pos0 { top:0px; left:0px; } .pos1 { top:500px; left:200px; } .pos2 { top:1000px; left:400px; } .pos3 { top:1500px; left:200px; }
jQuery
4行目でスクロールした値を取得し、5行目以降でその値によって要素の位置を指定したクラス名を削除、追加するようにしています。
$(function () { $(window).scroll(function () { $('#interval').text('スクロール値:' + $(this).scrollTop()); var top = $(this).scrollTop(); if (top > 1 && top < 199) { $(".object span").removeClass().addClass('pos0'); } if (top > 200 && top < 599) { $(".object span").removeClass().addClass('pos1'); } if (top > 600 && top < 999) { $(".object span").removeClass().addClass('pos2'); } if (top > 1000 && top < 2000) { $(".object span").removeClass().addClass('pos3'); } }); });
CSS(要素が揺れるアニメーションとボーダー)
以下のCSSはボーダーと葉っぱの揺れを指定したものです。これがなくても動きます。
.border1, .border2, .border3 { border-top:1px #ccc solid; position:absolute; width:100%; } .border1 { z-index:1; top:500px; } .border2 { z-index:2; top:1000px; } .border3 { z-index:3; top:1500px; } /* スイングアニメーション */ .object span { -webkit-transform-origin: top center; transform-origin: top center; -webkit-animation-name: swing; animation-name: swing; -webkit-animation-duration: 2s; animation-duration: 2s; -webkit-animation-fill-mode: both; animation-fill-mode: both; animation-iteration-count:infinite; -webkit-animation-iteration-count:infinite; } @-webkit-keyframes swing { 20%, 40%, 60%, 80%, 100% { -webkit-transform-origin: top center; } 20% { -webkit-transform: rotate(15deg); } 40% { -webkit-transform: rotate(-10deg); } 60% { -webkit-transform: rotate(5deg); } 80% { -webkit-transform: rotate(-5deg); } 100% { -webkit-transform: rotate(0deg); } } @keyframes swing { 20% { transform: rotate(15deg); } 40% { transform: rotate(-10deg); } 60% { transform: rotate(5deg); } 80% { transform: rotate(-5deg); } 100% { transform: rotate(0deg); } }