スクロールで画面内に要素が表示されたらアニメーションを行う実装をすることがよくあるので、指定した要素が画面内に表示された時にclassを追加するという処理を作ってみます。
サンプルコード
まずはclass付与の関数を作って実装してみます。
HTML
<div class="contents"> <section class="section"> <div class="sample sample1"></div> </section> <section class="section"> <div class="sample sample2"></div> </section> <section class="section"> <div class="sample sample3"></div> </section> </div>
.sampleに.is-showというclassが付くとフェードで表示するようにします。
CSS
.sample {
position: absolute;
top: 500px;
left: 50px;
width: 50px;
height: 50px;
/* アニメーションに必要な部分 */
visibility: hidden;
opacity: 0;
transition: 1500ms;
}
.sample.is-show {
visibility: visible;
opacity: 1;
}
JavaScript
$(window).on('load scroll', function() {
add_class_in_scrolling($('.sample1'));
add_class_in_scrolling($('.sample2'));
add_class_in_scrolling($('.sample3'));
});
// スクロールで要素が表示された時にclassを付与する
function add_class_in_scrolling(target) {
var winScroll = $(window).scrollTop();
var winHeight = $(window).height();
var scrollPos = winScroll + winHeight;
if(target.offset().top < scrollPos) {
target.addClass('is-show');
}
}
ページアクセス時とスクロール時にadd_class_in_scrolling()を実行して、画面内に指定要素がある場合はclassを付与するようにしています。
画面内に要素が表示された時にclassを付与するデモページ
プラグイン化
次に先ほどの処理をプラグイン化してみます。
オプションとして、画面内のどの位置まできたらclassを付与するかと、付与するclass名を設定できるようにしてみます。
プラグイン化した「acs.js」はこちら
acs.js
(function($) {
$.fn.acs = function(options) {
var elements = this;
var defaults = {
screenPos: 0.8,
className: 'is-show'
};
var setting = $.extend(defaults, options);
$(window).on('load scroll', function() {
add_class_in_scrolling();
});
function add_class_in_scrolling() {
var winScroll = $(window).scrollTop();
var winHeight = $(window).height();
var scrollPos = winScroll + (winHeight * setting.screenPos);
if(elements.offset().top < scrollPos) {
elements.addClass(setting.className);
}
}
}
})(jQuery);
screenPosは画面内のどの位置まで要素が来たらclassを付与するかで、0~1の範囲で設定します。
例えば、画面の上下中央でclassを付与したい場合は0.5、画面内に入ったらすぐclassを付与したい場合は1とします。
classNameは付与するclass名を設定します。
acs.jsを読み込んで、以下のように指定します。
JavaScript
$(function() {
$('.sample1').acs();
$('.sample2').acs({
screenPos: 0.4
});
$('.sample3').acs({
className: 'is-show2'
});
});
class名変更の確認用にCSSを追加します。
CSS
.sample.is-show2 {
visibility: visible;
opacity: 1;
transform: translateX(400px);
}
これで.sample2は画面の上から40%の位置でフェード表示、.sample3は右へ移動しながらフェードで表示するようになりました。
プラグイン化のデモページ
コメントが承認されるまで時間がかかります。