要素が画面内にあるかどうか判別して、画面内にある場合にのみclassを付与する処理を実装してみます。
サンプルコード
.sample01と.sample02にclassを追加してみます。
HTML
<section class="section"> <div class="sample01"></div> <div class="sample02"></div> </section>
.sample01と.sample02に.is-showというclassが付くと、横移動するようにします。
CSS
.sample01 { position: absolute; top: 1500px; left: 50px; width: 100px; height: 100px; background: #E74C3C; transition: 2000ms; } .sample01.is-show { -webkit-transform: translateX(500px); transform: translateX(500px); } .sample02 { position: absolute; top: 3000px; right: 50px; width: 100px; height: 100px; background: #3498DB; } .sample02.is-show { -webkit-transform: translateX(-500px); transform: translateX(-500px); transition: 2000ms; }
.sample01は.sample01自体にtransitionが設定されているので.is-showが外れた場合にアニメーションで元の位置に戻りますが、.sample02は.is-showが付いた時のみtransitionが設定されるので、.is-showが外れた場合にアニメーションなしで元の位置に戻ります。
対象要素が画面内にあるかどうか判断して、classの付け替えを行う処理を追加します。
JavaScript
$(function() { $(window).on('load scroll', function() { add_class_when_visible($('.sample01')); add_class_when_visible($('.sample02')); }); function add_class_when_visible(target) { // スクロール位置を取得 var scrollTop = $(window).scrollTop(); var scrollBtm = scrollTop + $(window).height(); // 対象要素の位置を取得 var targetTop = target.offset().top; var targetBtm = targetTop + target.height(); // 画面内にある場合 if(scrollBtm > targetTop && scrollTop < targetBtm) { target.addClass('is-show'); } else { target.removeClass('is-show'); } } });
画面内に表示された時に、横にアニメーションで移動するようになりました。
画面内に要素がある場合のみclassを追加するデモページ
プラグイン化
先ほどは関数で処理を行いましたが、プラグイン化してみます。
オプションはとりあえず付与するclass名のみ変更できるようにしています。
プラグイン化した「acv.js」はこちら
acv.js
(function($) { $.fn.acv = function(options) { var elements = this; var defaults = { className: 'is-show' }; var setting = $.extend(defaults, options); $(window).on('load scroll', function() { add_class_when_visible(); }); function add_class_when_visible() { var scrollTop = $(window).scrollTop(); var scrollBtm = scrollTop + $(window).height(); var targetTop = elements.offset().top; var targetBtm = targetTop + elements.height(); if(scrollBtm > targetTop && scrollTop < targetBtm) { elements.addClass(setting.className); } else { elements.removeClass(setting.className); } } } })(jQuery);
以下のようにプラグインの指定を行います。
(HTMLとCSSは先ほどと同じなので省略します。)
JavaScript
$(function() { $('.sample01').acv(); $('.sample02').acv(); });
先ほどと同様の動きが実装できました。
画面内に要素がある場合のみclassを追加するデモページ
コメントが承認されるまで時間がかかります。