Чтобы рассчитать, является ли элемент видимым, вы можете создать такую функцию (кредит здесь https://stackoverflow.com/a/22480938/825240):
function isScrolledIntoView(element) {
var elementTop = element.getBoundingRect().top;
var elementBottom = element.getBoundingRect().bottom;
var isVisible = (elementTop <= window.innerHeight) && (elementBottom >= 0);
return isVisible;
}
Вы можете настроить эту функцию в соответствии с вашей ситуацией, вычислив, если элемент был прочитан:
function isRead(element) {
var elementTop = element.getBoundingRect().top;
var elementBottom = element.getBoundingRect().bottom;
var elementHeight = elementBottom - elementTop;
// if 75% of the document has been scrolled, we'll assume it's been read
var readIfPercentage = 0.75;
// an element has been read if the top has been scrolled up out of view
// and at least 75% of the element is no longer visible
var isRead = (elementTop < 0 && Math.abs(elementTop) / elementHeight >= readIfPercentage);
return isRead;
}
Затем вы можете вызывать функции выше, передавая узел DOM в качестве элемента:
isScrolledIntoView(document.getElementById('targetDiv');
//or
isRead(document.getElementById('targetDiv');
Вы можете связать все это вместе, создав прослушиватель прокрутки (jQuery делает это довольно легко):
function setScrollListener() {
var scrollEventHandler = function() {
if (isRead(document.getElementById('article'))) {
// set article to 'read'
}
}
// on scroll, fire the event handler
$(document).scroll(scrollEventHandler);
}
Стоит отметить, что если вы хотите отменить привязку слушателя прокрутки, скажем, если все статьи были прочитаны и вам больше не нужно слушать прокрутку, вы можете вызвать функцию unbind в scrollEventHandler. Это так же просто, как:
function unbindScrollEventHandler() {
$(document).unbind('scroll', scrollEventHandler);
}