jQuery-スクロールに合わせて要素を移動させる

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);
    }
}

RELATED POSTS