Отследить появление блока при скроллинге можно с помощью события onscroll
, вычисляя его положение методами jQuery scrollTop()
, height()
, outerHeight()
и offset()
.
$(window).scroll(function(){
var wt = $(window).scrollTop();
var wh = $(window).height();
var et = $('элемент').offset().top;
var eh = $('элемент').outerHeight();
var dh = $(document).height();
if (wt + wh >= et || wh + wt == dh || eh + et < wh){
console.log('Элемент показан');
}
});
В середине сайта есть блок <div class="active">...</div>
, как только до него доскролить в нем запускается анимация, но только один раз.
var block_show = false;
function scrollTracking(){
if (block_show) {
return false;
}
var wt = $(window).scrollTop();
var wh = $(window).height();
var et = $('.active').offset().top;
var eh = $('.active').outerHeight();
var dh = $(document).height();
if (wt + wh >= et || wh + wt == dh || eh + et < wh){
block_show = true;
// Код анимации
$('.active div:eq(0)').show('fast', function(){
$(this).next().show('fast', arguments.callee);
});
}
}
$(window).scroll(function(){
scrollTracking();
});
$(document).ready(function(){
scrollTracking();
});
Следующий пример отслеживает появление и пропадание блока из области видимости браузера.
var block_show = null;
function scrollTracking(){
var wt = $(window).scrollTop();
var wh = $(window).height();
var et = $('.active').offset().top;
var eh = $('.active').outerHeight();
if (wt + wh >= et && wt + wh - eh * 2 <= et + (wh - eh)){
if (block_show == null || block_show == false) {
console.log('Блок active в области видимости');
}
block_show = true;
} else {
if (block_show == null || block_show == true) {
console.log('Блок active скрыт');
}
block_show = false;
}
}
$(window).scroll(function(){
scrollTracking();
});
$(document).ready(function(){
scrollTracking();
});
Ещё один пример показывает когда элемент полстью находится в области видимости.
var block_show = null;
function scrollTracking(){
var wt = $(window).scrollTop();
var wh = $(window).height();
var et = $('.active').offset().top;
var eh = $('.active').outerHeight();
if (et >= wt && et + eh <= wh + wt){
if (block_show == null || block_show == false) {
$('#console').html('Блок active полностью виден');
}
block_show = true;
} else {
if (block_show == null || block_show == true) {
$('#console').html('');
}
block_show = false;
}
}
$(window).scroll(function(){
scrollTracking();
});
$(document).ready(function(){
scrollTracking();
});
Определить, виден ли пользователю элемент по определенному событию можно с помощью функций:
Функция is_shown()
возвращает true
, если элемент находится в области просмотра частично или полностью.
function is_shown(target) {
var wt = $(window).scrollTop();
var wh = $(window).height();
var eh = $(target).outerHeight();
var et = $(target).offset().top;
if (wt + wh >= et && wt + wh - eh * 2 <= et + (wh - eh)){
return true;
} else {
return false;
}
}
if (is_shown('.active')) {
console.log(true);
}
Вторая функция возвращает true
, только если элемент полностью виден.